portsperf (bsd.port.mk performance bugs fixed) redux

Brian Fundakowski Feldman green at FreeBSD.org
Thu Feb 17 12:59:16 PST 2005


Well, guys, it's been a while since the last installment of portsperf.
Without further ado, here's a fix that bring port vulnerability check
time down from almost two minutes to almost instantaneous (on my
machine)!  I was always wondering why ports have been so terribly slow
since around some time last year, and a good 2000 pids get recycled
just doing "make extract":
 <@green_> now:
 <@green_> green# time make extract
 <@green_> ===>  Extracting for mp3gain-1.3.2
 <@green_> => Checksum OK for mp3gain132_src.zip.
 <@green_> ===>   mp3gain-1.3.2 depends on executable: unzip - found
 <@green_> 0.127u 1.132s 0:01.49 83.8%     108+497k 15+0io 8pf+0w

 <@green_> then:
 <@green_> green# time make extract
 <@green_> ===>  Extracting for mp3gain-1.3.2
 <@green_> => Checksum OK for mp3gain132_src.zip.
 <@green_> ===>   mp3gain-1.3.2 depends on executable: unzip - found
 <@green_> 5.308u 82.765s 1:42.05 86.2%    92+193k 10+0io 12pf+0w

Only problem I know of is that on systems with a good enough version
of the pkg_* tools, an obsolete and broken version (specifically, on
6.0, a version from a year ago) never reports itself as being obsolete
so it can get removed.  The pkg_version -T functionality is broken,
then, without a hint to the operator that intervention must occur.
Is that why this change hasn't been made already?

-- 
Brian Fundakowski Feldman                           \'[ FreeBSD ]''''''''''\
  <> green at FreeBSD.org                               \  The Power to Serve! \
 Opinions expressed are my own.                       \,,,,,,,,,,,,,,,,,,,,,,\
-------------- next part --------------
Index: bsd.port.mk
===================================================================
RCS file: /usr/ncvs/ports/Mk/bsd.port.mk,v
retrieving revision 1.509
diff -u -r1.509 bsd.port.mk
--- bsd.port.mk	9 Feb 2005 09:07:37 -0000	1.509
+++ bsd.port.mk	17 Feb 2005 20:37:17 -0000
@@ -3009,14 +3009,18 @@
 		if [ "$$audit_created" -lt "$$audit_expiry" ]; then \
 			${ECHO_MSG} "===>  WARNING: Vulnerability database out of date, checking anyway"; \
 		fi; \
-		vlist=`${_EXTRACT_AUDITFILE} | ${GREP} "${PORTNAME}" | \
-			${AWK} -F\| ' /^[^#]/ { \
-				if (!system("${PKG_VERSION} -T \"${PKGNAME}\" \"" $$1 "\"")) \
-					print "=> " $$3 ".\n   Reference: <" $$2 ">" \
-			} \
-		'`; \
-		if [ -n "$$vlist" ]; then \
+		nvuln=`${_EXTRACT_AUDITFILE} | \
+			${AWK} -F\| '/^[^#]/ { print $$1; }' | \
+			${PKG_VERSION} -T "${PKGNAME}" - | \
+			wc -l`; \
+		if [ $$nvuln -ne 0 ]; then \
 			${ECHO_MSG} "===>  ${PKGNAME} has known vulnerabilities:"; \
+			vlist=`${_EXTRACT_AUDITFILE} | ${GREP} "${PORTNAME}" | \
+				${AWK} -F\| ' /^[^#]/ { \
+					if (!system("${PKG_VERSION} -T \"${PKGNAME}\" \"" $$1 "\"")) \
+						print "=> " $$3 ".\n   Reference: <" $$2 ">" \
+				} \
+			'`; \
 			${ECHO_MSG} "$$vlist"; \
 			${ECHO_MSG} "=> Please update your ports tree and try again."; \
 			exit 1; \
@@ -3039,16 +3043,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="`${ECHO_CMD} $${DIR:+$$DIR/}$$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?"; \
@@ -3084,7 +3088,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/{if ($$2 == "'"($${DIR:+$$DIR/}$$file)"'") {print $$4}}' < ${MD5_FILE}`; \
 				case $${file} in \
 				*/*)	${MKDIR} $${file%/*}; \
 						args="-o $${file} $${site}$${file}";; \
@@ -3106,15 +3110,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."; \
@@ -3137,8 +3141,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="`${ECHO_CMD} $${DIR:+$$DIR\\/}$$file | ${SED} -e 's:[./+]:\\\\&:g'`"; \
+				CKSIZE=`${AWK} "/^SIZE \($$pattern\)/"'{print $$4}' < ${MD5_FILE}`; \
 				case $${file} in \
 				*/*)	${MKDIR} $${file%/*}; \
 						args="-o $${file} $${site}$${file}";; \
@@ -4002,7 +4006,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 \
@@ -4018,7 +4022,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/{if ($$2 == "'"($${DIR:+$$DIR/}$$file)"'") {print $$4}}' < ${MD5_FILE}`; \
 				case $${file} in \
 				*/*)	args="-o $${file} $${site}$${file}";; \
 				*)		args=$${site}$${file};; \
@@ -4034,7 +4038,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 \
@@ -4050,7 +4054,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/{if ($$2 == "'"($${DIR:+$$DIR/}$$file)"'") {print $$4}}' < ${MD5_FILE}`; \
 				case $${file} in \
 				*/*)	args="-o $${file} $${site}$${file}";; \
 				*)		args=$${site}$${file};; \
@@ -4101,9 +4105,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"; \
@@ -4129,8 +4133,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\)/"'{print $$4;exit}' < ${MD5_FILE}`; \
 			if [ "$$CKSUM2" = "" ]; then \
 				${ECHO_MSG} "=> No checksum recorded for $$file, file is in "'$$'"{IGNOREFILES} list."; \
 				OK="false"; \
@@ -4216,11 +4220,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}"; \
@@ -4344,8 +4348,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}"; \
@@ -4374,10 +4378,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" all-depends-list); \
 				for d in $$child; do ${ECHO_CMD} $$d; done; \
 				${ECHO_CMD} $$dir; \
@@ -4521,6 +4527,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}); \
@@ -4535,10 +4542,11 @@
 		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 \
+			if ! hasword $$dir $$checked; then \
 				childout=$$(cd $$dir; ${MAKE} CHILD_DEPENDS=yes PARENT_CHECKED="$$checked" package-depends-list); \
 				set -- $$childout; \
 				childdir=""; \


More information about the freebsd-ports mailing list