I was originally going to post this to the gmp-discuss list, but after reviewing it, it seems like it fits better here. Please kindly redirect me if this is better handled elsewhere...
I'm trying to do a staged build/install of libgmp(xx) release 5.1.2. This is part of an effort to develop a "general" build system (mostly bash scripts, make files, etc.) for toolchains I will be using. I intend to use these scripts to build both native and cross-builds, depending on configuration / arguments, so using DESTDIR for prefixing the install tree is important. Right now, I'm working on native builds on an Ubuntu 12.04 32-bit x86 machine; libtool version = 2.4.2.) When building/installing gmp, I use DESTDIR with make install (as follows, with the configured prefix being "/home/youngmj/DevTools_3/gmp/Version_5.1.2/gmp__native/install"), as follows: make install DESTDIR=/home/youngmj/tmp I get the following warning / output: *** <*snip*> libtool: install: warning: relinking `libgmpxx.la' libtool: install: (cd /home/youngmj/tmp/home/youngmj/DevTools_3/gmp/Version_5.1.2/gmp__native/build; /bin/bash /home/youngmj/tmp/home/youngmj/DevTools_3/gmp/Version_5.1.2/gmp__native/build/libtool --tag CXX --mode=relink g++ -version-info 7:2:3 -o libgmpxx.la -rpath /home/youngmj/DevTools_3/gmp/Version_5.1.2/gmp__native/install/lib dummy.lo cxx/isfuns.lo cxx/ismpf.lo cxx/ismpq.lo cxx/ismpz.lo cxx/ismpznw.lo cxx/limits.lo cxx/osdoprnti.lo cxx/osfuns.lo cxx/osmpf.lo cxx/osmpq.lo cxx/osmpz.lo libgmp.la -inst-prefix-dir /home/youngmj/tmp) libtool: relink: g++ -fPIC -DPIC -shared -nostdlib /usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crti.o /usr/lib/gcc/i686-linux-gnu/4.6/crtbeginS.o .libs/dummy.o cxx/.libs/isfuns.o cxx/.libs/ismpf.o cxx/.libs/ismpq.o cxx/.libs/ismpz.o cxx/.libs/ismpznw.o cxx/.libs/limits.o cxx/.libs/osdoprnti.o cxx/.libs/osfuns.o cxx/.libs/osmpf.o cxx/.libs/osmpq.o cxx/.libs/osmpz.o -Wl,-rpath -Wl,/home/youngmj/DevTools_3/gmp/Version_5.1.2/gmp__native/install/lib -L/home/youngmj/tmp/home/youngmj/DevTools_3/gmp/Version_5.1.2/gmp__native/install/lib -L/home/youngmj/DevTools_3/gmp/Version_5.1.2/gmp__native/install/lib -lgmp -L/usr/lib/gcc/i686-linux-gnu/4.6 -L/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu -L/usr/lib/gcc/i686-linux-gnu/4.6/../../../../lib -L/lib/i386-linux-gnu -L/lib/../lib -L/usr/lib/i386-linux-gnu -L/usr/lib/../lib -L. -L/usr/lib/gcc/i686-linux-gnu/4.6/../../.. -lstdc++ -lm -lc -lgcc_s /usr/lib/gcc/i686-linux-gnu/4.6/crtendS.o /usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crtn.o -Wl,-soname -Wl,libgmpxx.so.4 -o .libs/libgmpxx.so.4.3.2 libtool: install: /usr/bin/install -c .libs/libgmpxx.so.4.3.2T /home/youngmj/tmp/home/youngmj/DevTools_3/gmp/Version_5.1.2/gmp__native/install/lib/libgmpxx.so.4.3.2 libtool: install: (cd /home/youngmj/tmp/home/youngmj/DevTools_3/gmp/Version_5.1.2/gmp__native/install/lib && { ln -s -f libgmpxx.so.4.3.2 libgmpxx.so.4 || { rm -f libgmpxx.so.4 && ln -s libgmpxx.so.4.3.2 libgmpxx.so.4; }; }) libtool: install: (cd /home/youngmj/tmp/home/youngmj/DevTools_3/gmp/Version_5.1.2/gmp__native/install/lib && { ln -s -f libgmpxx.so.4.3.2 libgmpxx.so || { rm -f libgmpxx.so && ln -s libgmpxx.so.4.3.2 libgmpxx.so; }; }) libtool: install: /usr/bin/install -c .libs/libgmpxx.lai /home/youngmj/tmp/home/youngmj/DevTools_3/gmp/Version_5.1.2/gmp__native/install/lib/ libgmpxx.la libtool: install: /usr/bin/install -c .libs/libgmp.a /home/youngmj/tmp/home/youngmj/DevTools_3/gmp/Version_5.1.2/gmp__native/install/lib/libgmp.a libtool: install: chmod 644 /home/youngmj/tmp/home/youngmj/DevTools_3/gmp/Version_5.1.2/gmp__native/install/lib/libgmp.a libtool: install: ranlib /home/youngmj/tmp/home/youngmj/DevTools_3/gmp/Version_5.1.2/gmp__native/install/lib/libgmp.a libtool: install: /usr/bin/install -c .libs/libgmpxx.a /home/youngmj/tmp/home/youngmj/DevTools_3/gmp/Version_5.1.2/gmp__native/install/lib/libgmpxx.a libtool: install: chmod 644 /home/youngmj/tmp/home/youngmj/DevTools_3/gmp/Version_5.1.2/gmp__native/install/lib/libgmpxx.a libtool: install: ranlib /home/youngmj/tmp/home/youngmj/DevTools_3/gmp/Version_5.1.2/gmp__native/install/lib/libgmpxx.a libtool: install: warning: remember to run `libtool --finish /home/youngmj/DevTools_3/gmp/Version_5.1.2/gmp__native/install/lib' <*snip*> **** [BTW - the "T" in the .so library version (4th line) looks wierd... can anyone verify this is OK?] The second warning is not the primary problem - I run the finish command once I move the installation into place. The first warning (relinking) is what I'm most concerned about. I see where the warning is coming from - the following is in libgmpxx.la after the build and verification (make check), but prior to install: *** <*snip*> # Libraries that this one depends upon. dependency_libs=' /home/youngmj/tmp/home/youngmj/DevTools_3/gmp/Version_5.1.2/gmp__native/build/ libgmp.la' <*snip*> # Directory that this library needs to be installed in: libdir='/home/youngmj/DevTools_3/gmp/Version_5.1.2/gmp__native/install/lib' relink_command="(cd /home/youngmj/tmp/home/youngmj/DevTools_3/gmp/Version_5.1.2/gmp__native/build; /bin/bash /home/youngmj/tmp/home/youngmj/DevTools_3/gmp/Version_5.1.2/gmp__native/build/libtool --tag CXX --mode=relink g++ -version-info 7:2:3 -o libgmpxx.la -rpath /home/youngmj/DevTools_3/gmp/Version_5.1.2/gmp__native/install/lib dummy.lo cxx/isfuns.lo cxx/ismpf.lo cxx/ismpq.lo cxx/ismpz.lo cxx/ismpznw.lo cxx/limits.lo cxx/osdoprnti.lo cxx/osfuns.lo cxx/osmpf.lo cxx/osmpq.lo cxx/osmpz.lo libgmp.la @inst_prefix_dir@)" *** I did some searching on the web, and I found some discussions for gmp version 4.1 (circa 2002!) - see here for an example of what I found: "http://www.hep.by/gnu/gmp/Known-Build-Problems.html". (I also found suggested workarounds that set LD_LIBRARY_PATH to include the staging directory, instead of adding -Lstage_path to libtool's relink.) However, this information is ~10 years old. Libtool may now handle this situation more elegantly, using -inst-prefix-dir (based on my reading of info here: "http://www.gnu.org/software/libtool/manual/html_node/Install-mode.html"). Here's what I *think* I understand: a) there is a need to relink libgmpxx upon install (for staged installs) to correctly set rpath (to pick up libgmp) in libgmpxx.so b) libtool uses -inst-prefix-dir for this relink to ensure that the relink uses the correct object files and libgmp.so (from the staging directory), but sets rpath to the final destination for libgmp.so. I do see that my installed libgmpxx.so (after moving it to its final destination and running "libtool --finish" as directed) does have the correct rpath in it: $ readelf -d /home/youngmj/DevTools_3/gmp/Version_5.1.2/gmp__native/install/lib/libgmpxx.so | grep RPATH 0x0000000f (RPATH) Library rpath: [/home/youngmj/DevTools_3/gmp/Version_5.1.2/gmp__native/install/lib] For my testing, there was nothing in the final destination directory prior to me moving the newly built entity there (but this will probably not be the case in general usage of my build scripts), so the only place that libgmp.so could be picked up is either in the staging directory or in the default system location (/usr/lib/i386-linux-gnu), as there is no version of this library elsewhere in ldconfig/LD_LIBRARY_PATH. Based on what I see in libgmpxx.la (as copied above, from "dependency_libs" and "relink_command" lines), I would *assume* that libgmp.so is being picked up from the staging directory when relinking, although I don't know how I can verify this. But if this is the case, why is libtool issuing a warning? Is this really just a red herring, and only there for "informational" purposes, or am I doing something wrong/questionable? Lastly, as I previously mentioned, I run the "libtool --finish" command as directed. (For "native" builds, this command is performed on the build machine itself, but for cross-builds, I assume it is to be performed on the target machine once the library files are moved into place.) But I'm very confused about what it actually does. From my readings, and looking at the output from the command (at bottom), I gather that it sets the library search path for the system - using ldconfig - so users can pick up the newly installed (libgmp) library. But if it's really doing that, a) why am I not seeing any change via ldconfig? (Perhaps I need to run the finish command using sudo?) b) why is the output stating that I need to set LD_LIBRARY_PATH or edit/add a *.conf file when I use ld (vs. libtool)? Based on observation, I can only conclude it's NOT actually making changes to the system configuration via ldconfig. If it's only processing the specified path, not updating the linker cache, and not updating the configuration files (ld.so.conf or its includes), what is it doing? The only thing that I could detect that it does is create the libtool control (.la) files for the newly installed libraries. Can anyone confirm that this is the case? In truth, this is really what I think I want. I don't want libtool to update system configuration files because I will have multiple (native + cross-builds, all different versions) toolchains and libraries on my build system and do not want to "disturb"/replace the "default" system configuration. I was not intending to use automake/libtool for my own projects that use the built tools, and I was expecting to explicitly set LD_LIBRARY_PATH to pull in the correct (libgmp) libraries. Other than being somewhat of a maintenance headache (hence, I'm developing a "SET_BUILD_ENVIRONMENT" utility script to simplify things for using the tools and libraries), is there any reason this won't work? If "libtool --finish" only creates the .la files (and not affect system configuration), I'll still do it, since other tools (e.g., gcc) may use gmp and libtool. Thanks for any feedback/insight. - Michael *** libtool: finish: PATH="xxx__my_path__xxx" ldconfig -n /home/youngmj/DevTools_3/gmp/Version_5.1.2/gmp__native/install/lib ---------------------------------------------------------------------- Libraries have been installed in: /home/youngmj/DevTools_3/gmp/Version_5.1.2/gmp__native/install/lib If you ever happen to want to link against installed libraries in a given directory, LIBDIR, you must either use libtool, and specify the full pathname of the library, or use the `-LLIBDIR' flag during linking and do at least one of the following: - add LIBDIR to the `LD_LIBRARY_PATH' environment variable during execution - add LIBDIR to the `LD_RUN_PATH' environment variable during linking - use the `-Wl,-rpath -Wl,LIBDIR' linker flag - have your system administrator add LIBDIR to `/etc/ld.so.conf' See any operating system documentation about shared libraries for more information, such as the ld(1) and ld.so(8) manual pages. ---------------------------------------------------------------------- ***
_______________________________________________ https://lists.gnu.org/mailman/listinfo/libtool