Index | Thread | Search

From:
Kirill A. Korinsky <kirill@korins.ky>
Subject:
make check-shlib-syms
To:
OpenBSD ports <ports@openbsd.org>
Date:
Sun, 17 May 2026 22:28:12 +0200

Download raw body.

Thread
ports@,

I'd like to add check-shlib-syms which runs check_sym for port's .so against
system isntalled .so.

Quite useful to determin does SHARED_LIBS need to be updated.

I'm using it for a bit longer than a week, and it quite usefull.

Feedback? Tests? Ok?

Index: /usr/src/share/man/man5/bsd.port.mk.5
===================================================================
RCS file: /home/cvs/src/share/man/man5/bsd.port.mk.5,v
diff -u -p -r1.654 bsd.port.mk.5
--- /usr/src/share/man/man5/bsd.port.mk.5	4 Nov 2025 12:52:28 -0000	1.654
+++ /usr/src/share/man/man5/bsd.port.mk.5	8 May 2026 15:26:52 -0000
@@ -172,6 +172,13 @@ Apply
 to all subpackages of the current port.
 .It Cm checkpatch
 Check that patches would apply cleanly, but do not modify anything.
+.It Cm check-shlib-syms
+Compare exported dynamic symbols for
+.Ev PLIST
+shared libraries after
+.Cm fake ,
+against matching installed libraries.
+Libraries with no installed counterpart are reported and skipped.
 .It Cm checksum
 Compute a
 .Xr sha256 1
Index: /usr/ports/infrastructure/mk/bsd.port.mk
===================================================================
RCS file: /home/cvs/ports/infrastructure/mk/bsd.port.mk,v
diff -u -p -r1.1649 bsd.port.mk
--- /usr/ports/infrastructure/mk/bsd.port.mk	1 Apr 2026 15:14:57 -0000	1.1649
+++ /usr/ports/infrastructure/mk/bsd.port.mk	8 May 2026 15:28:07 -0000
@@ -2026,6 +2026,7 @@ CHECK_LIB_DEPENDS_ARGS += -F pthread
 
 _CHECK_LIB_DEPENDS = PORTSDIR=${PORTSDIR} ${_PERLSCRIPT}/check-lib-depends
 _CHECK_LIB_DEPENDS += -d ${_PKG_REPO} -B ${WRKINST} ${CHECK_LIB_DEPENDS_ARGS}
+_CHECK_SYM = ${BSDSRCDIR}/lib/check_sym
 
 .for _s in ${MULTI_PACKAGES}
 .  if ${STATIC_PLIST${_s}:L} == "no"
@@ -2536,7 +2537,7 @@ _internal-all _internal-build _internal-
 	_internal-subpackage _internal-subupdate _internal-uninstall \
 	_internal-update _internal-update-or-install _internal-generate-readmes \
 	_internal-update-or-install-all _internal-update-plist \
-	lib-depends-check port-lib-depends-check update-patches:
+	lib-depends-check port-lib-depends-check check-shlib-syms update-patches:
 .  if !defined(IGNORE_SILENT)
 	@${ECHO_MSG} "===>  ${FULLPKGNAME${SUBPACKAGE}}${_MASTER} ${IGNORE${SUBPACKAGE}} ${_EXTRA_IGNORE}."
 .  endif
@@ -2560,6 +2561,21 @@ port-lib-depends-check: ${WRKINST}/.save
 			${_CHECK_LIB_DEPENDS} -i -s ${WRKINST}/.saved_libs; \
 	done
 
+check-shlib-syms: ${_FAKE_COOKIE}
+	@[ -x ${_CHECK_SYM} ] || { echo "check-shlib-syms: ${_CHECK_SYM} doesn't exist"; exit 1; }; \
+	for s in ${BUILD_PACKAGES}; do \
+		cd ${.CURDIR} && SUBPACKAGE=$$s ${MAKE} print-plist-libs | while read _l; do \
+			case $$_l in */lib*.so.*|lib*.so.*) ;; *) continue;; esac; \
+			case $$_l in \
+			/*) oldpat=$${_l%.so.*}.so.*; new=${WRKINST}$$_l;; \
+			*) oldpat=${PREFIX}/$${_l%.so.*}.so.*; new=${WRKINST}${PREFIX}/$$_l;; \
+			esac; \
+			old=$$(ls -rt $$oldpat 2>/dev/null | tail -1); \
+			[ -n "$$old" ] || { echo "check-shlib-syms: no installed library for $$_l"; continue; }; \
+			${_CHECK_SYM} "$$old" "$$new"; \
+		done; \
+	done
+
 # Most standard port targets create a cookie to avoid being re-run.
 #
 # fetch is an exception, as it uses the files it fetches as `cookies',
@@ -3853,7 +3869,7 @@ _all_phony = ${_recursive_depends_target
 	print-package-args _print-package-signature-lib \
 	_print-package-signature-run _print-packagename _recurse-all-dir-depends \
 	_recurse-test-dir-depends _recurse-run-dir-depends \
-	build-depends-list checkpatch clean clean-depends \
+	build-depends-list checkpatch check-shlib-syms clean clean-depends \
 	delete-package distpatch do-build do-configure do-distpatch \
 	do-gen do-extract do-install do-test fetch-all \
 	install-all lib-depends lib-depends-list \


-- 
wbr, Kirill