support full paths to libraries in LIBS variables

Issue #2822 open
Roland Haas created an issue

On macOS using Homebrew pkg-config for HDF5 returns full library paths instead of -lLIBNAME stanzas:

rhaas@gdd6l52n-ofc Cactus % pkg-config --libs-only-l --static hdf5
-lhdf5 -lm -ldl -l/Library/Developer/CommandLineTools/SDKs/MacOSX14.sdk/usr/lib/libz.tbd -l/opt/homebrew/lib/libsz.dylib

This happens only for static linking. This causes g++ to fail at link time:

rhaas@gdd6l52n-ofc Cactus % g++-14 `pkg-config --libs-only-L hdf5` `pkg-config --libs-only-l --static hdf5` dummy.c
ld: library '/Library/Developer/CommandLineTools/SDKs/MacOSX14.sdk/usr/lib/libz.tbd' not found
collect2: error: ld returned 1 exit status

This seems like bug in the pkg-config file (`/opt/homebrew/Cellar/hdf5/1.14.3_1/lib/pkgconfig/hdf5.pc`) supplied by HomeBrew:

rhaas@gdd6l52n-ofc Cactus % cat /opt/homebrew/Cellar/hdf5/1.14.3_1/lib/pkgconfig/hdf5.pc
prefix=/opt/homebrew/Cellar/hdf5/1.14.3_1
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include

Name: hdf5
Description: HDF5 (Hierarchical Data Format 5) Software Library
Version: 1.14.3

Cflags: -I${includedir}
Libs: -L${libdir}  -lhdf5
Requires:
Libs.private:  -lhdf5  -lm -ldl -l/Library/Developer/CommandLineTools/SDKs/MacOSX14.sdk/usr/lib/libz.tbd -l/opt/homebrew/lib/libsz.dylib -l/opt/homebrew/lib/libsz.dylib
Requires.private:

Correct would be to not use -l with the full path (at least it will link):

g++-14 `pkg-config --libs-only-L hdf5` dummy.c /Library/Developer/CommandLineTools/SDKs/MacOSX14.sdk/usr/lib/libz.tbd

Right now we have no way of handling full paths in LIBS files though git hash cb3a8731 "Cactus: New pseudo-flag -file=" of cactus proposes some (partial) solution. This would require changes in all ExternalLibraries though (that may need to pass LIBS to their own configure). Another solution might be (in bash_utils.sh) to detect full paths in -l entries and split into a -L and a -l entry. This assumes knowledge of the library prefix (usually lib) and extension (.a, .so, .dylib, .dll).
A workaround for HDF5 is to self-compile HDF5 using HDF5_DIR=BUILD.

Comments (3)

  1. Roland Haas reporter

    A possible workaround in bash_utils.sh is

      # NOTE: This breaks if pkg-config returns quotes strings, i.e., path names
      #       with strings in them. It doesn't seems to happen in practice.
      #       If it does: let us know what pkg-config prints in that case, and we
      #       can try to fix it.
      local INC_DIRS=$($PKGCONFIG --cflags-only-I "$STATIC" "$LIBNAME" | perl -pe 's/(^| )+-I/\1/g')
      local LIB_DIRS=$($PKGCONFIG --libs-only-L   "$STATIC" "$LIBNAME" | perl -pe 's/(^| )+-L/\1/g')
      local     LIBS=""
      local ALLLIBS=$($PKGCONFIG --libs-only-l   "$STATIC" "$LIBNAME" | perl -pe 's/(^| )+-l/\1/g')
      local lib
      for lib in $ALLLIBS; do
        if [ "${lib%/*}" != "$lib" ] ; then
          LIB_DIRS="$LIB_DIRS ${lib%/*}"
          lib=${lib##*/lib}
          lib=${lib%.*}
        fi
        LIBS="$LIBS $lib"
      done
    

  2. Log in to comment