ports/114167: ignoring major numbers in LIB_DEPENDS (patch)

Mikhail T. mi at aldan.algebra.com
Sat Jun 30 18:30:02 UTC 2007


>Number:         114167
>Category:       ports
>Synopsis:       ignoring major numbers in LIB_DEPENDS (patch)
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Sat Jun 30 18:30:02 GMT 2007
>Closed-Date:
>Last-Modified:
>Originator:     Mikhail T.
>Release:        FreeBSD 6.2-STABLE amd64
>Organization:
Virtual Estates, Inc.
>Environment:
System: FreeBSD aldan.algebra.com 6.2-STABLE FreeBSD 6.2-STABLE #1: Thu Jun 7 22:11:33 EDT 2007 mi at aldan.algebra.com:/meow/obj/var/src/sys/SILVER-SMP amd64

>Description:

	Although specifying the major number of the shared library in
	a port's LIB_DEPENDS is neither mandatory nor needed in most
	circumstances, the practice is wide-spread. It is very rare,
	that a particular version is required.

	When a dependency-installed shlib changes, all dependants
	simply update their LIB_DEPENDS lines in a flurry of "chasing
	libfoo's major number" commits.

	A more important problem is one faced by people with already
	built/configured computers. Consider, for example, somebody,
	who has just built the entire KDE desktop.

	Three days later they may decide to add the Firefox browser,
	so they update their ports tree as advised (to get the latest
	version and security patches) and proceed.

	If, however, any of the ports used by both Firefox and KDE
	(such as the entire glib, JPEG, PNG, etc.) were updated during
	these few days, building firefox will fail, because firefox will
	require the new version of JPEG's (or PNG's, etc.) shared
	library, which will conflict with the one already installed.

	The person will then be faced with two rather poor options.
	Either rebuild the entire KDE, or use portupgrade to push
	the older version of libjpeg in the /usr/local/lib/compat/pkg.

	If neither the Firefox nor the already present KDE require
	whatever feature, that caused the JPEG (or PNG, etc.) library
	bump, the BEST solution is to make the new port (Firefox in
	this example) use the already present version of libjpeg,
	whatever it might be.

	The patch below makes it possible to tell bsd.port.mk to
	IGNORE the explicit major library numbers in all LIB_DEPENDS
	lines by defining a special IGNORE_SHLIB_NUMBERS knob to
	anything other than "no".

	The patch also changes bsd.port.mk to be stricter in its
	parsing the available inventory of shared library and to report
	the exact locations of the matching libraries.

	Adding the patch will not affect clean installs and it has
	no effect, unles the IGNORE_SHLIB_NUMBERS knob is set.

	Once the change is committed, make.conf(4) manual page can
	be updated to document the knob explaining its usual benefits
	and the occasional danger in those few cases, where the
	major number is, actually, important.

>How-To-Repeat:

>Fix:

Index: bsd.port.mk
===================================================================
RCS file: /home/pcvs/ports/Mk/bsd.port.mk,v
retrieving revision 1.572
diff -U4 -r1.572 bsd.port.mk
--- bsd.port.mk	28 Jun 2007 16:06:02 -0000	1.572
+++ bsd.port.mk	30 Jun 2007 01:02:44 -0000
@@ -5125,13 +5134,17 @@
 lib-depends:
 .if defined(LIB_DEPENDS) && !defined(NO_DEPENDS)
 	@for i in ${LIB_DEPENDS}; do \
 		lib=$${i%%:*}; \
-		case $$lib in \
-			*.*.*)	pattern="`${ECHO_CMD} $$lib | ${SED} -e 's/\./\\\\./g'`" ;;\
-			*.*)	pattern="$${lib%%.*}\.$${lib#*.}" ;;\
-			*)	pattern="$$lib" ;;\
-		esac; \
+		if [ -n "${IGNORE_SHLIB_NUMBERS}" -a "${IGNORE_SHLIB_NUMBERS:L}" != "no" ]; then	\
+			pattern="$${lib%%.*}\."; \
+		else	\
+			case $$lib in \
+				*.*.*)	pattern="`${ECHO_CMD} $$lib | ${SED} -e 's/\./\\\\./g'`$$" ;;\
+				*.*)	pattern="$${lib%%.*}\.$${lib#*.}$$" ;;\
+				*)	pattern="$$lib\." ;;\
+			esac; \
+		fi;	\
 		dir=$${i#*:}; \
 		target=$${i##*:}; \
 		if ${TEST} $$dir = $$target; then \
 			target="${DEPENDS_TARGET}"; \
@@ -5140,10 +5153,12 @@
 			dir=$${dir%%:*}; \
 		fi; \
 		if [ -z "${DESTDIR}" ] ; then \
 			${ECHO_MSG} -n "===>   ${PKGNAME} depends on shared library: $$lib"; \
-			if ${LDCONFIG} -r | ${GREP} -vwF -e "${PKGCOMPATDIR}" | ${GREP} -qwE -e "-l$$pattern"; then \
-				${ECHO_MSG} " - found"; \
+			found=`${LDCONFIG} -r | ${AWK} -v skip="^${PKGCOMPATDIR:C,/+$,,}/" -v pat=":-l$$pattern" 	\
+				'$$NF ~ skip {next} $$1 ~ pat { print $$NF; exit }'`;	\
+			if [ -n "$$found" ] ; then	\
+				${ECHO_MSG} " - found ($$found)"; \
 				if [ ${_DEPEND_ALWAYS} = 1 ]; then \
 					${ECHO_MSG} "       (but building it anyway)"; \
 					notfound=1; \
 				else \
@@ -5173,11 +5188,15 @@
 			if [ ! -d "$$dir" ]; then \
 				${ECHO_MSG} "     => No directory for $$lib.  Skipping.."; \
 			else \
 				${_INSTALL_DEPENDS} \
-				if ! ${LDCONFIG} -r | ${GREP} -vwF -e "${PKGCOMPATDIR}" | ${GREP} -qwE -e "-l$$pattern"; then \
-					${ECHO_MSG} "Error: shared library \"$$lib\" does not exist"; \
-					${FALSE}; \
+				found=`${LDCONFIG} -r | ${AWK} -v skip="^${PKGCOMPATDIR:C,/+$,,}/" -v pat=":-l$$pattern" 	\
+					'$$NF ~ skip {next} $$1 ~ pat { print $$NF; exit }'`;	\
+				if [ -z "$$found" ] ; then	\
+					${ECHO_MSG} "Error: shared library \"$$lib\" was not installed"; \
+					exit 1; \
+				else	\
+					${ECHO_MSG} "Shared library \"$$lib\" duly installed ($$found)"; \
 				fi; \
 			fi; \
 		fi; \
 	done
>Release-Note:
>Audit-Trail:
>Unformatted:



More information about the freebsd-ports-bugs mailing list