From 2d3de726c5cc64d419dcdebf427b0cb58c608b36 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Thu, 13 Feb 2003 23:52:54 +0000 Subject: Add full support for -rpath/-R, both in shared libraries and applications, at least on the platforms where it's known how to do it. Note: this has only been tested on GNU-based platforms (Linux), and needs to be tested on all others. Additionally, it's not yet supported on the following platforms, for lack of information: Darwin (MacOS X) Cygwin OSF1/Alpha SVR3 ReliantUNIX Please help out with testing and the platforms we don't yet know well enough. --- Makefile.shared | 201 ++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 167 insertions(+), 34 deletions(-) (limited to 'Makefile.shared') diff --git a/Makefile.shared b/Makefile.shared index a3acc9877a..9178b829a2 100644 --- a/Makefile.shared +++ b/Makefile.shared @@ -7,19 +7,32 @@ # CC contains the current compiler. This one MUST be defined CC=cc -# LDFLAGS contains flags to be used when the temporary object file is -# created. SHARED_LDFLAGS contains flags to be used when the shared -# library is created. +# LDFLAGS contains flags to be used when temporary object files (when building +# shared libraries) are created, or when an application is linked. +# SHARED_LDFLAGS contains flags to be used when the shared library is created. LDFLAGS= SHARED_LDFLAGS= -# LIBNAME contains just the name of thhe library, without prefix ("lib" +# LIBNAME contains just the name of the library, without prefix ("lib" # on Unix, "cyg" for certain forms under Cygwin...) or suffix (.a, .so, -# .dll, ...). This one MUST have a value when using this makefile. +# .dll, ...). This one MUST have a value when using this makefile to +# build shared libraries. # For example, to build libfoo.so, you need to do the following: #LIBNAME=foo LIBNAME= +# APPNAME contains just the name of the application, without suffix ("" +# on Unix, ".exe" on Windows, ...). This one MUST have a value when using +# this makefile to build applications. +# For example, to build foo, you need to do the following: +#APPNAME=foo +APPNAME= + +# OBJECTS contains all the object files to link together into the application. +# This must contain at least one object file. +#OBJECTS=foo.o +OBJECTS= + # LIBEXTRAS contains extra modules to link together with the library. # For example, if a second library, say libbar.a needs to be linked into # libfoo.so, you need to do the following: @@ -73,8 +86,12 @@ CALC_VERSIONS= \ done; \ fi +LINK_APP= \ + ( $(DEBUG); \ + $$LDCMD $(LDFLAGS) $$LDFLAGS -o $$APPNAME $(OBJECTS) $$LIBDEPS ) + LINK_SO= \ - ( $(DEBUG); \ + ( $(DEBUG); \ nm -Pg $$SHOBJECTS | grep ' [BDT] ' | cut -f1 -d' ' > lib$(LIBNAME).exp; \ $$SHAREDCMD $(SHARED_LDFLAGS) $$SHAREDFLAGS -o $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX \ $$ALLSYMSFLAGS $$SHOBJECTS $$NOALLSYMSFLAGS $$LIBDEPS ) && \ @@ -111,19 +128,25 @@ LINK_SO_A_UNPACKED= \ DETECT_GNU_LD=(${CC} -Wl,-V /dev/null 2>&1 | grep '^GNU ld' )>/dev/null -DO_GNU=$(CALC_VERSIONS); \ +DO_GNU_SO=$(CALC_VERSIONS); \ SHLIB=lib$(LIBNAME).so; \ SHLIB_SUFFIX=; \ LIBDEPS="$(LIBDEPS) -lc"; \ ALLSYMSFLAGS='-Wl,--whole-archive'; \ NOALLSYMSFLAGS='-Wl,--no-whole-archive'; \ - SHAREDFLAGS="-shared -Wl,-Bsymbolic -Wl,-soname=$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"; \ + SHAREDFLAGS="-shared -Wl,-Bsymbolic -Wl,-soname=$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX -Wl,-rpath,$(LIBRPATH)"; \ SHAREDCMD='$(CC)' +DO_GNU_APP=LDCMD=$(CC);\ + LDFLAGS="-Wl,-rpath,$(LIBRPATH)"; \ + LIBDEPS="$(LIBDEPS) -lc"; \ + APPNAME=$(APPNAME) link_o.gnu: - @ $(DO_GNU); $(LINK_SO_O) + @ $(DO_GNU_SO); $(LINK_SO_O) link_a.gnu: - @ $(DO_GNU); $(LINK_SO_A) + @ $(DO_GNU_SO); $(LINK_SO_A) +link_app.gnu: + @ $(DO_GNU_APP); $(LINK_APP) # For Darwin AKA Mac OS/X (dyld) link_o.darwin: @@ -158,6 +181,12 @@ link_a.darwin: SHAREDFLAGS="$$SHAREDFLAGS -compatibility_version $$SHLIB_SOVER_NODOT"; \ fi; \ $(LINK_SO_A) +link_app.darwin: + LDCMD=$(CC);\ + LDFLAGS=""; \ + LIBDEPS="$(LIBDEPS) -lc"; \ + APPNAME="$(APPNAME)"; \ + $(LINK_APP) link_o.cygwin: @ $(CALC_VERSIONS); \ @@ -183,10 +212,16 @@ link_a.cygwin: SHAREDFLAGS="-shared -Wl,-Bsymbolic -Wl,--out-implib,lib$(LIBNAME).dll.a"; \ SHAREDCMD='${CC}'; \ $(LINK_SO_A) +link_app.cygwin: + LDCMD=$(CC);\ + LDFLAGS=""; \ + LIBDEPS="$(LIBDEPS) -lc"; \ + APPNAME="$(APPNAME).exe" + $(LINK_APP) link_o.alpha-osf1: @ if ${DETECT_GNU_LD}; then \ - $(DO_GNU); \ + $(DO_GNU_SO); \ else \ SHLIB=lib$(LIBNAME).so; \ SHLIB_SUFFIX=; \ @@ -209,7 +244,7 @@ link_o.alpha-osf1: $(LINK_SO_O) link_a.alpha-osf1: @ if ${DETECT_GNU_LD}; then \ - $(DO_GNU); \ + $(DO_GNU_SO); \ else \ SHLIB=lib$(LIBNAME).so; \ SHLIB_SUFFIX=; \ @@ -230,12 +265,22 @@ link_a.alpha-osf1: fi; \ fi; \ $(LINK_SO_A) +link_app.alpha-osf1: + @ if ${DETECT_GNU_LD}; then \ + $(DO_GNU_APP); \ + else \ + LDCMD=$(CC);\ + LDFLAGS=""; \ + LIBDEPS="$(LIBDEPS) -lc"; \ + APPNAME="$(APPNAME)" + fi; \ + $(LINK_APP) # The difference between alpha-osf1-shared and tru64-shared is the `-msym' # option passed to the linker. link_o.tru64: @ if ${DETECT_GNU_LD}; then \ - $(DO_GNU); \ + $(DO_GNU_SO); \ else \ SHLIB=lib$(LIBNAME).so; \ SHLIB_SUFFIX=; \ @@ -249,7 +294,7 @@ link_o.tru64: SHLIB_SOVER=; \ ALLSYMSFLAGS='-all'; \ NOALLSYMSFLAGS='-none'; \ - SHAREDFLAGS="-shared -msym"; \ + SHAREDFLAGS="-shared -msym -rpath $(LIBRPATH)"; \ SHAREDCMD='$(CC)'; \ if [ -n "$$SHLIB_HIST" ]; then \ SHAREDFLAGS="$$SHAREDFLAGS -set_version \"$$SHLIB_HIST\""; \ @@ -258,7 +303,7 @@ link_o.tru64: $(LINK_SO_O) link_a.tru64: @ if ${DETECT_GNU_LD}; then \ - $(DO_GNU); \ + $(DO_GNU_SO); \ else \ SHLIB=lib$(LIBNAME).so; \ SHLIB_SUFFIX=; \ @@ -272,19 +317,29 @@ link_a.tru64: SHLIB_SOVER=; \ ALLSYMSFLAGS='-all'; \ NOALLSYMSFLAGS='-none'; \ - SHAREDFLAGS="-shared -msym"; \ + SHAREDFLAGS="-shared -msym -rpath $(LIBRPATH)"; \ SHAREDCMD='$(CC)'; \ if [ -n "$$SHLIB_HIST" ]; then \ SHAREDFLAGS="$$SHAREDFLAGS -set_version \"$$SHLIB_HIST\""; \ fi; \ fi; \ $(LINK_SO_A) +link_app.tru64: + @ if ${DETECT_GNU_LD}; then \ + $(DO_GNU_APP); \ + else \ + LDCMD=$(CC);\ + LDFLAGS="-rpath $(LIBRPATH)"; \ + LIBDEPS="$(LIBDEPS) -lc"; \ + APPNAME="$(APPNAME)"; \ + fi; \ + $(LINK_APP) # The difference between tru64-shared and tru64-shared-rpath is the # -rpath ${LIBRPATH} passed to the linker. link_o.tru64-rpath: @ if ${DETECT_GNU_LD}; then \ - $(DO_GNU); \ + $(DO_GNU_SO); \ else \ SHLIB=lib$(LIBNAME).so; \ SHLIB_SUFFIX=; \ @@ -307,7 +362,7 @@ link_o.tru64-rpath: $(LINK_SO_O) link_a.tru64-rpath: @ if ${DETECT_GNU_LD}; then \ - $(DO_GNU); \ + $(DO_GNU_SO); \ else \ SHLIB=lib$(LIBNAME).so; \ SHLIB_SUFFIX=; \ @@ -328,10 +383,20 @@ link_a.tru64-rpath: fi; \ fi; \ $(LINK_SO_A) +link_app.tru64-rpath: + @ if ${DETECT_GNU_LD}; then \ + $(DO_GNU_APP); \ + else \ + LDCMD=$(CC);\ + LDFLAGS="-rpath $(LIBRPATH)"; \ + LIBDEPS="$(LIBDEPS) -lc"; \ + APPNAME="$(APPNAME)"; \ + fi; \ + $(LINK_APP) link_o.solaris: @ if ${DETECT_GNU_LD}; then \ - $(DO_GNU); \ + $(DO_GNU_SO); \ else \ $(CALC_VERSIONS); \ MINUSZ='-z '; \ @@ -341,13 +406,13 @@ link_o.solaris: LIBDEPS="$(LIBDEPS) -lc"; \ ALLSYMSFLAGS="$${MINUSZ}allextract"; \ NOALLSYMSFLAGS="$${MINUSZ}defaultextract"; \ - SHAREDFLAGS="-G -dy -z text -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"; \ + SHAREDFLAGS="-G -dy -z text -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX -R $(LIBRPATH)"; \ SHAREDCMD='$(CC)'; \ fi; \ $(LINK_SO_O) link_a.solaris: @ if ${DETECT_GNU_LD}; then \ - $(DO_GNU); \ + $(DO_GNU_SO); \ else \ $(CALC_VERSIONS); \ MINUSZ='-z '; \ @@ -357,16 +422,26 @@ link_a.solaris: LIBDEPS="$(LIBDEPS) -lc"; \ ALLSYMSFLAGS="$${MINUSZ}allextract"; \ NOALLSYMSFLAGS="$${MINUSZ}defaultextract"; \ - SHAREDFLAGS="-G -dy -z text -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"; \ + SHAREDFLAGS="-G -dy -z text -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX -R $(LIBRPATH)"; \ SHAREDCMD='$(CC)'; \ fi; \ $(LINK_SO_A) +link_app.solaris: + @ if ${DETECT_GNU_LD}; then \ + $(DO_GNU_APP); \ + else \ + LDCMD=$(CC);\ + LDFLAGS="-R $(LIBRPATH)"; \ + LIBDEPS="$(LIBDEPS) -lc"; \ + APPNAME="$(APPNAME)"; \ + fi; \ + $(LINK_APP) # OpenServer 5 native compilers used # UnixWare 7 and OpenUNIX 8 native compilers used link_o.svr3: @ if ${DETECT_GNU_LD}; then \ - $(DO_GNU); \ + $(DO_GNU_SO); \ else \ $(CALC_VERSIONS); \ SHLIB=lib$(LIBNAME).so; \ @@ -380,7 +455,7 @@ link_o.svr3: $(LINK_SO_O) link_a.svr3: @ if ${DETECT_GNU_LD}; then \ - $(DO_GNU); \ + $(DO_GNU_SO); \ else \ $(CALC_VERSIONS); \ SHLIB=lib$(LIBNAME).so; \ @@ -392,10 +467,20 @@ link_a.svr3: SHAREDCMD='$(CC)'; \ fi; \ $(LINK_SO_A_UNPACKED) +link_app.svr3: + @ if ${DETECT_GNU_LD}; then \ + $(DO_GNU_APP); \ + else \ + LDCMD=$(CC);\ + LDFLAGS=""; \ + LIBDEPS="$(LIBDEPS) -lc"; \ + APPNAME="$(APPNAME)"; \ + fi; \ + $(LINK_APP) link_o.irix: @ if ${DETECT_GNU_LD}; then \ - $(DO_GNU); \ + $(DO_GNU_SO); \ else \ $(CALC_VERSIONS); \ SHLIB=lib$(LIBNAME).so; \ @@ -403,13 +488,13 @@ link_o.irix: LIBDEPS="$(LIBDEPS) -lc"; \ ALLSYMSFLAGS='-all'; \ NOALLSYMSFLAGS=''; \ - SHAREDFLAGS="-shared -Wl,-soname,$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"; \ + SHAREDFLAGS="-shared -Wl,-soname,$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX -Wl,-rpath,$(LIBRPATH)"; \ SHAREDCMD='$(CC)'; \ fi; \ $(LINK_SO_O) link_a.irix: @ if ${DETECT_GNU_LD}; then \ - $(DO_GNU); \ + $(DO_GNU_SO); \ else \ $(CALC_VERSIONS); \ SHLIB=lib$(LIBNAME).so; \ @@ -417,10 +502,20 @@ link_a.irix: LIBDEPS="$(LIBDEPS) -lc"; \ ALLSYMSFLAGS='-all'; \ NOALLSYMSFLAGS=''; \ - SHAREDFLAGS="-shared -Wl,-soname,$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"; \ + SHAREDFLAGS="-shared -Wl,-soname,$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX -Wl,-rpath,$(LIBRPATH)"; \ SHAREDCMD='$(CC)'; \ fi; \ $(LINK_SO_A) +link_app.irix: + @ if ${DETECT_GNU_LD}; then \ + $(DO_GNU_APP); \ + else \ + LDCMD=$(CC);\ + LDFLAGS="-Wl,-rpath,$(LIBRPATH)"; \ + LIBDEPS="$(LIBDEPS) -lc"; \ + APPNAME="$(APPNAME)"; \ + fi; \ + $(LINK_APP) # HP-UX includes the full pathname of libs we depend on, so we would get # ./libcrypto (with ./ as path information) compiled into libssl, hence @@ -439,7 +534,7 @@ link_o.hpux32: LIBDEPS="$(LIBDEPS) -lc"; \ ALLSYMSFLAGS='-Fl'; \ NOALLSYMSFLAGS=''; \ - SHAREDFLAGS="+vnocompatwarnings -b -z +s +h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"; \ + SHAREDFLAGS="+vnocompatwarnings -b -z +s +h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX +b $(LIBRPATH)"; \ SHAREDCMD='/usr/ccs/bin/ld'; \ $(LINK_SO_O) && chmod a=rx $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX link_a.hpux32: @@ -449,9 +544,15 @@ link_a.hpux32: LIBDEPS="$(LIBDEPS) -lc"; \ ALLSYMSFLAGS='-Fl'; \ NOALLSYMSFLAGS=''; \ - SHAREDFLAGS="+vnocompatwarnings -b -z +s +h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"; \ + SHAREDFLAGS="+vnocompatwarnings -b -z +s +h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX +b $(LIBRPATH)"; \ SHAREDCMD='/usr/ccs/bin/ld'; \ $(LINK_SO_A) && chmod a=rx $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX +link_app.hpux32: + LDCMD=$(CC);\ + LDFLAGS="-Wl,+b,$(LIBRPATH)"; \ + LIBDEPS="$(LIBDEPS) -lc"; \ + APPNAME="$(APPNAME)" + $(LINK_APP) # HP-UX includes the full pathname of libs we depend on, so we would get # ./libcrypto (with ./ as path information) compiled into libssl, hence @@ -468,7 +569,7 @@ link_o.hpux64: LIBDEPS="$(LIBDEPS) -lc"; \ ALLSYMSFLAGS='+forceload'; \ NOALLSYMSFLAGS=''; \ - SHAREDFLAGS="-b -z +h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"; \ + SHAREDFLAGS="-b -z +h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX +b $(LIBRPATH)"; \ SHAREDCMD='/usr/ccs/bin/ld'; \ $(LINK_SO_O) && chmod a=rx $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX link_a.hpux64: @@ -478,9 +579,15 @@ link_a.hpux64: LIBDEPS="$(LIBDEPS) -lc"; \ ALLSYMSFLAGS='+forceload'; \ NOALLSYMSFLAGS=''; \ - SHAREDFLAGS="-b -z +h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"; \ + SHAREDFLAGS="-b -z +h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX +b $(LIBRPATH)"; \ SHAREDCMD='/usr/ccs/bin/ld'; \ $(LINK_SO_A) && chmod a=rx $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX +link_app.hpux64: + LDCMD=$(CC);\ + LDFLAGS="-Wl,+b,$(LIBRPATH)"; \ + LIBDEPS="$(LIBDEPS) -lc"; \ + APPNAME="$(APPNAME)" + $(LINK_APP) link_o.aix: @ $(CALC_VERSIONS); \ @@ -489,7 +596,7 @@ link_o.aix: LIBDEPS="$(LIBDEPS) -lc"; \ ALLSYMSFLAGS='-bnogc'; \ NOALLSYMSFLAGS=''; \ - SHAREDFLAGS='-G -bE:lib$(LIBNAME).exp -bM:SRE'; \ + SHAREDFLAGS='-G -bE:lib$(LIBNAME).exp -bM:SRE -blibpath:$(LIBRPATH)'; \ SHAREDCMD='$(CC)'; \ $(LINK_SO_O) link_a.aix: @@ -499,9 +606,15 @@ link_a.aix: LIBDEPS="$(LIBDEPS) -lc"; \ ALLSYMSFLAGS='-bnogc'; \ NOALLSYMSFLAGS=''; \ - SHAREDFLAGS='-G -bE:lib$(LIBNAME).exp -bM:SRE'; \ + SHAREDFLAGS='-G -bE:lib$(LIBNAME).exp -bM:SRE -blibpath:$(LIBRPATH)'; \ SHAREDCMD='$(CC)'; \ $(LINK_SO_A_VIA_O) +link_app.aix: + LDCMD=$(CC);\ + LDFLAGS="-blibpath:$(LIBRPATH)"; \ + LIBDEPS="$(LIBDEPS) -lc"; \ + APPNAME="$(APPNAME)" + $(LINK_APP) link_o.reliantunix: @ $(CALC_VERSIONS); \ @@ -523,6 +636,12 @@ link_a.reliantunix: SHAREDFLAGS='-G'; \ SHAREDCMD='$(CC)'; \ $(LINK_SO_A_UNPACKED) +link_app.reliantunix: + LDCMD=$(CC);\ + LDFLAGS=""; \ + LIBDEPS="$(LIBDEPS) -lc"; \ + APPNAME="$(APPNAME)" + $(LINK_APP) # Targets to build symbolic links when needed symlink.gnu symlink.solaris symlink.svr3 symlink.irix \ @@ -545,43 +664,57 @@ symlink.cygwin symlib.alpha-osf1 symlink.tru64 symlink.tru64-rpath: # Compatibility targets link_o.bsd-gcc-shared link_o.linux-shared link_o.gnu-shared: link_o.gnu link_a.bsd-gcc-shared link_a.linux-shared link_a.gnu-shared: link_a.gnu +link_app.bsd-gcc-shared link_app.linux-shared link_app.gnu-shared: link_app.gnu symlink.bsd-gcc-shared symlink.linux-shared symlink.gnu-shared: symlink.gnu link_o.darwin-shared: link_o.darwin link_a.darwin-shared: link_a.darwin +link_app.darwin-shared: link_app.darwin symlink.darwin-shared: symlink.darwin link_o.cygwin-shared: link_o.cygwin link_a.cygwin-shared: link_a.cygwin +link_app.cygwin-shared: link_app.cygwin symlink.cygwin-shared: symlink.cygwin link_o.alpha-osf1-shared: link_o.alpha-osf1 link_a.alpha-osf1-shared: link_a.alpha-osf1 +link_app.alpha-osf1-shared: link_app.alpha-osf1 symlink.alpha-osf1-shared: symlink.alpha-osf1 link_o.tru64-shared: link_o.tru64 link_a.tru64-shared: link_a.tru64 +link_app.tru64-shared: link_app.tru64 symlink.tru64-shared: symlink.tru64 link_o.tru64-shared-rpath: link_o.tru64-rpath link_a.tru64-shared-rpath: link_a.tru64-rpath +link_app.tru64-shared-rpath: link_app.tru64-rpath symlink.tru64-shared-rpath: symlink.tru64-rpath link_o.solaris-shared: link_o.solaris link_a.solaris-shared: link_a.solaris +link_app.solaris-shared: link_app.solaris symlink.solaris-shared: symlink.solaris link_o.svr3-shared: link_o.svr3 link_a.svr3-shared: link_a.svr3 +link_app.svr3-shared: link_app.svr3 symlink.svr3-shared: symlink.svr3 link_o.svr5-shared: link_o.svr3 link_a.svr5-shared: link_a.svr3 +link_app.svr5-shared: link_app.svr3 symlink.svr5-shared: symlink.svr3 link_o.irix-shared: link_o.irix link_a.irix-shared: link_a.irix +link_app.irix-shared: link_app.irix symlink.irix-shared: symlink.irix link_o.hpux-shared: link_o.hpux32 link_a.hpux-shared: link_a.hpux32 +link_app.hpux-shared: link_app.hpux32 symlink.hpux-shared: symlink.hpux32 link_o.hpux64-shared: link_o.hpux64 link_a.hpux64-shared: link_a.hpux64 +link_app.hpux64-shared: link_app.hpux64 symlink.hpux64-shared: symlink.hpux64 link_o.aix-shared: link_o.aix link_a.aix-shared: link_a.aix +link_app.aix-shared: link_app.aix symlink.aix-shared: symlink.aix link_o.reliantunix-shared: link_o.reliantunix link_a.reliantunix-shared: link_a.reliantunix +link_app.reliantunix-shared: link_app.reliantunix symlink.reliantunix-shared: symlink.reliantunix -- cgit v1.2.3