Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 29 Aug 2016 15:23:53 +0000 (UTC)
From:      Mathieu Arnold <mat@FreeBSD.org>
To:        ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org
Subject:   svn commit: r421068 - in head/Mk: . Scripts
Message-ID:  <201608291523.u7TFNra5079490@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mat
Date: Mon Aug 29 15:23:52 2016
New Revision: 421068
URL: https://svnweb.freebsd.org/changeset/ports/421068

Log:
  Add a stage-qa check to check for the existence of SONAME in .so's.
  
  If a port provides .so.X files, they have to have a SONAME for them to
  work correctly.
  
  While there, incorporate a reverse soname checks in proxydeps.
  A port that needs a .so.X from another port which does not have a
  SONAME.
  
  Reviewed by:	bapt
  Sponsored by:	Absolight
  Differential Revision:	https://reviews.freebsd.org/D7454

Modified:
  head/Mk/Scripts/qa.sh   (contents, props changed)
  head/Mk/bsd.port.mk   (contents, props changed)

Modified: head/Mk/Scripts/qa.sh
==============================================================================
--- head/Mk/Scripts/qa.sh	Mon Aug 29 15:07:48 2016	(r421067)
+++ head/Mk/Scripts/qa.sh	Mon Aug 29 15:23:52 2016	(r421068)
@@ -627,11 +627,21 @@ proxydeps() {
 			# No results presents a blank line from heredoc.
 			[ -z "${dep_file}" ] && continue
 			dep_file=$(subst_dep_file ${dep_file})
+			# Skip files we already checked.
 			if listcontains ${dep_file} "${already}"; then
 				continue
 			fi
 			if $(pkg which -q ${dep_file} > /dev/null 2>&1); then
 				dep_file_pkg=$(pkg which -qo ${dep_file})
+
+				# Check that the .so we need has a SONAME
+				if [ "${dep_file_pkg}" != "${PKGORIGIN}" ]; then
+					if ! readelf -d "${dep_file}" | grep -q SONAME; then
+						err "${file} is linked to ${dep_file} which does not have a SONAME.  ${dep_file_pkg} needs to be fixed."
+					fi
+				fi
+
+				# If we don't already depend on it, and we don't provide it
 				if ! listcontains ${dep_file_pkg} "${LIB_RUN_DEPENDS} ${PKGORIGIN}"; then
 					err "${file} is linked to ${dep_file} from ${dep_file_pkg} but it is not declared as a dependency"
 					proxydeps_suggest_uses ${dep_file_pkg} ${dep_file}
@@ -662,9 +672,35 @@ proxydeps() {
 	return ${rc}
 }
 
+sonames() {
+	[ -n "${BUNDLE_LIBS}" ] && return 0
+	while read f; do
+		# No results presents a blank line from heredoc.
+		[ -z "${f}" ] && continue
+		# Ignore symlinks
+		[ -f "${f}" -a ! -L "${f}" ] || continue
+		if ! readelf -d ${f} | grep -q SONAME; then
+			warn "${f} doesn't have a SONAME."
+			warn "pkg(8) will not register it as being provided by the port."
+			warn "If another port depend on it, pkg will not be able to know where it comes from."
+			case "${f}" in
+				${STAGEDIR}${PREFIX}/lib/*/*)
+					warn "It is in a subdirectory, it may not be used in another port."
+					;;
+				*)
+					warn "It is directly in ${PREFIX}/lib, it is probably used by other ports."
+					;;
+			esac
+		fi
+	# Use heredoc to avoid losing rc from find|while subshell
+	done <<-EOT
+	$(find ${STAGEDIR}${PREFIX}/lib -name '*.so.*')
+	EOT
+}
+
 checks="shebang symlinks paths stripped desktopfileutils sharedmimeinfo"
 checks="$checks suidfiles libtool libperl prefixvar baselibs terminfo"
-checks="$checks proxydeps"
+checks="$checks proxydeps sonames"
 
 ret=0
 cd ${STAGEDIR}

Modified: head/Mk/bsd.port.mk
==============================================================================
--- head/Mk/bsd.port.mk	Mon Aug 29 15:07:48 2016	(r421067)
+++ head/Mk/bsd.port.mk	Mon Aug 29 15:23:52 2016	(r421068)
@@ -1509,6 +1509,7 @@ QA_ENV+=		STAGEDIR=${STAGEDIR} \
 				LOCALBASE=${LOCALBASE} \
 				"STRIP=${STRIP}" \
 				TMPPLIST=${TMPPLIST} \
+				BUNDLE_LIBS=${BUNDLE_LIBS} \
 				LDCONFIG_DIR="${LDCONFIG_DIR}" \
 				PKGORIGIN=${PKGORIGIN} \
 				LIB_RUN_DEPENDS='${_LIB_RUN_DEPENDS:C,[^:]*:([^:]*):?.*,\1,}' \



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