Troubles with dependencies (file -L is broken?)
Maxim Sobolev
sobomax at FreeBSD.org
Sun Sep 8 07:09:40 UTC 2013
Hi,
I am trying to portupgrade my subversion and it keeps trying to install
databases/db42 over already installed version (same version), missing the
shared library dependency.
Adding some debug into bsd.port.mk, I see:
===> subversion-1.8.3 depends on package: libtool>=2.4 - found
set -x; set -e ; for i in libdb-4.2.so:/usr/ports/databases/db42; do
lib=${i%%:*} ; dir=${i#*:} ; target="install"; depends_args=""; echo
-n "===> subversion-1.8.3 depends on shared library: ${lib}" ; found=0
; dirs="/lib /usr/lib /usr/local/lib `/bin/cat
/usr/local/libdata/ldconfig/* 2>/dev/null || : `" ; for libdir in $dirs;
do test -f ${libdir}/${lib} || continue; if [ -x /usr/bin/file ]; then [
`file -b -L --mime-type ${libdir}/${lib}` = "application/x-sharedlib" ] ||
continue ; fi ; found=1 ; echo " - found"; done ; if [ ${found} -eq 0
]; then echo " - not found"; echo "===> Verifying for $lib in $dir";
if [ ! -d "$dir" ] ; then echo " => No directory for $lib.
Skipping.."; else if [ -n "" -o -n "" ]; then subpkgfile=`(cd $dir; make
$depends_args -V PKGFILE)`; subpkgname=${subpkgfile%-*} ;
subpkgname=${subpkgname##*/} ; if [ -r "${subpkgfile}" -a "$target" =
"install" ]; then echo "===> Installing existing package
${subpkgfile}"; if [ -n "" -a ${subpkgname} = "pkg" ]; then [ -d
/usr/ports/devel/subversion/work ] || /bin/mkdir -p
/usr/ports/devel/subversion/work ; /usr/bin/tar xf ${subpkgfile} -C
/usr/ports/devel/subversion/work -s ",/.*/,,g" "*/pkg-static" ;
/usr/ports/devel/subversion/work/pkg-static add ${subpkgfile}; /bin/rm -f
/usr/ports/devel/subversion/work/pkg-static; else /usr/sbin/pkg_add
${subpkgfile}; fi; elif [ -n "" -a "${target}" = "install" ]; then echo
"===> subversion-1.8.3 depends on package: ${subpkgfile} - not found";
echo "===> USE_PACKAGE_DEPENDS_ONLY set - will not build from source";
exit 1; else (cd $dir; make -DINSTALLS_DEPENDS $target $depends_args) ;
fi; else (cd $dir; make -DINSTALLS_DEPENDS $target $depends_args) ; fi;
echo "===> Returning to build of subversion-1.8.3"; fi ; fi ; done
+ set -e
+ lib=libdb-4.2.so
+ dir=/usr/ports/databases/db42
+ target=install
+ depends_args=''
+ echo -n '===> subversion-1.8.3 depends on shared library: libdb-4.2.so'
===> subversion-1.8.3 depends on shared library: libdb-4.2.so+ found=0
+ /bin/cat /usr/local/libdata/ldconfig/compat7x
/usr/local/libdata/ldconfig/mysql /usr/local/libdata/ldconfig/portupgrade
/usr/local/libdata/ldconfig/pth
+ dirs='/lib /usr/lib /usr/local/lib /usr/local/lib/compat
/usr/local/lib/mysql
/usr/local/lib/compat/pkg
/usr/local/lib/pth'
+ test -f /lib/libdb-4.2.so
+ continue
+ test -f /usr/lib/libdb-4.2.so
+ continue
+ test -f /usr/local/lib/libdb-4.2.so
+ [ -x /usr/bin/file ]
+ file -b -L --mime-type /usr/local/lib/libdb-4.2.so
+ [ inode/symlink = application/x-sharedlib ]
+ continue
+ test -f /usr/local/lib/compat/libdb-4.2.so
+ continue
+ test -f /usr/local/lib/mysql/libdb-4.2.so
+ continue
+ test -f /usr/local/lib/compat/pkg/libdb-4.2.so
+ continue
+ test -f /usr/local/lib/pth/libdb-4.2.so
+ continue
+ [ 0 -eq 0 ]
+ echo ' - not found'
- not found
+ echo '===> Verifying for libdb-4.2.so in /usr/ports/databases/db42'
===> Verifying for libdb-4.2.so in /usr/ports/databases/db42
So, file(1) call is the culprit here. Trying to reproduce in the console:
[sobomax at pioneer ~]$ file -b -L --mime-type /usr/local/lib/libdb-4.2.so
inode/symlink
However:
[sobomax at pioneer ~]$ hexdump -C /usr/local/lib/libdb-4.2.so | head -n 20
00000000 7f 45 4c 46 02 01 01 09 00 00 00 00 00 00 00 00
|.ELF............|
00000010 03 00 3e 00 01 00 00 00 d0 40 02 00 00 00 00 00
|..>.....п@......|
00000020 40 00 00 00 00 00 00 00 b8 a6 0e 00 00 00 00 00
|@.......╦і......|
00000030 00 00 00 00 40 00 38 00 05 00 40 00 1d 00 1a 00 |.... at .8...@
.....|
00000040 01 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00
|................|
00000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|................|
00000060 dc 45 0e 00 00 00 00 00 dc 45 0e 00 00 00 00 00
|эE......эE......|
00000070 00 00 20 00 00 00 00 00 01 00 00 00 06 00 00 00 |..
.............|
00000080 00 50 0e 00 00 00 00 00 00 50 2e 00 00 00 00 00
|.P.......P......|
00000090 00 50 2e 00 00 00 00 00 fc 36 00 00 00 00 00 00
|.P......Э6......|
000000a0 d8 3a 00 00 00 00 00 00 00 00 20 00 00 00 00 00 |ь:........
.....|
000000b0 02 00 00 00 06 00 00 00 e8 54 0e 00 00 00 00 00
|........ХT......|
000000c0 e8 54 2e 00 00 00 00 00 e8 54 2e 00 00 00 00 00
|ХT......ХT......|
000000d0 a0 01 00 00 00 00 00 00 a0 01 00 00 00 00 00 00
|═.......═.......|
000000e0 08 00 00 00 00 00 00 00 50 e5 74 64 04 00 00 00
|........PЕtd....|
000000f0 5c 39 0d 00 00 00 00 00 5c 39 0d 00 00 00 00 00
|\9......\9......|
00000100 5c 39 0d 00 00 00 00 00 b4 34 00 00 00 00 00 00
|\9......Є4......|
00000110 b4 34 00 00 00 00 00 00 04 00 00 00 00 00 00 00
|Є4..............|
The culprit is that /usr/local/lib/libdb-4.2.so is a symlink to another
symlink to another symlink etc, so that my guess is that file(1) stops at
the first one. The issue can be resolved by using realpath(1), attached
patch fixes it for me.
[sobomax at pioneer ~]$ realpath /usr/local/lib/libdb-4.2.so
/usr/local/lib/db42/libdb-4.2.so.2
[sobomax at pioneer ~]$ file -b -L --mime-type
/usr/local/lib/db42/libdb-4.2.so.2
application/x-sharedlib
[sobomax at pioneer ~]$ ls -l /usr/local/lib/libdb-4.2.so
lrwxr-xr-x 1 root wheel 14 7 сен 21:43 /usr/local/lib/libdb-4.2.so ->
libdb-4.2.so.2
I am not sure what's the process to get bsd.port.mk adjusted these days.
Should I open a PR and assign it to portmgr?
-Maxim
-------------- next part --------------
A non-text attachment was scrubbed...
Name: bsd.port.mk.diff
Type: application/octet-stream
Size: 504 bytes
Desc: not available
URL: <http://lists.freebsd.org/pipermail/freebsd-ports/attachments/20130908/9f7e895d/attachment.obj>
More information about the freebsd-ports
mailing list