ports/65804: [PATCH] bsd.port.mk is gratuitously slow
Brian Feldman
green at FreeBSD.org
Tue Apr 20 03:10:18 UTC 2004
>Number: 65804
>Category: ports
>Synopsis: [PATCH] bsd.port.mk is gratuitously slow
>Confidential: no
>Severity: non-critical
>Priority: medium
>Responsible: freebsd-ports-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: change-request
>Submitter-Id: current-users
>Arrival-Date: Mon Apr 19 20:10:17 PDT 2004
>Closed-Date:
>Last-Modified:
>Originator: Brian Feldman
>Release: FreeBSD 5.2-CURRENT i386
>Organization:
FreeBSD
>Environment:
System: FreeBSD green.homeunix.org 5.2-CURRENT FreeBSD 5.2-CURRENT #3: Mon Apr 12 23:37:56 EDT 2004 green at green.homeunix.org:/usr/src/sys/i386/compile/GREEN i386
>Description:
In bsd.port.mk there are many gratuitously-used external programs.
See examples for typical speed increases (percentage-wise).
>How-To-Repeat:
old kde3 make all-depends-list:
1.309u 6.555s 0:08.20 95.7% 137+481k 0+0io 0pf+0w
new kde3 make all-depends-list:
1.206u 4.032s 0:05.58 93.7% 167+444k 0+0io 0pf+0w
old vim make checksum:
3.014u 38.038s 0:44.34 92.5% 90+231k 0+0io 0pf+0w
new vim make checksum:
2.357u 30.010s 0:34.68 93.3% 94+233k 0+0io 0pf+0w
>Fix:
Index: bsd.port.mk
===================================================================
RCS file: /usr/ncvs/ports/Mk/bsd.port.mk,v
retrieving revision 1.488
diff -u -r1.488 bsd.port.mk
--- bsd.port.mk 19 Apr 2004 23:39:52 -0000 1.488
+++ bsd.port.mk 20 Apr 2004 02:52:25 -0000
@@ -2814,16 +2814,16 @@
file=`${ECHO_CMD} $$_file | ${SED} -E -e 's/:[^:]+$$//'` ; \
select=`${ECHO_CMD} $${_file#$${file}} | ${SED} -e 's/^://' -e 's/,/ /g'` ; \
force_fetch=false; \
- filebasename=`${BASENAME} $$file`; \
+ filebasename=$${file##*/}; \
for afile in ${FORCE_FETCH}; do \
- afile=`${BASENAME} $$afile`; \
+ afile=$${afile##*/}; \
if [ "x$$afile" = "x$$filebasename" ]; then \
force_fetch=true; \
fi; \
done; \
if [ ! -f $$file -a ! -f $$filebasename -o "$$force_fetch" = "true" ]; then \
DIR=${DIST_SUBDIR}; \
- pattern="$${DIR:+$$DIR/}`${ECHO_CMD} $$file | ${SED} -e 's/\./\\\\./g'`"; \
+ pattern="$${DIR:+$$DIR/}`${ECHO_CMD} $$file | ${SED} -e 's:[./]:\\\\&:g'`"; \
if [ -L $$file -o -L $$filebasename ]; then \
${ECHO_MSG} ">> ${_DISTDIR}/$$file is a broken symlink."; \
${ECHO_MSG} ">> Perhaps a filesystem (most likely a CD) isn't mounted?"; \
@@ -2859,7 +2859,7 @@
for site in `eval $$SORTED_MASTER_SITES_CMD_TMP ${_RANDOMIZE_SITES}`; do \
${ECHO_MSG} ">> Attempting to fetch from $${site}."; \
DIR=${DIST_SUBDIR}; \
- CKSIZE=`${GREP} "^SIZE ($${DIR:+$$DIR/}$$file)" ${MD5_FILE} | ${AWK} '{print $$4}'`; \
+ CKSIZE=`${AWK} "/^SIZE \($${DIR:+$$DIR/}$$file\)"'{print $$4}' < ${MD5_FILE}`; \
case $${file} in \
*/*) ${MKDIR} $${file%/*}; \
args="-o $${file} $${site}$${file}";; \
@@ -2881,15 +2881,15 @@
file=`${ECHO_CMD} $$_file | ${SED} -E -e 's/:[^:]+$$//'` ; \
select=`${ECHO_CMD} $${_file#$${file}} | ${SED} -e 's/^://' -e 's/,/ /g'` ; \
force_fetch=false; \
- filebasename=`${BASENAME} $$file`; \
+ filebasename=$${file##*/}; \
for afile in ${FORCE_FETCH}; do \
- afile=`${BASENAME} $$afile`; \
+ afile=$${afile##*/}; \
if [ "x$$afile" = "x$$filebasename" ]; then \
force_fetch=true; \
fi; \
done; \
if [ ! -f $$file -a ! -f $$filebasename -o "$$force_fetch" = "true" ]; then \
- if [ -L $$file -o -L `${BASENAME} $$file` ]; then \
+ if [ -L $$file -o -L $${file##*/} ]; then \
${ECHO_MSG} ">> ${_DISTDIR}/$$file is a broken symlink."; \
${ECHO_MSG} ">> Perhaps a filesystem (most likely a CD) isn't mounted?"; \
${ECHO_MSG} ">> Please correct this problem and try again."; \
@@ -2912,8 +2912,8 @@
for site in `eval $$SORTED_PATCH_SITES_CMD_TMP`; do \
${ECHO_MSG} ">> Attempting to fetch from $${site}."; \
DIR=${DIST_SUBDIR}; \
- pattern="$${DIR:+$$DIR/}`${ECHO_CMD} $$file | ${SED} -e 's/\./\\\\./g'`"; \
- CKSIZE=`${GREP} "^SIZE ($$pattern)" ${MD5_FILE} | ${AWK} '{print $$4}'`; \
+ pattern="$${DIR:+$$DIR/}`${ECHO_CMD} $$file | ${SED} -e 's:[./]:\\\\&:g'`"; \
+ CKSIZE=`${AWK} "/^SIZE \($$pattern\)"'{print $$4}' < ${MD5_FILE}`; \
case $${file} in \
*/*) ${MKDIR} $${file%/*}; \
args="-o $${file} $${site}$${file}";; \
@@ -3787,7 +3787,7 @@
for _file in ${DISTFILES}; do \
file=`${ECHO_CMD} $$_file | ${SED} -E -e 's/:[^:]+$$//'` ; \
select=`${ECHO_CMD} $${_file#$${file}} | ${SED} -e 's/^://' -e 's/,/ /g'` ; \
- if [ ! -f $$file -a ! -f `${BASENAME} $$file` ]; then \
+ if [ ! -f $$file -a ! -f $${file##*/} ]; then \
if [ ! -z "$$select" ] ; then \
__MASTER_SITES_TMP= ; \
for group in $$select; do \
@@ -3803,7 +3803,7 @@
fi ; \
for site in `eval $$SORTED_MASTER_SITES_CMD_TMP ${_RANDOMIZE_SITES}`; do \
DIR=${DIST_SUBDIR}; \
- CKSIZE=`${GREP} "^SIZE ($${DIR:+$$DIR/}$$file)" ${MD5_FILE} | ${AWK} '{print $$4}'`; \
+ CKSIZE=`${AWK} "/^SIZE \($${DIR:+$$DIR/}$$file\)/"'{print $$4}' < ${MD5_FILE}`; \
case $${file} in \
*/*) args="-o $${file} $${site}$${file}";; \
*) args=$${site}$${file};; \
@@ -3819,7 +3819,7 @@
for _file in ${PATCHFILES}; do \
file=`${ECHO_CMD} $$_file | ${SED} -E -e 's/:[^:]+$$//'` ; \
select=`${ECHO_CMD} $${_file#$${file}} | ${SED} -e 's/^://' -e 's/,/ /g'` ; \
- if [ ! -f $$file -a ! -f `${BASENAME} $$file` ]; then \
+ if [ ! -f $$file -a ! -f $${file##*/} ]; then \
if [ ! -z "$$select" ] ; then \
__PATCH_SITES_TMP= ; \
for group in $$select; do \
@@ -3835,7 +3835,7 @@
fi ; \
for site in `eval $$SORTED_PATCH_SITES_CMD_TMP ${_RANDOMIZE_SITES}`; do \
DIR=${DIST_SUBDIR}; \
- CKSIZE=`${GREP} "^SIZE ($${DIR:+$$DIR/}$$file)" ${MD5_FILE} | ${AWK} '{print $$4}'`; \
+ CKSIZE=`${AWK} "/^SIZE \($${DIR:+$$DIR/}$$file\)/"'{print $$4}' < ${MD5_FILE}`; \
case $${file} in \
*/*) args="-o $${file} $${site}$${file}";; \
*) args=$${site}$${file};; \
@@ -3886,9 +3886,9 @@
@if [ -f ${MD5_FILE} ]; then \
(cd ${DISTDIR}; OK=""; \
for file in ${_CKSUMFILES}; do \
- pattern="`${ECHO_CMD} $$file | ${SED} -e 's/\./\\\\./g'`"; \
+ pattern="`${ECHO_CMD} $$file | ${SED} -e 's:[./]:\\\\&:g'`"; \
CKSUM=`${MD5} < $$file`; \
- CKSUM2=`${GREP} "^MD5 ($$pattern)" ${MD5_FILE} | ${AWK} '{print $$4}'`; \
+ CKSUM2=`${AWK} "/^MD5 \($$pattern\)/"'{print $$4}' < ${MD5_FILE}`; \
if [ -z "$$CKSUM2" ]; then \
${ECHO_MSG} ">> No checksum recorded for $$file."; \
OK="false"; \
@@ -3914,8 +3914,8 @@
fi; \
done; \
for file in ${_IGNOREFILES}; do \
- pattern="`${ECHO_CMD} $$file | ${SED} -e 's/\./\\\\./g'`"; \
- CKSUM2=`${GREP} "($$pattern)" ${MD5_FILE} | ${AWK} '{if(NR<2)print $$4}'`; \
+ pattern="`${ECHO_CMD} $$file | ${SED} -e 's:[./]:\\\\.:g'`"; \
+ CKSUM2=`${AWK} "/\($$pattern\)/"'{if(NR<2)print $$4}' < ${MD5_FILE}`; \
if [ "$$CKSUM2" = "" ]; then \
${ECHO_MSG} ">> No checksum recorded for $$file, file is in "'$$'"{IGNOREFILES} list."; \
OK="false"; \
@@ -3928,9 +3928,9 @@
if [ "$${OK:=true}" = "retry" ] && [ ${FETCH_REGET} -gt 0 ]; then \
${ECHO_MSG} "===> Refetch for ${FETCH_REGET} more times files: $$refetchlist"; \
if ( cd ${.CURDIR} && \
- ${MAKE} ${.MAKEFLAGS} FORCE_FETCH="$$refetchlist" FETCH_REGET="`expr ${FETCH_REGET} - 1`" fetch); then \
+ ${MAKE} ${.MAKEFLAGS} FORCE_FETCH="$$refetchlist" FETCH_REGET="`${EXPR} ${FETCH_REGET} - 1`" fetch); then \
if ( cd ${.CURDIR} && \
- ${MAKE} ${.MAKEFLAGS} FETCH_REGET="`expr ${FETCH_REGET} - 1`" checksum ); then \
+ ${MAKE} ${.MAKEFLAGS} FETCH_REGET="`${EXPR} ${FETCH_REGET} - 1`" checksum ); then \
OK="true"; \
fi; \
fi; \
@@ -4001,11 +4001,11 @@
.if defined(${deptype}_DEPENDS)
.if !defined(NO_DEPENDS)
@for i in ${${deptype}_DEPENDS}; do \
- prog=`${ECHO_CMD} $$i | ${SED} -e 's/:.*//'`; \
- dir=`${ECHO_CMD} $$i | ${SED} -e 's/[^:]*://'`; \
+ prog=$${i%%:*}; \
+ dir=$${i##*:}; \
if ${EXPR} "$$dir" : '.*:' > /dev/null; then \
- target=`${ECHO_CMD} $$dir | ${SED} -e 's/.*://'`; \
- dir=`${ECHO_CMD} $$dir | ${SED} -e 's/:.*//'`; \
+ target=$${dir##*:}; \
+ dir=$${dir%%:*}; \
else \
target="${DEPENDS_TARGET}"; \
depends_args="${DEPENDS_ARGS}"; \
@@ -4129,8 +4129,8 @@
.if !defined(NO_DEPENDS)
@for dir in ${DEPENDS}; do \
if ${EXPR} "$$dir" : '.*:' > /dev/null; then \
- target=`${ECHO_CMD} $$dir | ${SED} -e 's/.*://'`; \
- dir=`${ECHO_CMD} $$dir | ${SED} -e 's/:.*//'`; \
+ target=$${dir##*:}; \
+ dir=$${dir%%:*}; \
else \
target="${DEPENDS_TARGET}"; \
depends_args="${DEPENDS_ARGS}"; \
@@ -4159,10 +4159,12 @@
.endif
ALL-DEPENDS-LIST= \
+ hasword() { w=$$1; shift; while [ $$\# -gt 0 ]; do [ "X$$w" = "X$$1" ] && return 0; shift; done; return 1; }; \
checked="${PARENT_CHECKED}"; \
- for dir in $$(${ECHO_CMD} "${EXTRACT_DEPENDS} ${PATCH_DEPENDS} ${FETCH_DEPENDS} ${BUILD_DEPENDS} ${LIB_DEPENDS} ${RUN_DEPENDS}" | ${SED} -e 'y/ /\n/' | ${CUT} -f 2 -d ':') $$(${ECHO_CMD} ${DEPENDS} | ${SED} -e 'y/ /\n/' | ${CUT} -f 1 -d ':'); do \
+ for i in ${EXTRACT_DEPENDS} ${PATCH_DEPENDS} ${FETCH_DEPENDS} ${BUILD_DEPENDS} ${LIB_DEPENDS} ${RUN_DEPENDS}; do j="$${i\#*:}"; dirs="$$dirs $${j%%:*}"; done; for i in ${DEPENDS}; do dirs="$$dirs $${i\#\#*:}"; done; \
+ for dir in $$dirs; do \
if [ -d $$dir ]; then \
- if (${ECHO_CMD} $$checked | ${GREP} -qwv "$$dir"); then \
+ if ! hasword $$dir $$checked; then \
child=$$(cd $$dir; ${MAKE} PARENT_CHECKED="$$checked" run-depends-list); \
for d in $$child; do ${ECHO_CMD} $$d; done; \
${ECHO_CMD} $$dir; \
@@ -4289,7 +4291,9 @@
.endif
RUN-DEPENDS-LIST= \
- for dir in $$(${ECHO_CMD} "${LIB_DEPENDS} ${RUN_DEPENDS}" | ${SED} -e 'y/ /\n/' | ${CUT} -f 2 -d ':' | sort -u) $$(${ECHO_CMD} ${DEPENDS} | ${SED} -e 'y/ /\n/' | ${CUT} -f 1 -d ':' | sort -u); do \
+ hasword() { w=$$1; shift; while [ $$\# -gt 0 ]; do [ "X$$w" = "X$$1" ] && return 0; shift; done; return 1; }; \
+ for i in ${LIB_DEPENDS} ${RUN_DEPENDS}; do j="$${i\#*:}"; dirs="$$dirs $${j%%:*}"; done; for i in ${DEPENDS}; do dirs="$$dirs $${i\#\#*:}"; done; \
+ for dir in $$dirs; do \
if [ -d $$dir ]; then \
${ECHO_CMD} $$dir; \
else \
@@ -4306,6 +4310,7 @@
.endif
PACKAGE-DEPENDS-LIST?= \
+ hasword() { w=$$1; shift; while [ $$\# -gt 0 ]; do [ "X$$w" = "X$$1" ] && return 0; shift; done; return 1; }; \
if [ "${CHILD_DEPENDS}" ]; then \
installed=$$(${PKG_INFO} -qO ${PKGORIGIN} 2>/dev/null || \
${TRUE}); \
@@ -4320,7 +4325,8 @@
done; \
fi; \
checked="${PARENT_CHECKED}"; \
- for dir in $$(${ECHO_CMD} "${LIB_DEPENDS} ${RUN_DEPENDS}" | ${SED} -e 'y/ /\n/' | ${CUT} -f 2 -d ':') $$(${ECHO_CMD} ${DEPENDS} | ${SED} -e 'y/ /\n/' | ${CUT} -f 1 -d ':'); do \
+ for i in ${LIB_DEPENDS} ${RUN_DEPENDS}; do j="$${i\#*:}"; dirs="$$dirs $${j%%:*}"; done; for i in ${DEPENDS}; do dirs="$$dirs $${i\#\#*:}"; done; \
+ for dir in $$dirs; do \
dir=$$(${REALPATH} $$dir); \
if [ -d $$dir ]; then \
if (${ECHO_CMD} $$checked | ${GREP} -qwv "$$dir"); then \
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-ports-bugs
mailing list