FreeBSD の install は build と同じバージョンが必須2021年03月02日 12時26分05秒

一週間程前に遭遇したFreeBSD 13.0-BETA でバイナリを使い回した時の install が失敗する件だが、make: Undefined symbol "regcomp@FBSD_1.6" は cp /usr/bin/make で回避は既に現在の FreeBSD-BETA では使えなくなっている様だ。あの後、もう少し問題を切り下げて追跡すると他にも幾つか見付からないライブラリがあった。

FreeBSD に PR を投げたが、どうも make install を行うホストは、 make build を行ったホストと同じバージョンを使う必要があるそうだ。つまり、FreeBSD 13.0-RELEASE を複数の 12.2-RELEASE のホストにインストールしたければ、コンパイルも 12.2-RELEASE 上でやったのを共有する必要がある。うっかり 13.0-BETA に上げてしまったホストでインクリメンタルビルドを行うと tmp 以下が 13.0-BETA になってしまい今回の様な問題に出喰わす。

さて、もう一度作り直すの面倒だったので、取り敢えず LD_LIBRARY_CONFIG を用いて回避することは出来た。make installworld を行わないと、make installkernel が上手にいかないが、現状を回避するのには充分。なお、この手順の更新はサポートされていないので非公式の回避策になる。

diff --git a/Makefile.inc1 b/Makefile.inc1
index f27cd270635..1dbaa1a4861 100644
--- a/Makefile.inc1
+++ b/Makefile.inc1
@@ -607,6 +607,7 @@ BUILD_ARCH!=        uname -p
 .endif
 WORLDTMP?=     ${OBJTOP}/tmp
 BPATH=         ${CCACHE_WRAPPER_PATH_PFX}${WORLDTMP}/legacy/usr/sbin:${WORLDTMP}/legacy/usr/bin:${WORLDTMP}/legacy/bin:${WORLDTMP}/legacy/usr/libexec
+BLD_LIBRARY_PATH=${WORLDTMP}/lib:${WORLDTMP}/usr/lib:${WORLDTMP}/lib/casper
 XPATH=         ${WORLDTMP}/bin:${WORLDTMP}/usr/sbin:${WORLDTMP}/usr/bin

 # When building we want to find the cross tools before the host tools in ${BPATH}.
@@ -717,6 +718,7 @@ BOOTSTRAPPING_OSRELDATE?=${OSRELDATE}
 BMAKEENV=      INSTALL="sh ${.CURDIR}/tools/install.sh" \
                TOOLS_PREFIX=${TOOLS_PREFIX_UNDEF:U${WORLDTMP}} \
                PATH=${BPATH}:${PATH} \
+               LD_LIBRARY_PATH=${BLD_LIBRARY_PATH}:${LD_LIBRARY_PATH} \
                WORLDTMP=${WORLDTMP} \
                MAKEFLAGS="-m ${.CURDIR}/tools/build/mk ${.MAKEFLAGS}"
 # need to keep this in sync with targets/pseudo/bootstrap-tools/Makefile
@@ -764,6 +766,7 @@ XMAKE=              ${BMAKE} \
 # kernel-tools stage
 KTMAKEENV=     INSTALL="sh ${.CURDIR}/tools/install.sh" \
                PATH=${BPATH}:${PATH} \
+               LD_LIBRARY_PATH=${BLD_LIBRARY_PATH}:${LD_LIBRARY_PATH} \
                WORLDTMP=${WORLDTMP} \
                MAKEFLAGS="-m ${.CURDIR}/tools/build/mk ${.MAKEFLAGS}"
@@ -1360,7 +1360,8 @@ distributeworld installworld stageworld: _installcheck_world .PHONY
                fi; \
            done); \
        if [ -z "${CROSSBUILD_HOST}" ] ; then \
-               libs=$$(LD_LIBRARY_PATH=${BLD_LIBRARY_PATH}:${LD_LIBRARY_PATH} ldd -f "%o %p\n" -f "%o %p\n" $$progs 2>/dev/null | sort -u | \
+               libs=$$(LD_LIBRARY_PATH=${BLD_LIBRARY_PATH}:${LD_LIBRARY_PATH} \
+                   ldd -f "%o %p\n" -f "%o %p\n" $$progs 2>/dev/null | sort -u | \
                    while read line; do \
                        set -- $$line; \
                        if [ "$$2 $$3" != "not found" ]; then \

前回