Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 18 Sep 2005 17:06:22 -0400 (EDT)
From:      "Mikhail T." <mi@aldan.algebra.com>
To:        FreeBSD-gnats-submit@FreeBSD.org
Subject:   ports/86310: all-depends-list target of bsd.port.mk is buggy
Message-ID:  <200509182106.j8IL6Mkp013761@blue.virtual-estates.net>
Resent-Message-ID: <200509182110.j8ILA1U9012238@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         86310
>Category:       ports
>Synopsis:       all-depends-list target of bsd.port.mk is buggy
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sun Sep 18 21:10:00 GMT 2005
>Closed-Date:
>Last-Modified:
>Originator:     Mikhail T.
>Release:        FreeBSD 6.0-BETA4 amd64
>Organization:
Virtual Estates, Inc.
>Environment:
System: FreeBSD blue.virtual-estates.net 6.0-BETA4 FreeBSD 6.0-BETA4 #0: Mon Sep 12 19:48:18 EDT 2005 mi@blue.virtual-estates.net:/var/obj/var/src/sys/SILVER amd64

>Description:
	The all-depends-list target in bsd.port.mk is inefficient and
	error-prone. Depending on circumstances, it may, for example,
	fail to add teTeX to the list (because teTeX-base is usually
	visited first).

	It can also fail due to a very long (or circular) list of
	dependencies, and even when successful will use a lot of stack
	invoking make recursively.

	Similar targets (like package-depends-list) have the same
	problem.

>How-To-Repeat:

	Try `cd /usr/ports/x11/kde3; time make all-depends-list'. While
	it is running, try `ps -ax | fgrep -c make'.

>Fix:
	The patch below fixes only all-depends-list for now. I may be
	able to fix others too. It also helps find, which dependant
	directories had errors (such as unresolved RCS-merges).

	I posted this patch to ports@ and nobody objected (predictably).
	I also rebuilt my own machine with it -- everything built.

--- bsd.port.mk	28 Aug 2005 18:47:56 -0000	1.516
+++ bsd.port.mk	18 Sep 2005 21:02:50 -0000
@@ -4464,23 +4470,40 @@
 # Dependency lists: both build and runtime, recursive.  Print out directory names.
 
+_DEPENDS=${EXTRACT_DEPENDS} ${PATCH_DEPENDS} ${FETCH_DEPENDS} ${BUILD_DEPENDS} ${LIB_DEPENDS} ${RUN_DEPENDS}
+_DEPEND_DIRS=	${_DEPENDS:C,^[^:]*:([^:]*),\1,} ${DEPENDS:C,:.*,,}
+
 all-depends-list:
-.if defined(EXTRACT_DEPENDS) || defined(PATCH_DEPENDS) || defined(FETCH_DEPENDS) || defined(BUILD_DEPENDS) || defined(LIB_DEPENDS) || defined(RUN_DEPENDS) || defined(DEPENDS)
 	@${ALL-DEPENDS-LIST}
-.endif
 
 ALL-DEPENDS-LIST= \
-	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 \
-		if [ -d $$dir ]; then \
-			if (${ECHO_CMD} $$checked | ${GREP} -qwv "$$dir"); then \
-				child=$$(cd $$dir; ${MAKE} PARENT_CHECKED="$$checked" all-depends-list); \
-				for d in $$child; do ${ECHO_CMD} $$d; done; \
-				${ECHO_CMD} $$dir; \
-				checked="$$dir $$child $$checked"; \
-			fi; \
-		else \
-			${ECHO_MSG} "${PKGNAME}: \"$$dir\" non-existent -- dependency list incomplete" >&2; \
-		fi; \
-	done | ${SORT} -u
+	L="${_DEPEND_DIRS}";						\
+	checked="";							\
+	while [ -n "$$L" ]; do						\
+		l="";							\
+		for d in $$L; do					\
+			case $$checked in				\
+			$$d\ *|*\ $$d\ *|*\ $$d)			\
+				continue;;				\
+			esac;						\
+			checked="$$checked $$d";			\
+			if [ ! -d $$d ]; then				\
+				${ECHO_MSG} "${PKGNAME}: \"$$d\" non-existent -- dependency list incomplete" >&2; \
+				continue;				\
+			fi;						\
+			${ECHO_CMD} $$d;				\
+			if ! children=$$(${MAKE} -C $$d -V _DEPEND_DIRS); then\
+				${ECHO_MSG} "${PKGNAME}: \"$$d\" erroneous -- dependency list incomplete" >&2; \
+				continue;				\
+			fi;						\
+			for child in $$children; do			\
+				case "$$checked $$l" in			\
+				$$child\ *|*\ $$child\ *|*\ $$child)	\
+					continue;;			\
+				esac;					\
+				l="$$l $$child";			\
+			done;						\
+		done;							\
+		L=$$l;							\
+	done
 
 .if !target(clean-depends)
>Release-Note:
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200509182106.j8IL6Mkp013761>