1160814Ssimon# 2160814Ssimon# Helper makefile to link shared libraries in a portable way. 3160814Ssimon# This is much simpler than libtool, and hopefully not too error-prone. 4160814Ssimon# 5160814Ssimon# The following variables need to be set on the command line to build 6160814Ssimon# properly 7160814Ssimon 8160814Ssimon# CC contains the current compiler. This one MUST be defined 9160814SsimonCC=cc 10160814SsimonCFLAGS=$(CFLAG) 11160814Ssimon# LDFLAGS contains flags to be used when temporary object files (when building 12160814Ssimon# shared libraries) are created, or when an application is linked. 13160814Ssimon# SHARED_LDFLAGS contains flags to be used when the shared library is created. 14160814SsimonLDFLAGS= 15160814SsimonSHARED_LDFLAGS= 16160814Ssimon 17238405SjkimNM=nm 18238405Sjkim 19160814Ssimon# LIBNAME contains just the name of the library, without prefix ("lib" 20160814Ssimon# on Unix, "cyg" for certain forms under Cygwin...) or suffix (.a, .so, 21160814Ssimon# .dll, ...). This one MUST have a value when using this makefile to 22160814Ssimon# build shared libraries. 23160814Ssimon# For example, to build libfoo.so, you need to do the following: 24160814Ssimon#LIBNAME=foo 25160814SsimonLIBNAME= 26160814Ssimon 27160814Ssimon# APPNAME contains just the name of the application, without suffix ("" 28160814Ssimon# on Unix, ".exe" on Windows, ...). This one MUST have a value when using 29160814Ssimon# this makefile to build applications. 30160814Ssimon# For example, to build foo, you need to do the following: 31160814Ssimon#APPNAME=foo 32160814SsimonAPPNAME= 33160814Ssimon 34160814Ssimon# OBJECTS contains all the object files to link together into the application. 35160814Ssimon# This must contain at least one object file. 36160814Ssimon#OBJECTS=foo.o 37160814SsimonOBJECTS= 38160814Ssimon 39160814Ssimon# LIBEXTRAS contains extra modules to link together with the library. 40160814Ssimon# For example, if a second library, say libbar.a needs to be linked into 41160814Ssimon# libfoo.so, you need to do the following: 42160814Ssimon#LIBEXTRAS=libbar.a 43160814Ssimon# Note that this MUST be used when using the link_o targets, to hold the 44160814Ssimon# names of all object files that go into the target library. 45160814SsimonLIBEXTRAS= 46160814Ssimon 47160814Ssimon# LIBVERSION contains the current version of the library. 48160814Ssimon# For example, to build libfoo.so.1.2, you need to do the following: 49160814Ssimon#LIBVERSION=1.2 50160814SsimonLIBVERSION= 51160814Ssimon 52160814Ssimon# LIBCOMPATVERSIONS contains the compatibility versions (a list) of 53160814Ssimon# the library. They MUST be in decreasing order. 54160814Ssimon# For example, if libfoo.so.1.2.1 is backward compatible with libfoo.so.1.2 55160814Ssimon# and libfoo.so.1, you need to do the following: 56160814Ssimon#LIBCOMPATVERSIONS=1.2 1 57160814Ssimon# Note that on systems that use sonames, the last number will appear as 58160814Ssimon# part of it. 59160814Ssimon# It's also possible, for systems that support it (Tru64, for example), 60160814Ssimon# to add extra compatibility info with more precision, by adding a second 61160814Ssimon# list of versions, separated from the first with a semicolon, like this: 62160814Ssimon#LIBCOMPATVERSIONS=1.2 1;1.2.0 1.1.2 1.1.1 1.1.0 1.0.0 63160814SsimonLIBCOMPATVERSIONS= 64160814Ssimon 65160814Ssimon# LIBDEPS contains all the flags necessary to cover all necessary 66160814Ssimon# dependencies to other libraries. 67160814SsimonLIBDEPS= 68160814Ssimon 69160814Ssimon#------------------------------------------------------------------------------ 70160814Ssimon# The rest is private to this makefile. 71160814Ssimon 72160814SsimonSET_X=: 73160814Ssimon#SET_X=set -x 74160814Ssimon 75160814Ssimontop: 76160814Ssimon echo "Trying to use this makefile interactively? Don't." 77160814Ssimon 78160814SsimonCALC_VERSIONS= \ 79160814Ssimon SHLIB_COMPAT=; SHLIB_SOVER=; \ 80160814Ssimon if [ -n "$(LIBVERSION)$(LIBCOMPATVERSIONS)" ]; then \ 81160814Ssimon prev=""; \ 82160814Ssimon for v in `echo "$(LIBVERSION) $(LIBCOMPATVERSIONS)" | cut -d';' -f1`; do \ 83160814Ssimon SHLIB_SOVER_NODOT=$$v; \ 84160814Ssimon SHLIB_SOVER=.$$v; \ 85160814Ssimon if [ -n "$$prev" ]; then \ 86160814Ssimon SHLIB_COMPAT="$$SHLIB_COMPAT .$$prev"; \ 87160814Ssimon fi; \ 88160814Ssimon prev=$$v; \ 89160814Ssimon done; \ 90160814Ssimon fi 91160814Ssimon 92160814SsimonLINK_APP= \ 93160814Ssimon ( $(SET_X); \ 94160814Ssimon LIBDEPS="$${LIBDEPS:-$(LIBDEPS)}"; \ 95160814Ssimon LDCMD="$${LDCMD:-$(CC)}"; LDFLAGS="$${LDFLAGS:-$(CFLAGS)}"; \ 96238405Sjkim LIBPATH=`for x in $$LIBDEPS; do echo $$x; done | sed -e 's/^ *-L//;t' -e d | uniq`; \ 97160814Ssimon LIBPATH=`echo $$LIBPATH | sed -e 's/ /:/g'`; \ 98160814Ssimon LD_LIBRARY_PATH=$$LIBPATH:$$LD_LIBRARY_PATH \ 99160814Ssimon $${LDCMD} $${LDFLAGS} -o $${APPNAME:=$(APPNAME)} $(OBJECTS) $${LIBDEPS} ) 100160814Ssimon 101160814SsimonLINK_SO= \ 102160814Ssimon ( $(SET_X); \ 103160814Ssimon LIBDEPS="$${LIBDEPS:-$(LIBDEPS)}"; \ 104160814Ssimon SHAREDCMD="$${SHAREDCMD:-$(CC)}"; \ 105160814Ssimon SHAREDFLAGS="$${SHAREDFLAGS:-$(CFLAGS) $(SHARED_LDFLAGS)}"; \ 106238405Sjkim LIBPATH=`for x in $$LIBDEPS; do echo $$x; done | sed -e 's/^ *-L//;t' -e d | uniq`; \ 107160814Ssimon LIBPATH=`echo $$LIBPATH | sed -e 's/ /:/g'`; \ 108160814Ssimon LD_LIBRARY_PATH=$$LIBPATH:$$LD_LIBRARY_PATH \ 109160814Ssimon $${SHAREDCMD} $${SHAREDFLAGS} \ 110160814Ssimon -o $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX \ 111160814Ssimon $$ALLSYMSFLAGS $$SHOBJECTS $$NOALLSYMSFLAGS $$LIBDEPS \ 112194206Ssimon ) && $(SYMLINK_SO) 113160814Ssimon 114160814SsimonSYMLINK_SO= \ 115160814Ssimon if [ -n "$$INHIBIT_SYMLINKS" ]; then :; else \ 116160814Ssimon prev=$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX; \ 117160814Ssimon if [ -n "$$SHLIB_COMPAT" ]; then \ 118160814Ssimon for x in $$SHLIB_COMPAT; do \ 119160814Ssimon ( $(SET_X); rm -f $$SHLIB$$x$$SHLIB_SUFFIX; \ 120160814Ssimon ln -s $$prev $$SHLIB$$x$$SHLIB_SUFFIX ); \ 121160814Ssimon prev=$$SHLIB$$x$$SHLIB_SUFFIX; \ 122160814Ssimon done; \ 123160814Ssimon fi; \ 124160814Ssimon if [ -n "$$SHLIB_SOVER" ]; then \ 125160814Ssimon ( $(SET_X); rm -f $$SHLIB$$SHLIB_SUFFIX; \ 126160814Ssimon ln -s $$prev $$SHLIB$$SHLIB_SUFFIX ); \ 127160814Ssimon fi; \ 128160814Ssimon fi 129160814Ssimon 130160814SsimonLINK_SO_A= SHOBJECTS="lib$(LIBNAME).a $(LIBEXTRAS)"; $(LINK_SO) 131160814SsimonLINK_SO_O= SHOBJECTS="$(LIBEXTRAS)"; $(LINK_SO) 132160814Ssimon 133160814SsimonLINK_SO_A_VIA_O= \ 134160814Ssimon SHOBJECTS=lib$(LIBNAME).o; \ 135160814Ssimon ALL=$$ALLSYMSFLAGS; ALLSYMSFLAGS=; NOALLSYMSFLAGS=; \ 136160814Ssimon ( $(SET_X); \ 137160814Ssimon ld $(LDFLAGS) -r -o lib$(LIBNAME).o $$ALL lib$(LIBNAME).a $(LIBEXTRAS) ); \ 138238405Sjkim $(LINK_SO) && rm -f lib$(LIBNAME).o 139160814Ssimon 140160814SsimonLINK_SO_A_UNPACKED= \ 141160814Ssimon UNPACKDIR=link_tmp.$$$$; rm -rf $$UNPACKDIR; mkdir $$UNPACKDIR; \ 142160814Ssimon (cd $$UNPACKDIR; ar x ../lib$(LIBNAME).a) && \ 143160814Ssimon ([ -z "$(LIBEXTRAS)" ] || cp $(LIBEXTRAS) $$UNPACKDIR) && \ 144160814Ssimon SHOBJECTS=$$UNPACKDIR/*.o; \ 145160814Ssimon $(LINK_SO) && rm -rf $$UNPACKDIR 146160814Ssimon 147238405SjkimDETECT_GNU_LD=($(CC) -Wl,-V /dev/null 2>&1 | grep '^GNU ld' )>/dev/null 148160814Ssimon 149160814SsimonDO_GNU_SO=$(CALC_VERSIONS); \ 150160814Ssimon SHLIB=lib$(LIBNAME).so; \ 151160814Ssimon SHLIB_SUFFIX=; \ 152160814Ssimon ALLSYMSFLAGS='-Wl,--whole-archive'; \ 153160814Ssimon NOALLSYMSFLAGS='-Wl,--no-whole-archive'; \ 154160814Ssimon SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared -Wl,-Bsymbolic -Wl,-soname=$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX" 155160814Ssimon 156160814SsimonDO_GNU_APP=LDFLAGS="$(CFLAGS) -Wl,-rpath,$(LIBRPATH)" 157160814Ssimon 158160814Ssimon#This is rather special. It's a special target with which one can link 159160814Ssimon#applications without bothering with any features that have anything to 160160814Ssimon#do with shared libraries, for example when linking against static 161160814Ssimon#libraries. It's mostly here to avoid a lot of conditionals everywhere 162160814Ssimon#else... 163160814Ssimonlink_app.: 164160814Ssimon $(LINK_APP) 165160814Ssimon 166160814Ssimonlink_o.gnu: 167160814Ssimon @ $(DO_GNU_SO); $(LINK_SO_O) 168160814Ssimonlink_a.gnu: 169160814Ssimon @ $(DO_GNU_SO); $(LINK_SO_A) 170160814Ssimonlink_app.gnu: 171160814Ssimon @ $(DO_GNU_APP); $(LINK_APP) 172160814Ssimon 173238405SjkimDO_BEOS_SO= SHLIB=lib$(LIBNAME).so; \ 174238405Sjkim SHLIB_SUFFIX=; \ 175238405Sjkim ALLSYMSFLAGS='-Wl,--whole-archive'; \ 176238405Sjkim NOALLSYMSFLAGS='-Wl,--no-whole-archive'; \ 177238405Sjkim SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared -Wl,-Bsymbolic -Wl,-soname=$$SHLIB$$SHLIB_SUFFIX" 178238405Sjkim 179238405Sjkimlink_o.beos: 180238405Sjkim @ $(DO_BEOS_SO); $(LINK_SO_O) 181238405Sjkimlink_a.beos: 182238405Sjkim @ $(DO_BEOS_SO); $(LINK_SO_A) 183238405Sjkim 184160814Ssimonlink_o.bsd: 185238405Sjkim @if $(DETECT_GNU_LD); then $(DO_GNU_SO); else \ 186160814Ssimon $(CALC_VERSIONS); \ 187160814Ssimon SHLIB=lib$(LIBNAME).so; \ 188160814Ssimon SHLIB_SUFFIX=; \ 189160814Ssimon LIBDEPS=" "; \ 190160814Ssimon ALLSYMSFLAGS="-Wl,-Bforcearchive"; \ 191160814Ssimon NOALLSYMSFLAGS=; \ 192160814Ssimon SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared -nostdlib"; \ 193160814Ssimon fi; $(LINK_SO_O) 194160814Ssimonlink_a.bsd: 195238405Sjkim @if $(DETECT_GNU_LD); then $(DO_GNU_SO); else \ 196160814Ssimon $(CALC_VERSIONS); \ 197160814Ssimon SHLIB=lib$(LIBNAME).so; \ 198160814Ssimon SHLIB_SUFFIX=; \ 199160814Ssimon LIBDEPS=" "; \ 200160814Ssimon ALLSYMSFLAGS="-Wl,-Bforcearchive"; \ 201160814Ssimon NOALLSYMSFLAGS=; \ 202160814Ssimon SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared -nostdlib"; \ 203160814Ssimon fi; $(LINK_SO_A) 204160814Ssimonlink_app.bsd: 205238405Sjkim @if $(DETECT_GNU_LD); then $(DO_GNU_APP); else \ 206160814Ssimon LDFLAGS="$(CFLAGS) -Wl,-rpath,$(LIBPATH)"; \ 207160814Ssimon fi; $(LINK_APP) 208160814Ssimon 209160814Ssimon# For Darwin AKA Mac OS/X (dyld) 210238405Sjkim# Originally link_o.darwin produced .so, because it was hard-coded 211238405Sjkim# in dso_dlfcn module. At later point dso_dlfcn switched to .dylib 212238405Sjkim# extension in order to allow for run-time linking with vendor- 213238405Sjkim# supplied shared libraries such as libz, so that link_o.darwin had 214238405Sjkim# to be harmonized with it. This caused minor controversy, because 215238405Sjkim# it was believed that dlopen can't be used to dynamically load 216238405Sjkim# .dylib-s, only so called bundle modules (ones linked with -bundle 217238405Sjkim# flag). The belief seems to be originating from pre-10.4 release, 218238405Sjkim# where dlfcn functionality was emulated by dlcompat add-on. In 219238405Sjkim# 10.4 dlopen was rewritten as native part of dyld and is documented 220238405Sjkim# to be capable of loading both dynamic libraries and bundles. In 221238405Sjkim# order to provide compatibility with pre-10.4 dlopen, modules are 222238405Sjkim# linked with -bundle flag, which makes .dylib extension misleading. 223238405Sjkim# It works, because dlopen is [and always was] extension-agnostic. 224238405Sjkim# Alternative to this heuristic approach is to develop specific 225238405Sjkim# MacOS X dso module relying on whichever "native" dyld interface. 226160814Ssimonlink_o.darwin: 227160814Ssimon @ $(CALC_VERSIONS); \ 228238405Sjkim SHLIB=lib$(LIBNAME); \ 229238405Sjkim SHLIB_SUFFIX=.dylib; \ 230160814Ssimon ALLSYMSFLAGS='-all_load'; \ 231160814Ssimon NOALLSYMSFLAGS=''; \ 232238405Sjkim SHAREDFLAGS="$(CFLAGS) `echo $(SHARED_LDFLAGS) | sed s/dynamiclib/bundle/`"; \ 233160814Ssimon if [ -n "$(LIBVERSION)" ]; then \ 234160814Ssimon SHAREDFLAGS="$$SHAREDFLAGS -current_version $(LIBVERSION)"; \ 235160814Ssimon fi; \ 236160814Ssimon if [ -n "$$SHLIB_SOVER_NODOT" ]; then \ 237160814Ssimon SHAREDFLAGS="$$SHAREDFLAGS -compatibility_version $$SHLIB_SOVER_NODOT"; \ 238160814Ssimon fi; \ 239160814Ssimon $(LINK_SO_O) 240160814Ssimonlink_a.darwin: 241160814Ssimon @ $(CALC_VERSIONS); \ 242160814Ssimon SHLIB=lib$(LIBNAME); \ 243160814Ssimon SHLIB_SUFFIX=.dylib; \ 244160814Ssimon ALLSYMSFLAGS='-all_load'; \ 245160814Ssimon NOALLSYMSFLAGS=''; \ 246160814Ssimon SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS)"; \ 247160814Ssimon if [ -n "$(LIBVERSION)" ]; then \ 248160814Ssimon SHAREDFLAGS="$$SHAREDFLAGS -current_version $(LIBVERSION)"; \ 249160814Ssimon fi; \ 250160814Ssimon if [ -n "$$SHLIB_SOVER_NODOT" ]; then \ 251160814Ssimon SHAREDFLAGS="$$SHAREDFLAGS -compatibility_version $$SHLIB_SOVER_NODOT"; \ 252160814Ssimon fi; \ 253238405Sjkim SHAREDFLAGS="$$SHAREDFLAGS -install_name $(INSTALLTOP)/$(LIBDIR)/$$SHLIB$(SHLIB_EXT)"; \ 254160814Ssimon $(LINK_SO_A) 255160814Ssimonlink_app.darwin: # is there run-path on darwin? 256160814Ssimon $(LINK_APP) 257160814Ssimon 258160814Ssimonlink_o.cygwin: 259160814Ssimon @ $(CALC_VERSIONS); \ 260160814Ssimon INHIBIT_SYMLINKS=yes; \ 261160814Ssimon SHLIB=cyg$(LIBNAME); \ 262194206Ssimon base=-Wl,--enable-auto-image-base; \ 263238405Sjkim deffile=; \ 264194206Ssimon if expr $(PLATFORM) : 'mingw' > /dev/null; then \ 265194206Ssimon SHLIB=$(LIBNAME)eay32; base=; \ 266238405Sjkim if test -f $(LIBNAME)eay32.def; then \ 267238405Sjkim deffile=$(LIBNAME)eay32.def; \ 268238405Sjkim fi; \ 269194206Ssimon fi; \ 270160814Ssimon SHLIB_SUFFIX=.dll; \ 271160814Ssimon LIBVERSION="$(LIBVERSION)"; \ 272160814Ssimon SHLIB_SOVER=${LIBVERSION:+"-$(LIBVERSION)"}; \ 273160814Ssimon ALLSYMSFLAGS='-Wl,--whole-archive'; \ 274160814Ssimon NOALLSYMSFLAGS='-Wl,--no-whole-archive'; \ 275296279Sjkim SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared $$base $$deffile -Wl,-Bsymbolic"; \ 276160814Ssimon $(LINK_SO_O) 277238405Sjkim#for mingw target if def-file is in use dll-name should match library-name 278160814Ssimonlink_a.cygwin: 279160814Ssimon @ $(CALC_VERSIONS); \ 280160814Ssimon INHIBIT_SYMLINKS=yes; \ 281238405Sjkim SHLIB=cyg$(LIBNAME); SHLIB_SOVER=-$(LIBVERSION); SHLIB_SUFFIX=.dll; \ 282238405Sjkim dll_name=$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX; extras=; \ 283194206Ssimon base=-Wl,--enable-auto-image-base; \ 284194206Ssimon if expr $(PLATFORM) : 'mingw' > /dev/null; then \ 285238405Sjkim case $(LIBNAME) in \ 286238405Sjkim crypto) SHLIB=libeay;; \ 287238405Sjkim ssl) SHLIB=ssleay;; \ 288238405Sjkim esac; \ 289238405Sjkim SHLIB_SOVER=32; \ 290238405Sjkim extras="$(LIBNAME).def"; \ 291238405Sjkim $(PERL) util/mkdef.pl 32 $$SHLIB > $$extras; \ 292296279Sjkim base=; [ $(LIBNAME) = "crypto" -a -n "$(FIPSCANLIB)" ] && base=-Wl,--image-base,0x63000000; \ 293194206Ssimon fi; \ 294238405Sjkim dll_name=$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX; \ 295238405Sjkim $(PERL) util/mkrc.pl $$dll_name | \ 296306195Sjkim $(RC) -o rc.o; \ 297238405Sjkim extras="$$extras rc.o"; \ 298160814Ssimon ALLSYMSFLAGS='-Wl,--whole-archive'; \ 299160814Ssimon NOALLSYMSFLAGS='-Wl,--no-whole-archive'; \ 300296279Sjkim SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared $$base -Wl,-Bsymbolic -Wl,--out-implib,lib$(LIBNAME).dll.a $$extras"; \ 301238405Sjkim [ -f apps/$$dll_name ] && rm apps/$$dll_name; \ 302238405Sjkim [ -f test/$$dll_name ] && rm test/$$dll_name; \ 303160814Ssimon $(LINK_SO_A) || exit 1; \ 304238405Sjkim rm $$extras; \ 305238405Sjkim cp -p $$dll_name apps/; \ 306238405Sjkim cp -p $$dll_name test/ 307160814Ssimonlink_app.cygwin: 308238405Sjkim @if expr "$(CFLAGS)" : '.*OPENSSL_USE_APPLINK' > /dev/null; then \ 309238405Sjkim LIBDEPS="$(TOP)/crypto/applink.o $${LIBDEPS:-$(LIBDEPS)}"; \ 310238405Sjkim export LIBDEPS; \ 311238405Sjkim fi; \ 312160814Ssimon $(LINK_APP) 313160814Ssimon 314160814Ssimonlink_o.alpha-osf1: 315238405Sjkim @ if $(DETECT_GNU_LD); then \ 316160814Ssimon $(DO_GNU_SO); \ 317160814Ssimon else \ 318160814Ssimon SHLIB=lib$(LIBNAME).so; \ 319160814Ssimon SHLIB_SUFFIX=; \ 320160814Ssimon SHLIB_HIST=`echo "$(LIBCOMPATVERSIONS)" | cut -d';' -f2 | sed -e 's/ */:/'`; \ 321160814Ssimon if [ -n "$$SHLIB_HIST" ]; then \ 322160814Ssimon SHLIB_HIST="$${SHLIB_HIST}:$(LIBVERSION)"; \ 323160814Ssimon else \ 324160814Ssimon SHLIB_HIST="$(LIBVERSION)"; \ 325160814Ssimon fi; \ 326160814Ssimon SHLIB_SOVER=; \ 327160814Ssimon ALLSYMSFLAGS='-all'; \ 328160814Ssimon NOALLSYMSFLAGS='-none'; \ 329194206Ssimon SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared -Wl,-B,symbolic"; \ 330160814Ssimon if [ -n "$$SHLIB_HIST" ]; then \ 331160814Ssimon SHAREDFLAGS="$$SHAREDFLAGS -set_version $$SHLIB_HIST"; \ 332160814Ssimon fi; \ 333160814Ssimon fi; \ 334160814Ssimon $(LINK_SO_O) 335160814Ssimonlink_a.alpha-osf1: 336238405Sjkim @ if $(DETECT_GNU_LD); then \ 337160814Ssimon $(DO_GNU_SO); \ 338160814Ssimon else \ 339160814Ssimon SHLIB=lib$(LIBNAME).so; \ 340160814Ssimon SHLIB_SUFFIX=; \ 341160814Ssimon SHLIB_HIST=`echo "$(LIBCOMPATVERSIONS)" | cut -d';' -f2 | sed -e 's/ */:/'`; \ 342160814Ssimon if [ -n "$$SHLIB_HIST" ]; then \ 343160814Ssimon SHLIB_HIST="$${SHLIB_HIST}:$(LIBVERSION)"; \ 344160814Ssimon else \ 345160814Ssimon SHLIB_HIST="$(LIBVERSION)"; \ 346160814Ssimon fi; \ 347160814Ssimon SHLIB_SOVER=; \ 348160814Ssimon ALLSYMSFLAGS='-all'; \ 349160814Ssimon NOALLSYMSFLAGS='-none'; \ 350194206Ssimon SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared -Wl,-B,symbolic"; \ 351160814Ssimon if [ -n "$$SHLIB_HIST" ]; then \ 352160814Ssimon SHAREDFLAGS="$$SHAREDFLAGS -set_version $$SHLIB_HIST"; \ 353160814Ssimon fi; \ 354160814Ssimon fi; \ 355160814Ssimon $(LINK_SO_A) 356160814Ssimonlink_app.alpha-osf1: 357238405Sjkim @if $(DETECT_GNU_LD); then \ 358160814Ssimon $(DO_GNU_APP); \ 359160814Ssimon else \ 360160814Ssimon LDFLAGS="$(CFLAGS) -rpath $(LIBRPATH)"; \ 361160814Ssimon fi; \ 362160814Ssimon $(LINK_APP) 363160814Ssimon 364160814Ssimonlink_o.solaris: 365238405Sjkim @ if $(DETECT_GNU_LD); then \ 366160814Ssimon $(DO_GNU_SO); \ 367160814Ssimon else \ 368160814Ssimon $(CALC_VERSIONS); \ 369160814Ssimon MINUSZ='-z '; \ 370160814Ssimon ($(CC) -v 2>&1 | grep gcc) > /dev/null && MINUSZ='-Wl,-z,'; \ 371160814Ssimon SHLIB=lib$(LIBNAME).so; \ 372160814Ssimon SHLIB_SUFFIX=; \ 373160814Ssimon ALLSYMSFLAGS="$${MINUSZ}allextract"; \ 374160814Ssimon NOALLSYMSFLAGS="$${MINUSZ}defaultextract"; \ 375160814Ssimon SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX -Wl,-Bsymbolic"; \ 376160814Ssimon fi; \ 377160814Ssimon $(LINK_SO_O) 378160814Ssimonlink_a.solaris: 379238405Sjkim @ if $(DETECT_GNU_LD); then \ 380160814Ssimon $(DO_GNU_SO); \ 381160814Ssimon else \ 382160814Ssimon $(CALC_VERSIONS); \ 383160814Ssimon MINUSZ='-z '; \ 384238405Sjkim ($(CC) -v 2>&1 | grep gcc) > /dev/null && MINUSZ='-Wl,-z,'; \ 385160814Ssimon SHLIB=lib$(LIBNAME).so; \ 386160814Ssimon SHLIB_SUFFIX=;\ 387160814Ssimon ALLSYMSFLAGS="$${MINUSZ}allextract"; \ 388160814Ssimon NOALLSYMSFLAGS="$${MINUSZ}defaultextract"; \ 389160814Ssimon SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX -Wl,-Bsymbolic"; \ 390160814Ssimon fi; \ 391160814Ssimon $(LINK_SO_A) 392160814Ssimonlink_app.solaris: 393238405Sjkim @ if $(DETECT_GNU_LD); then \ 394160814Ssimon $(DO_GNU_APP); \ 395160814Ssimon else \ 396160814Ssimon LDFLAGS="$(CFLAGS) -R $(LIBRPATH)"; \ 397160814Ssimon fi; \ 398160814Ssimon $(LINK_APP) 399160814Ssimon 400160814Ssimon# OpenServer 5 native compilers used 401160814Ssimonlink_o.svr3: 402238405Sjkim @ if $(DETECT_GNU_LD); then \ 403160814Ssimon $(DO_GNU_SO); \ 404160814Ssimon else \ 405160814Ssimon $(CALC_VERSIONS); \ 406160814Ssimon SHLIB=lib$(LIBNAME).so; \ 407160814Ssimon SHLIB_SUFFIX=; \ 408160814Ssimon ALLSYMSFLAGS=''; \ 409160814Ssimon NOALLSYMSFLAGS=''; \ 410160814Ssimon SHAREDFLAGS="$(CFLAGS) -G -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"; \ 411160814Ssimon fi; \ 412160814Ssimon $(LINK_SO_O) 413160814Ssimonlink_a.svr3: 414238405Sjkim @ if $(DETECT_GNU_LD); then \ 415160814Ssimon $(DO_GNU_SO); \ 416160814Ssimon else \ 417160814Ssimon $(CALC_VERSIONS); \ 418160814Ssimon SHLIB=lib$(LIBNAME).so; \ 419160814Ssimon SHLIB_SUFFIX=; \ 420160814Ssimon ALLSYMSFLAGS=''; \ 421160814Ssimon NOALLSYMSFLAGS=''; \ 422160814Ssimon SHAREDFLAGS="$(CFLAGS) -G -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"; \ 423160814Ssimon fi; \ 424160814Ssimon $(LINK_SO_A_UNPACKED) 425160814Ssimonlink_app.svr3: 426238405Sjkim @$(DETECT_GNU_LD) && $(DO_GNU_APP); \ 427160814Ssimon $(LINK_APP) 428160814Ssimon 429160814Ssimon# UnixWare 7 and OpenUNIX 8 native compilers used 430160814Ssimonlink_o.svr5: 431238405Sjkim @ if $(DETECT_GNU_LD); then \ 432160814Ssimon $(DO_GNU_SO); \ 433160814Ssimon else \ 434160814Ssimon $(CALC_VERSIONS); \ 435160814Ssimon SHARE_FLAG='-G'; \ 436160814Ssimon ($(CC) -v 2>&1 | grep gcc) > /dev/null && SHARE_FLAG='-shared'; \ 437160814Ssimon SHLIB=lib$(LIBNAME).so; \ 438160814Ssimon SHLIB_SUFFIX=; \ 439160814Ssimon ALLSYMSFLAGS=''; \ 440160814Ssimon NOALLSYMSFLAGS=''; \ 441160814Ssimon SHAREDFLAGS="$(CFLAGS) $${SHARE_FLAG} -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"; \ 442160814Ssimon fi; \ 443160814Ssimon $(LINK_SO_O) 444160814Ssimonlink_a.svr5: 445238405Sjkim @ if $(DETECT_GNU_LD); then \ 446160814Ssimon $(DO_GNU_SO); \ 447160814Ssimon else \ 448160814Ssimon $(CALC_VERSIONS); \ 449160814Ssimon SHARE_FLAG='-G'; \ 450238405Sjkim ($(CC) -v 2>&1 | grep gcc) > /dev/null && SHARE_FLAG='-shared'; \ 451160814Ssimon SHLIB=lib$(LIBNAME).so; \ 452160814Ssimon SHLIB_SUFFIX=; \ 453160814Ssimon ALLSYMSFLAGS=''; \ 454160814Ssimon NOALLSYMSFLAGS=''; \ 455160814Ssimon SHAREDFLAGS="$(CFLAGS) $${SHARE_FLAG} -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"; \ 456160814Ssimon fi; \ 457160814Ssimon $(LINK_SO_A_UNPACKED) 458160814Ssimonlink_app.svr5: 459238405Sjkim @$(DETECT_GNU_LD) && $(DO_GNU_APP); \ 460160814Ssimon $(LINK_APP) 461160814Ssimon 462160814Ssimonlink_o.irix: 463238405Sjkim @ if $(DETECT_GNU_LD); then \ 464160814Ssimon $(DO_GNU_SO); \ 465160814Ssimon else \ 466160814Ssimon $(CALC_VERSIONS); \ 467160814Ssimon SHLIB=lib$(LIBNAME).so; \ 468160814Ssimon SHLIB_SUFFIX=; \ 469160814Ssimon MINUSWL=""; \ 470160814Ssimon ($(CC) -v 2>&1 | grep gcc) > /dev/null && MINUSWL="-Wl,"; \ 471160814Ssimon ALLSYMSFLAGS="$${MINUSWL}-all"; \ 472160814Ssimon NOALLSYMSFLAGS="$${MINUSWL}-none"; \ 473194206Ssimon SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared -Wl,-soname,$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX,-B,symbolic"; \ 474160814Ssimon fi; \ 475160814Ssimon $(LINK_SO_O) 476160814Ssimonlink_a.irix: 477238405Sjkim @ if $(DETECT_GNU_LD); then \ 478160814Ssimon $(DO_GNU_SO); \ 479160814Ssimon else \ 480160814Ssimon $(CALC_VERSIONS); \ 481160814Ssimon SHLIB=lib$(LIBNAME).so; \ 482160814Ssimon SHLIB_SUFFIX=; \ 483160814Ssimon MINUSWL=""; \ 484160814Ssimon ($(CC) -v 2>&1 | grep gcc) > /dev/null && MINUSWL="-Wl,"; \ 485160814Ssimon ALLSYMSFLAGS="$${MINUSWL}-all"; \ 486160814Ssimon NOALLSYMSFLAGS="$${MINUSWL}-none"; \ 487194206Ssimon SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared -Wl,-soname,$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX,-B,symbolic"; \ 488160814Ssimon fi; \ 489160814Ssimon $(LINK_SO_A) 490160814Ssimonlink_app.irix: 491160814Ssimon @LDFLAGS="$(CFLAGS) -Wl,-rpath,$(LIBRPATH)"; \ 492160814Ssimon $(LINK_APP) 493160814Ssimon 494160814Ssimon# 32-bit PA-RISC HP-UX embeds the -L pathname of libs we link with, so 495160814Ssimon# we compensate for it with +cdp ../: and +cdp ./:. Yes, these rewrite 496160814Ssimon# rules imply that we can only link one level down in catalog structure, 497160814Ssimon# but that's what takes place for the moment of this writing. +cdp option 498160814Ssimon# was introduced in HP-UX 11.x and applies in 32-bit PA-RISC link 499160814Ssimon# editor context only [it's simply ignored in other cases, which are all 500160814Ssimon# ELFs by the way]. 501160814Ssimon# 502160814Ssimonlink_o.hpux: 503238405Sjkim @if $(DETECT_GNU_LD); then $(DO_GNU_SO); else \ 504160814Ssimon $(CALC_VERSIONS); \ 505160814Ssimon SHLIB=lib$(LIBNAME).sl; \ 506162911Ssimon expr "$(CFLAGS)" : '.*DSO_DLFCN' > /dev/null && SHLIB=lib$(LIBNAME).so; \ 507160814Ssimon SHLIB_SUFFIX=; \ 508160814Ssimon ALLSYMSFLAGS='-Wl,-Fl'; \ 509160814Ssimon NOALLSYMSFLAGS=''; \ 510160814Ssimon expr $(PLATFORM) : 'hpux64' > /dev/null && ALLSYMSFLAGS='-Wl,+forceload'; \ 511194206Ssimon SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -Wl,-B,symbolic,+vnocompatwarnings,-z,+s,+h,$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX,+cdp,../:,+cdp,./:"; \ 512160814Ssimon fi; \ 513160814Ssimon rm -f $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX || :; \ 514160814Ssimon $(LINK_SO_O) && chmod a=rx $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX 515160814Ssimonlink_a.hpux: 516238405Sjkim @if $(DETECT_GNU_LD); then $(DO_GNU_SO); else \ 517160814Ssimon $(CALC_VERSIONS); \ 518160814Ssimon SHLIB=lib$(LIBNAME).sl; \ 519160814Ssimon expr $(PLATFORM) : '.*ia64' > /dev/null && SHLIB=lib$(LIBNAME).so; \ 520160814Ssimon SHLIB_SUFFIX=; \ 521160814Ssimon ALLSYMSFLAGS='-Wl,-Fl'; \ 522160814Ssimon NOALLSYMSFLAGS=''; \ 523160814Ssimon expr $(PLATFORM) : 'hpux64' > /dev/null && ALLSYMSFLAGS='-Wl,+forceload'; \ 524194206Ssimon SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -Wl,-B,symbolic,+vnocompatwarnings,-z,+s,+h,$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX,+cdp,../:,+cdp,./:"; \ 525160814Ssimon fi; \ 526160814Ssimon rm -f $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX || :; \ 527160814Ssimon $(LINK_SO_A) && chmod a=rx $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX 528160814Ssimonlink_app.hpux: 529238405Sjkim @if $(DETECT_GNU_LD); then $(DO_GNU_APP); else \ 530160814Ssimon LDFLAGS="$(CFLAGS) -Wl,+s,+cdp,../:,+cdp,./:,+b,$(LIBRPATH)"; \ 531160814Ssimon fi; \ 532160814Ssimon $(LINK_APP) 533160814Ssimon 534160814Ssimonlink_o.aix: 535160814Ssimon @ $(CALC_VERSIONS); \ 536194206Ssimon OBJECT_MODE=`expr "x$(SHARED_LDFLAGS)" : 'x\-[a-z]*\(64\)'` || :; \ 537160814Ssimon OBJECT_MODE=$${OBJECT_MODE:-32}; export OBJECT_MODE; \ 538160814Ssimon SHLIB=lib$(LIBNAME).so; \ 539160814Ssimon SHLIB_SUFFIX=; \ 540194206Ssimon ALLSYMSFLAGS=''; \ 541160814Ssimon NOALLSYMSFLAGS=''; \ 542194206Ssimon SHAREDFLAGS='$(CFLAGS) $(SHARED_LDFLAGS) -Wl,-bexpall,-bnolibpath,-bM:SRE'; \ 543194206Ssimon $(LINK_SO_O); 544160814Ssimonlink_a.aix: 545160814Ssimon @ $(CALC_VERSIONS); \ 546194206Ssimon OBJECT_MODE=`expr "x$(SHARED_LDFLAGS)" : 'x\-[a-z]*\(64\)'` || : ; \ 547160814Ssimon OBJECT_MODE=$${OBJECT_MODE:-32}; export OBJECT_MODE; \ 548160814Ssimon SHLIB=lib$(LIBNAME).so; \ 549160814Ssimon SHLIB_SUFFIX=; \ 550160814Ssimon ALLSYMSFLAGS='-bnogc'; \ 551160814Ssimon NOALLSYMSFLAGS=''; \ 552194206Ssimon SHAREDFLAGS='$(CFLAGS) $(SHARED_LDFLAGS) -Wl,-bexpall,-bnolibpath,-bM:SRE'; \ 553160814Ssimon $(LINK_SO_A_VIA_O) 554160814Ssimonlink_app.aix: 555194206Ssimon LDFLAGS="$(CFLAGS) -Wl,-brtl,-blibpath:$(LIBRPATH):$${LIBPATH:-/usr/lib:/lib}"; \ 556160814Ssimon $(LINK_APP) 557160814Ssimon 558160814Ssimonlink_o.reliantunix: 559160814Ssimon @ $(CALC_VERSIONS); \ 560160814Ssimon SHLIB=lib$(LIBNAME).so; \ 561160814Ssimon SHLIB_SUFFIX=; \ 562160814Ssimon ALLSYMSFLAGS=; \ 563160814Ssimon NOALLSYMSFLAGS=''; \ 564160814Ssimon SHAREDFLAGS='$(CFLAGS) -G'; \ 565160814Ssimon $(LINK_SO_O) 566160814Ssimonlink_a.reliantunix: 567160814Ssimon @ $(CALC_VERSIONS); \ 568160814Ssimon SHLIB=lib$(LIBNAME).so; \ 569160814Ssimon SHLIB_SUFFIX=; \ 570160814Ssimon ALLSYMSFLAGS=; \ 571160814Ssimon NOALLSYMSFLAGS=''; \ 572160814Ssimon SHAREDFLAGS='$(CFLAGS) -G'; \ 573160814Ssimon $(LINK_SO_A_UNPACKED) 574160814Ssimonlink_app.reliantunix: 575160814Ssimon $(LINK_APP) 576160814Ssimon 577160814Ssimon# Targets to build symbolic links when needed 578160814Ssimonsymlink.gnu symlink.solaris symlink.svr3 symlink.svr5 symlink.irix \ 579160814Ssimonsymlink.aix symlink.reliantunix: 580160814Ssimon @ $(CALC_VERSIONS); \ 581160814Ssimon SHLIB=lib$(LIBNAME).so; \ 582160814Ssimon $(SYMLINK_SO) 583160814Ssimonsymlink.darwin: 584160814Ssimon @ $(CALC_VERSIONS); \ 585160814Ssimon SHLIB=lib$(LIBNAME); \ 586160814Ssimon SHLIB_SUFFIX=.dylib; \ 587160814Ssimon $(SYMLINK_SO) 588160814Ssimonsymlink.hpux: 589160814Ssimon @ $(CALC_VERSIONS); \ 590160814Ssimon SHLIB=lib$(LIBNAME).sl; \ 591160814Ssimon expr $(PLATFORM) : '.*ia64' > /dev/null && SHLIB=lib$(LIBNAME).so; \ 592160814Ssimon $(SYMLINK_SO) 593160814Ssimon# The following lines means those specific architectures do no symlinks 594238405Sjkimsymlink.cygwin symlink.alpha-osf1 symlink.tru64 symlink.tru64-rpath symlink.beos: 595160814Ssimon 596160814Ssimon# Compatibility targets 597160814Ssimonlink_o.bsd-gcc-shared link_o.linux-shared link_o.gnu-shared: link_o.gnu 598160814Ssimonlink_a.bsd-gcc-shared link_a.linux-shared link_a.gnu-shared: link_a.gnu 599160814Ssimonlink_app.bsd-gcc-shared link_app.linux-shared link_app.gnu-shared: link_app.gnu 600160814Ssimonsymlink.bsd-gcc-shared symlink.bsd-shared symlink.linux-shared symlink.gnu-shared: symlink.gnu 601160814Ssimonlink_o.bsd-shared: link_o.bsd 602160814Ssimonlink_a.bsd-shared: link_a.bsd 603160814Ssimonlink_app.bsd-shared: link_app.bsd 604160814Ssimonlink_o.darwin-shared: link_o.darwin 605160814Ssimonlink_a.darwin-shared: link_a.darwin 606160814Ssimonlink_app.darwin-shared: link_app.darwin 607160814Ssimonsymlink.darwin-shared: symlink.darwin 608160814Ssimonlink_o.cygwin-shared: link_o.cygwin 609160814Ssimonlink_a.cygwin-shared: link_a.cygwin 610160814Ssimonlink_app.cygwin-shared: link_app.cygwin 611160814Ssimonsymlink.cygwin-shared: symlink.cygwin 612160814Ssimonlink_o.alpha-osf1-shared: link_o.alpha-osf1 613160814Ssimonlink_a.alpha-osf1-shared: link_a.alpha-osf1 614160814Ssimonlink_app.alpha-osf1-shared: link_app.alpha-osf1 615160814Ssimonsymlink.alpha-osf1-shared: symlink.alpha-osf1 616160814Ssimonlink_o.tru64-shared: link_o.tru64 617160814Ssimonlink_a.tru64-shared: link_a.tru64 618160814Ssimonlink_app.tru64-shared: link_app.tru64 619160814Ssimonsymlink.tru64-shared: symlink.tru64 620160814Ssimonlink_o.tru64-shared-rpath: link_o.tru64-rpath 621160814Ssimonlink_a.tru64-shared-rpath: link_a.tru64-rpath 622160814Ssimonlink_app.tru64-shared-rpath: link_app.tru64-rpath 623160814Ssimonsymlink.tru64-shared-rpath: symlink.tru64-rpath 624160814Ssimonlink_o.solaris-shared: link_o.solaris 625160814Ssimonlink_a.solaris-shared: link_a.solaris 626160814Ssimonlink_app.solaris-shared: link_app.solaris 627160814Ssimonsymlink.solaris-shared: symlink.solaris 628160814Ssimonlink_o.svr3-shared: link_o.svr3 629160814Ssimonlink_a.svr3-shared: link_a.svr3 630160814Ssimonlink_app.svr3-shared: link_app.svr3 631160814Ssimonsymlink.svr3-shared: symlink.svr3 632160814Ssimonlink_o.svr5-shared: link_o.svr5 633160814Ssimonlink_a.svr5-shared: link_a.svr5 634160814Ssimonlink_app.svr5-shared: link_app.svr5 635160814Ssimonsymlink.svr5-shared: symlink.svr5 636160814Ssimonlink_o.irix-shared: link_o.irix 637160814Ssimonlink_a.irix-shared: link_a.irix 638160814Ssimonlink_app.irix-shared: link_app.irix 639160814Ssimonsymlink.irix-shared: symlink.irix 640160814Ssimonlink_o.hpux-shared: link_o.hpux 641160814Ssimonlink_a.hpux-shared: link_a.hpux 642160814Ssimonlink_app.hpux-shared: link_app.hpux 643160814Ssimonsymlink.hpux-shared: symlink.hpux 644160814Ssimonlink_o.aix-shared: link_o.aix 645160814Ssimonlink_a.aix-shared: link_a.aix 646160814Ssimonlink_app.aix-shared: link_app.aix 647160814Ssimonsymlink.aix-shared: symlink.aix 648160814Ssimonlink_o.reliantunix-shared: link_o.reliantunix 649160814Ssimonlink_a.reliantunix-shared: link_a.reliantunix 650160814Ssimonlink_app.reliantunix-shared: link_app.reliantunix 651160814Ssimonsymlink.reliantunix-shared: symlink.reliantunix 652238405Sjkimlink_o.beos-shared: link_o.beos 653238405Sjkimlink_a.beos-shared: link_a.beos 654238405Sjkimlink_app.beos-shared: link_app.gnu 655238405Sjkimsymlink.beos-shared: symlink.beos 656