Makefile.shared revision 160814
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 17160814Ssimon# LIBNAME contains just the name of the library, without prefix ("lib" 18160814Ssimon# on Unix, "cyg" for certain forms under Cygwin...) or suffix (.a, .so, 19160814Ssimon# .dll, ...). This one MUST have a value when using this makefile to 20160814Ssimon# build shared libraries. 21160814Ssimon# For example, to build libfoo.so, you need to do the following: 22160814Ssimon#LIBNAME=foo 23160814SsimonLIBNAME= 24160814Ssimon 25160814Ssimon# APPNAME contains just the name of the application, without suffix ("" 26160814Ssimon# on Unix, ".exe" on Windows, ...). This one MUST have a value when using 27160814Ssimon# this makefile to build applications. 28160814Ssimon# For example, to build foo, you need to do the following: 29160814Ssimon#APPNAME=foo 30160814SsimonAPPNAME= 31160814Ssimon 32160814Ssimon# OBJECTS contains all the object files to link together into the application. 33160814Ssimon# This must contain at least one object file. 34160814Ssimon#OBJECTS=foo.o 35160814SsimonOBJECTS= 36160814Ssimon 37160814Ssimon# LIBEXTRAS contains extra modules to link together with the library. 38160814Ssimon# For example, if a second library, say libbar.a needs to be linked into 39160814Ssimon# libfoo.so, you need to do the following: 40160814Ssimon#LIBEXTRAS=libbar.a 41160814Ssimon# Note that this MUST be used when using the link_o targets, to hold the 42160814Ssimon# names of all object files that go into the target library. 43160814SsimonLIBEXTRAS= 44160814Ssimon 45160814Ssimon# LIBVERSION contains the current version of the library. 46160814Ssimon# For example, to build libfoo.so.1.2, you need to do the following: 47160814Ssimon#LIBVERSION=1.2 48160814SsimonLIBVERSION= 49160814Ssimon 50160814Ssimon# LIBCOMPATVERSIONS contains the compatibility versions (a list) of 51160814Ssimon# the library. They MUST be in decreasing order. 52160814Ssimon# For example, if libfoo.so.1.2.1 is backward compatible with libfoo.so.1.2 53160814Ssimon# and libfoo.so.1, you need to do the following: 54160814Ssimon#LIBCOMPATVERSIONS=1.2 1 55160814Ssimon# Note that on systems that use sonames, the last number will appear as 56160814Ssimon# part of it. 57160814Ssimon# It's also possible, for systems that support it (Tru64, for example), 58160814Ssimon# to add extra compatibility info with more precision, by adding a second 59160814Ssimon# list of versions, separated from the first with a semicolon, like this: 60160814Ssimon#LIBCOMPATVERSIONS=1.2 1;1.2.0 1.1.2 1.1.1 1.1.0 1.0.0 61160814SsimonLIBCOMPATVERSIONS= 62160814Ssimon 63160814Ssimon# LIBDEPS contains all the flags necessary to cover all necessary 64160814Ssimon# dependencies to other libraries. 65160814SsimonLIBDEPS= 66160814Ssimon 67160814Ssimon#------------------------------------------------------------------------------ 68160814Ssimon# The rest is private to this makefile. 69160814Ssimon 70160814SsimonSET_X=: 71160814Ssimon#SET_X=set -x 72160814Ssimon 73160814Ssimontop: 74160814Ssimon echo "Trying to use this makefile interactively? Don't." 75160814Ssimon 76160814SsimonCALC_VERSIONS= \ 77160814Ssimon SHLIB_COMPAT=; SHLIB_SOVER=; \ 78160814Ssimon if [ -n "$(LIBVERSION)$(LIBCOMPATVERSIONS)" ]; then \ 79160814Ssimon prev=""; \ 80160814Ssimon for v in `echo "$(LIBVERSION) $(LIBCOMPATVERSIONS)" | cut -d';' -f1`; do \ 81160814Ssimon SHLIB_SOVER_NODOT=$$v; \ 82160814Ssimon SHLIB_SOVER=.$$v; \ 83160814Ssimon if [ -n "$$prev" ]; then \ 84160814Ssimon SHLIB_COMPAT="$$SHLIB_COMPAT .$$prev"; \ 85160814Ssimon fi; \ 86160814Ssimon prev=$$v; \ 87160814Ssimon done; \ 88160814Ssimon fi 89160814Ssimon 90160814SsimonLINK_APP= \ 91160814Ssimon ( $(SET_X); \ 92160814Ssimon LIBDEPS="$${LIBDEPS:-$(LIBDEPS)}"; \ 93160814Ssimon LDCMD="$${LDCMD:-$(CC)}"; LDFLAGS="$${LDFLAGS:-$(CFLAGS)}"; \ 94160814Ssimon LIBPATH=`for x in $$LIBDEPS; do if echo $$x | grep '^ *-L' > /dev/null 2>&1; then echo $$x | sed -e 's/^ *-L//'; fi; done | uniq`; \ 95160814Ssimon LIBPATH=`echo $$LIBPATH | sed -e 's/ /:/g'`; \ 96160814Ssimon LD_LIBRARY_PATH=$$LIBPATH:$$LD_LIBRARY_PATH \ 97160814Ssimon $${LDCMD} $${LDFLAGS} -o $${APPNAME:=$(APPNAME)} $(OBJECTS) $${LIBDEPS} ) 98160814Ssimon 99160814SsimonLINK_SO= \ 100160814Ssimon ( $(SET_X); \ 101160814Ssimon LIBDEPS="$${LIBDEPS:-$(LIBDEPS)}"; \ 102160814Ssimon SHAREDCMD="$${SHAREDCMD:-$(CC)}"; \ 103160814Ssimon SHAREDFLAGS="$${SHAREDFLAGS:-$(CFLAGS) $(SHARED_LDFLAGS)}"; \ 104160814Ssimon nm -Pg $$SHOBJECTS | grep ' [BDT] ' | cut -f1 -d' ' > lib$(LIBNAME).exp; \ 105160814Ssimon LIBPATH=`for x in $$LIBDEPS; do if echo $$x | grep '^ *-L' > /dev/null 2>&1; then echo $$x | sed -e 's/^ *-L//'; fi; done | uniq`; \ 106160814Ssimon LIBPATH=`echo $$LIBPATH | sed -e 's/ /:/g'`; \ 107160814Ssimon LD_LIBRARY_PATH=$$LIBPATH:$$LD_LIBRARY_PATH \ 108160814Ssimon $${SHAREDCMD} $${SHAREDFLAGS} \ 109160814Ssimon -o $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX \ 110160814Ssimon $$ALLSYMSFLAGS $$SHOBJECTS $$NOALLSYMSFLAGS $$LIBDEPS \ 111160814Ssimon ) && $(SYMLINK_SO); \ 112160814Ssimon ( $(SET_X); rm -f lib$(LIBNAME).exp ) 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) ); \ 138160814Ssimon $(LINK_SO) && rm -f $(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 147160814SsimonDETECT_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 173160814Ssimonlink_o.bsd: 174160814Ssimon @if ${DETECT_GNU_LD}; then $(DO_GNU_SO); else \ 175160814Ssimon $(CALC_VERSIONS); \ 176160814Ssimon SHLIB=lib$(LIBNAME).so; \ 177160814Ssimon SHLIB_SUFFIX=; \ 178160814Ssimon LIBDEPS=" "; \ 179160814Ssimon ALLSYMSFLAGS="-Wl,-Bforcearchive"; \ 180160814Ssimon NOALLSYMSFLAGS=; \ 181160814Ssimon SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared -nostdlib"; \ 182160814Ssimon fi; $(LINK_SO_O) 183160814Ssimonlink_a.bsd: 184160814Ssimon @if ${DETECT_GNU_LD}; then $(DO_GNU_SO); else \ 185160814Ssimon $(CALC_VERSIONS); \ 186160814Ssimon SHLIB=lib$(LIBNAME).so; \ 187160814Ssimon SHLIB_SUFFIX=; \ 188160814Ssimon LIBDEPS=" "; \ 189160814Ssimon ALLSYMSFLAGS="-Wl,-Bforcearchive"; \ 190160814Ssimon NOALLSYMSFLAGS=; \ 191160814Ssimon SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared -nostdlib"; \ 192160814Ssimon fi; $(LINK_SO_A) 193160814Ssimonlink_app.bsd: 194160814Ssimon @if ${DETECT_GNU_LD}; then $(DO_GNU_APP); else \ 195160814Ssimon LDFLAGS="$(CFLAGS) -Wl,-rpath,$(LIBPATH)"; \ 196160814Ssimon fi; $(LINK_APP) 197160814Ssimon 198160814Ssimon# For Darwin AKA Mac OS/X (dyld) 199160814Ssimon# link_o.darwin produces .so, because we let it use dso_dlfcn module, 200160814Ssimon# which has .so extension hard-coded. One can argue that one should 201160814Ssimon# develop special dso module for MacOS X. At least manual encourages 202160814Ssimon# to use native NSModule(3) API and refers to dlfcn as termporary hack. 203160814Ssimonlink_o.darwin: 204160814Ssimon @ $(CALC_VERSIONS); \ 205160814Ssimon SHLIB=lib$(LIBNAME); \ 206160814Ssimon SHLIB_SUFFIX=.so; \ 207160814Ssimon ALLSYMSFLAGS='-all_load'; \ 208160814Ssimon NOALLSYMSFLAGS=''; \ 209160814Ssimon SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS)"; \ 210160814Ssimon if [ -n "$(LIBVERSION)" ]; then \ 211160814Ssimon SHAREDFLAGS="$$SHAREDFLAGS -current_version $(LIBVERSION)"; \ 212160814Ssimon fi; \ 213160814Ssimon if [ -n "$$SHLIB_SOVER_NODOT" ]; then \ 214160814Ssimon SHAREDFLAGS="$$SHAREDFLAGS -compatibility_version $$SHLIB_SOVER_NODOT"; \ 215160814Ssimon fi; \ 216160814Ssimon $(LINK_SO_O) 217160814Ssimonlink_a.darwin: 218160814Ssimon @ $(CALC_VERSIONS); \ 219160814Ssimon SHLIB=lib$(LIBNAME); \ 220160814Ssimon SHLIB_SUFFIX=.dylib; \ 221160814Ssimon ALLSYMSFLAGS='-all_load'; \ 222160814Ssimon NOALLSYMSFLAGS=''; \ 223160814Ssimon SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS)"; \ 224160814Ssimon if [ -n "$(LIBVERSION)" ]; then \ 225160814Ssimon SHAREDFLAGS="$$SHAREDFLAGS -current_version $(LIBVERSION)"; \ 226160814Ssimon fi; \ 227160814Ssimon if [ -n "$$SHLIB_SOVER_NODOT" ]; then \ 228160814Ssimon SHAREDFLAGS="$$SHAREDFLAGS -compatibility_version $$SHLIB_SOVER_NODOT"; \ 229160814Ssimon fi; \ 230160814Ssimon SHAREDFLAGS="$$SHAREDFLAGS -install_name ${INSTALLTOP}/lib/$$SHLIB${SHLIB_EXT}"; \ 231160814Ssimon $(LINK_SO_A) 232160814Ssimonlink_app.darwin: # is there run-path on darwin? 233160814Ssimon $(LINK_APP) 234160814Ssimon 235160814Ssimonlink_o.cygwin: 236160814Ssimon @ $(CALC_VERSIONS); \ 237160814Ssimon INHIBIT_SYMLINKS=yes; \ 238160814Ssimon SHLIB=cyg$(LIBNAME); \ 239160814Ssimon expr $(PLATFORM) : 'mingw' > /dev/null && SHLIB=$(LIBNAME)eay32; \ 240160814Ssimon SHLIB_SUFFIX=.dll; \ 241160814Ssimon LIBVERSION="$(LIBVERSION)"; \ 242160814Ssimon SHLIB_SOVER=${LIBVERSION:+"-$(LIBVERSION)"}; \ 243160814Ssimon ALLSYMSFLAGS='-Wl,--whole-archive'; \ 244160814Ssimon NOALLSYMSFLAGS='-Wl,--no-whole-archive'; \ 245160814Ssimon SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared -Wl,-Bsymbolic -Wl,--out-implib,lib$(LIBNAME).dll.a"; \ 246160814Ssimon $(LINK_SO_O) 247160814Ssimonlink_a.cygwin: 248160814Ssimon @ $(CALC_VERSIONS); \ 249160814Ssimon INHIBIT_SYMLINKS=yes; \ 250160814Ssimon SHLIB=cyg$(LIBNAME); \ 251160814Ssimon expr $(PLATFORM) : 'mingw' > /dev/null && SHLIB=$(LIBNAME)eay32; \ 252160814Ssimon SHLIB_SUFFIX=.dll; \ 253160814Ssimon SHLIB_SOVER=-$(LIBVERSION); \ 254160814Ssimon ALLSYMSFLAGS='-Wl,--whole-archive'; \ 255160814Ssimon NOALLSYMSFLAGS='-Wl,--no-whole-archive'; \ 256160814Ssimon base=; [ $(LIBNAME) = "crypto" ] && base=-Wl,--image-base,0x63000000; \ 257160814Ssimon SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared $$base -Wl,-Bsymbolic -Wl,--out-implib,lib$(LIBNAME).dll.a"; \ 258160814Ssimon [ -f apps/$$SHLIB$$SHLIB_SUFFIX ] && rm apps/$$SHLIB$$SHLIB_SUFFIX; \ 259160814Ssimon [ -f test/$$SHLIB$$SHLIB_SUFFIX ] && rm test/$$SHLIB$$SHLIB_SUFFIX; \ 260160814Ssimon $(LINK_SO_A) || exit 1; \ 261160814Ssimon cp -p $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX apps/; \ 262160814Ssimon cp -p $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX test/ 263160814Ssimonlink_app.cygwin: 264160814Ssimon $(LINK_APP) 265160814Ssimon 266160814Ssimonlink_o.alpha-osf1: 267160814Ssimon @ if ${DETECT_GNU_LD}; then \ 268160814Ssimon $(DO_GNU_SO); \ 269160814Ssimon else \ 270160814Ssimon SHLIB=lib$(LIBNAME).so; \ 271160814Ssimon SHLIB_SUFFIX=; \ 272160814Ssimon SHLIB_HIST=`echo "$(LIBCOMPATVERSIONS)" | cut -d';' -f2 | sed -e 's/ */:/'`; \ 273160814Ssimon if [ -n "$$SHLIB_HIST" ]; then \ 274160814Ssimon SHLIB_HIST="$${SHLIB_HIST}:$(LIBVERSION)"; \ 275160814Ssimon else \ 276160814Ssimon SHLIB_HIST="$(LIBVERSION)"; \ 277160814Ssimon fi; \ 278160814Ssimon SHLIB_SOVER=; \ 279160814Ssimon ALLSYMSFLAGS='-all'; \ 280160814Ssimon NOALLSYMSFLAGS='-none'; \ 281160814Ssimon SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared"; \ 282160814Ssimon if [ -n "$$SHLIB_HIST" ]; then \ 283160814Ssimon SHAREDFLAGS="$$SHAREDFLAGS -set_version $$SHLIB_HIST"; \ 284160814Ssimon fi; \ 285160814Ssimon fi; \ 286160814Ssimon $(LINK_SO_O) 287160814Ssimonlink_a.alpha-osf1: 288160814Ssimon @ if ${DETECT_GNU_LD}; then \ 289160814Ssimon $(DO_GNU_SO); \ 290160814Ssimon else \ 291160814Ssimon SHLIB=lib$(LIBNAME).so; \ 292160814Ssimon SHLIB_SUFFIX=; \ 293160814Ssimon SHLIB_HIST=`echo "$(LIBCOMPATVERSIONS)" | cut -d';' -f2 | sed -e 's/ */:/'`; \ 294160814Ssimon if [ -n "$$SHLIB_HIST" ]; then \ 295160814Ssimon SHLIB_HIST="$${SHLIB_HIST}:$(LIBVERSION)"; \ 296160814Ssimon else \ 297160814Ssimon SHLIB_HIST="$(LIBVERSION)"; \ 298160814Ssimon fi; \ 299160814Ssimon SHLIB_SOVER=; \ 300160814Ssimon ALLSYMSFLAGS='-all'; \ 301160814Ssimon NOALLSYMSFLAGS='-none'; \ 302160814Ssimon SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared"; \ 303160814Ssimon if [ -n "$$SHLIB_HIST" ]; then \ 304160814Ssimon SHAREDFLAGS="$$SHAREDFLAGS -set_version $$SHLIB_HIST"; \ 305160814Ssimon fi; \ 306160814Ssimon fi; \ 307160814Ssimon $(LINK_SO_A) 308160814Ssimonlink_app.alpha-osf1: 309160814Ssimon @if ${DETECT_GNU_LD}; then \ 310160814Ssimon $(DO_GNU_APP); \ 311160814Ssimon else \ 312160814Ssimon LDFLAGS="$(CFLAGS) -rpath $(LIBRPATH)"; \ 313160814Ssimon fi; \ 314160814Ssimon $(LINK_APP) 315160814Ssimon 316160814Ssimonlink_o.solaris: 317160814Ssimon @ if ${DETECT_GNU_LD}; then \ 318160814Ssimon $(DO_GNU_SO); \ 319160814Ssimon else \ 320160814Ssimon $(CALC_VERSIONS); \ 321160814Ssimon MINUSZ='-z '; \ 322160814Ssimon ($(CC) -v 2>&1 | grep gcc) > /dev/null && MINUSZ='-Wl,-z,'; \ 323160814Ssimon SHLIB=lib$(LIBNAME).so; \ 324160814Ssimon SHLIB_SUFFIX=; \ 325160814Ssimon ALLSYMSFLAGS="$${MINUSZ}allextract"; \ 326160814Ssimon NOALLSYMSFLAGS="$${MINUSZ}defaultextract"; \ 327160814Ssimon SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX -Wl,-Bsymbolic"; \ 328160814Ssimon fi; \ 329160814Ssimon $(LINK_SO_O) 330160814Ssimonlink_a.solaris: 331160814Ssimon @ if ${DETECT_GNU_LD}; then \ 332160814Ssimon $(DO_GNU_SO); \ 333160814Ssimon else \ 334160814Ssimon $(CALC_VERSIONS); \ 335160814Ssimon MINUSZ='-z '; \ 336160814Ssimon (${CC} -v 2>&1 | grep gcc) > /dev/null && MINUSZ='-Wl,-z,'; \ 337160814Ssimon SHLIB=lib$(LIBNAME).so; \ 338160814Ssimon SHLIB_SUFFIX=;\ 339160814Ssimon ALLSYMSFLAGS="$${MINUSZ}allextract"; \ 340160814Ssimon NOALLSYMSFLAGS="$${MINUSZ}defaultextract"; \ 341160814Ssimon SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX -Wl,-Bsymbolic"; \ 342160814Ssimon fi; \ 343160814Ssimon $(LINK_SO_A) 344160814Ssimonlink_app.solaris: 345160814Ssimon @ if ${DETECT_GNU_LD}; then \ 346160814Ssimon $(DO_GNU_APP); \ 347160814Ssimon else \ 348160814Ssimon LDFLAGS="$(CFLAGS) -R $(LIBRPATH)"; \ 349160814Ssimon fi; \ 350160814Ssimon $(LINK_APP) 351160814Ssimon 352160814Ssimon# OpenServer 5 native compilers used 353160814Ssimonlink_o.svr3: 354160814Ssimon @ if ${DETECT_GNU_LD}; then \ 355160814Ssimon $(DO_GNU_SO); \ 356160814Ssimon else \ 357160814Ssimon $(CALC_VERSIONS); \ 358160814Ssimon SHLIB=lib$(LIBNAME).so; \ 359160814Ssimon SHLIB_SUFFIX=; \ 360160814Ssimon ALLSYMSFLAGS=''; \ 361160814Ssimon NOALLSYMSFLAGS=''; \ 362160814Ssimon SHAREDFLAGS="$(CFLAGS) -G -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"; \ 363160814Ssimon fi; \ 364160814Ssimon $(LINK_SO_O) 365160814Ssimonlink_a.svr3: 366160814Ssimon @ if ${DETECT_GNU_LD}; then \ 367160814Ssimon $(DO_GNU_SO); \ 368160814Ssimon else \ 369160814Ssimon $(CALC_VERSIONS); \ 370160814Ssimon SHLIB=lib$(LIBNAME).so; \ 371160814Ssimon SHLIB_SUFFIX=; \ 372160814Ssimon ALLSYMSFLAGS=''; \ 373160814Ssimon NOALLSYMSFLAGS=''; \ 374160814Ssimon SHAREDFLAGS="$(CFLAGS) -G -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"; \ 375160814Ssimon fi; \ 376160814Ssimon $(LINK_SO_A_UNPACKED) 377160814Ssimonlink_app.svr3: 378160814Ssimon @${DETECT_GNU_LD} && $(DO_GNU_APP); \ 379160814Ssimon $(LINK_APP) 380160814Ssimon 381160814Ssimon# UnixWare 7 and OpenUNIX 8 native compilers used 382160814Ssimonlink_o.svr5: 383160814Ssimon @ if ${DETECT_GNU_LD}; then \ 384160814Ssimon $(DO_GNU_SO); \ 385160814Ssimon else \ 386160814Ssimon $(CALC_VERSIONS); \ 387160814Ssimon SHARE_FLAG='-G'; \ 388160814Ssimon ($(CC) -v 2>&1 | grep gcc) > /dev/null && SHARE_FLAG='-shared'; \ 389160814Ssimon SHLIB=lib$(LIBNAME).so; \ 390160814Ssimon SHLIB_SUFFIX=; \ 391160814Ssimon ALLSYMSFLAGS=''; \ 392160814Ssimon NOALLSYMSFLAGS=''; \ 393160814Ssimon SHAREDFLAGS="$(CFLAGS) $${SHARE_FLAG} -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"; \ 394160814Ssimon fi; \ 395160814Ssimon $(LINK_SO_O) 396160814Ssimonlink_a.svr5: 397160814Ssimon @ if ${DETECT_GNU_LD}; then \ 398160814Ssimon $(DO_GNU_SO); \ 399160814Ssimon else \ 400160814Ssimon $(CALC_VERSIONS); \ 401160814Ssimon SHARE_FLAG='-G'; \ 402160814Ssimon (${CC} -v 2>&1 | grep gcc) > /dev/null && SHARE_FLAG='-shared'; \ 403160814Ssimon SHLIB=lib$(LIBNAME).so; \ 404160814Ssimon SHLIB_SUFFIX=; \ 405160814Ssimon ALLSYMSFLAGS=''; \ 406160814Ssimon NOALLSYMSFLAGS=''; \ 407160814Ssimon SHAREDFLAGS="$(CFLAGS) $${SHARE_FLAG} -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"; \ 408160814Ssimon fi; \ 409160814Ssimon $(LINK_SO_A_UNPACKED) 410160814Ssimonlink_app.svr5: 411160814Ssimon @${DETECT_GNU_LD} && $(DO_GNU_APP); \ 412160814Ssimon $(LINK_APP) 413160814Ssimon 414160814Ssimonlink_o.irix: 415160814Ssimon @ if ${DETECT_GNU_LD}; then \ 416160814Ssimon $(DO_GNU_SO); \ 417160814Ssimon else \ 418160814Ssimon $(CALC_VERSIONS); \ 419160814Ssimon SHLIB=lib$(LIBNAME).so; \ 420160814Ssimon SHLIB_SUFFIX=; \ 421160814Ssimon MINUSWL=""; \ 422160814Ssimon ($(CC) -v 2>&1 | grep gcc) > /dev/null && MINUSWL="-Wl,"; \ 423160814Ssimon ALLSYMSFLAGS="$${MINUSWL}-all"; \ 424160814Ssimon NOALLSYMSFLAGS="$${MINUSWL}-none"; \ 425160814Ssimon SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared -Wl,-soname,$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"; \ 426160814Ssimon fi; \ 427160814Ssimon $(LINK_SO_O) 428160814Ssimonlink_a.irix: 429160814Ssimon @ if ${DETECT_GNU_LD}; then \ 430160814Ssimon $(DO_GNU_SO); \ 431160814Ssimon else \ 432160814Ssimon $(CALC_VERSIONS); \ 433160814Ssimon SHLIB=lib$(LIBNAME).so; \ 434160814Ssimon SHLIB_SUFFIX=; \ 435160814Ssimon MINUSWL=""; \ 436160814Ssimon ($(CC) -v 2>&1 | grep gcc) > /dev/null && MINUSWL="-Wl,"; \ 437160814Ssimon ALLSYMSFLAGS="$${MINUSWL}-all"; \ 438160814Ssimon NOALLSYMSFLAGS="$${MINUSWL}-none"; \ 439160814Ssimon SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared -Wl,-soname,$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"; \ 440160814Ssimon fi; \ 441160814Ssimon $(LINK_SO_A) 442160814Ssimonlink_app.irix: 443160814Ssimon @LDFLAGS="$(CFLAGS) -Wl,-rpath,$(LIBRPATH)"; \ 444160814Ssimon $(LINK_APP) 445160814Ssimon 446160814Ssimon# 32-bit PA-RISC HP-UX embeds the -L pathname of libs we link with, so 447160814Ssimon# we compensate for it with +cdp ../: and +cdp ./:. Yes, these rewrite 448160814Ssimon# rules imply that we can only link one level down in catalog structure, 449160814Ssimon# but that's what takes place for the moment of this writing. +cdp option 450160814Ssimon# was introduced in HP-UX 11.x and applies in 32-bit PA-RISC link 451160814Ssimon# editor context only [it's simply ignored in other cases, which are all 452160814Ssimon# ELFs by the way]. 453160814Ssimon# 454160814Ssimonlink_o.hpux: 455160814Ssimon @if ${DETECT_GNU_LD}; then $(DO_GNU_SO); else \ 456160814Ssimon $(CALC_VERSIONS); \ 457160814Ssimon SHLIB=lib$(LIBNAME).sl; \ 458160814Ssimon expr "$(CFLAGS)" : 'DSO_DLFCN' > /dev/null && SHLIB=lib$(LIBNAME).so; \ 459160814Ssimon SHLIB_SUFFIX=; \ 460160814Ssimon ALLSYMSFLAGS='-Wl,-Fl'; \ 461160814Ssimon NOALLSYMSFLAGS=''; \ 462160814Ssimon expr $(PLATFORM) : 'hpux64' > /dev/null && ALLSYMSFLAGS='-Wl,+forceload'; \ 463160814Ssimon SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -Wl,-B,symbolic,+vnocompatwarnings,-z,+s,+h,$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"; \ 464160814Ssimon fi; \ 465160814Ssimon rm -f $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX || :; \ 466160814Ssimon $(LINK_SO_O) && chmod a=rx $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX 467160814Ssimonlink_a.hpux: 468160814Ssimon @if ${DETECT_GNU_LD}; then $(DO_GNU_SO); else \ 469160814Ssimon $(CALC_VERSIONS); \ 470160814Ssimon SHLIB=lib$(LIBNAME).sl; \ 471160814Ssimon expr $(PLATFORM) : '.*ia64' > /dev/null && SHLIB=lib$(LIBNAME).so; \ 472160814Ssimon SHLIB_SUFFIX=; \ 473160814Ssimon ALLSYMSFLAGS='-Wl,-Fl'; \ 474160814Ssimon NOALLSYMSFLAGS=''; \ 475160814Ssimon expr $(PLATFORM) : 'hpux64' > /dev/null && ALLSYMSFLAGS='-Wl,+forceload'; \ 476160814Ssimon SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -Wl,-B,symbolic,+vnocompatwarnings,-z,+s,+h,$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"; \ 477160814Ssimon fi; \ 478160814Ssimon rm -f $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX || :; \ 479160814Ssimon $(LINK_SO_A) && chmod a=rx $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX 480160814Ssimonlink_app.hpux: 481160814Ssimon @if ${DETECT_GNU_LD}; then $(DO_GNU_APP); else \ 482160814Ssimon LDFLAGS="$(CFLAGS) -Wl,+s,+cdp,../:,+cdp,./:,+b,$(LIBRPATH)"; \ 483160814Ssimon fi; \ 484160814Ssimon $(LINK_APP) 485160814Ssimon 486160814Ssimonlink_o.aix: 487160814Ssimon @ $(CALC_VERSIONS); \ 488160814Ssimon OBJECT_MODE=`expr x$(SHARED_LDFLAGS) : 'x\-[a-z]\([0-9]*\)'`; \ 489160814Ssimon OBJECT_MODE=$${OBJECT_MODE:-32}; export OBJECT_MODE; \ 490160814Ssimon SHLIB=lib$(LIBNAME).so; \ 491160814Ssimon SHLIB_SUFFIX=; \ 492160814Ssimon ALLSYMSFLAGS='-bnogc'; \ 493160814Ssimon NOALLSYMSFLAGS=''; \ 494160814Ssimon SHAREDFLAGS='$(CFLAGS) $(SHARED_LDFLAGS) -G -bE:lib$(LIBNAME).exp -bM:SRE'; \ 495160814Ssimon $(LINK_SO_O); rm -rf lib$(LIBNAME).exp 496160814Ssimonlink_a.aix: 497160814Ssimon @ $(CALC_VERSIONS); \ 498160814Ssimon OBJECT_MODE=`expr x$(SHARED_LDFLAGS) : 'x\-[a-z]\([0-9]*\)'`; \ 499160814Ssimon OBJECT_MODE=$${OBJECT_MODE:-32}; export OBJECT_MODE; \ 500160814Ssimon SHLIB=lib$(LIBNAME).so; \ 501160814Ssimon SHLIB_SUFFIX=; \ 502160814Ssimon ALLSYMSFLAGS='-bnogc'; \ 503160814Ssimon NOALLSYMSFLAGS=''; \ 504160814Ssimon SHAREDFLAGS='$(CFLAGS) $(SHARED_LDFLAGS) -G -bE:lib$(LIBNAME).exp -bM:SRE'; \ 505160814Ssimon $(LINK_SO_A_VIA_O) 506160814Ssimonlink_app.aix: 507160814Ssimon LDFLAGS="$(CFLAGS) -blibpath:$(LIBRPATH):$${LIBPATH:-/usr/lib:/lib}"; \ 508160814Ssimon $(LINK_APP) 509160814Ssimon 510160814Ssimonlink_o.reliantunix: 511160814Ssimon @ $(CALC_VERSIONS); \ 512160814Ssimon SHLIB=lib$(LIBNAME).so; \ 513160814Ssimon SHLIB_SUFFIX=; \ 514160814Ssimon ALLSYMSFLAGS=; \ 515160814Ssimon NOALLSYMSFLAGS=''; \ 516160814Ssimon SHAREDFLAGS='$(CFLAGS) -G'; \ 517160814Ssimon $(LINK_SO_O) 518160814Ssimonlink_a.reliantunix: 519160814Ssimon @ $(CALC_VERSIONS); \ 520160814Ssimon SHLIB=lib$(LIBNAME).so; \ 521160814Ssimon SHLIB_SUFFIX=; \ 522160814Ssimon ALLSYMSFLAGS=; \ 523160814Ssimon NOALLSYMSFLAGS=''; \ 524160814Ssimon SHAREDFLAGS='$(CFLAGS) -G'; \ 525160814Ssimon $(LINK_SO_A_UNPACKED) 526160814Ssimonlink_app.reliantunix: 527160814Ssimon $(LINK_APP) 528160814Ssimon 529160814Ssimon# Targets to build symbolic links when needed 530160814Ssimonsymlink.gnu symlink.solaris symlink.svr3 symlink.svr5 symlink.irix \ 531160814Ssimonsymlink.aix symlink.reliantunix: 532160814Ssimon @ $(CALC_VERSIONS); \ 533160814Ssimon SHLIB=lib$(LIBNAME).so; \ 534160814Ssimon $(SYMLINK_SO) 535160814Ssimonsymlink.darwin: 536160814Ssimon @ $(CALC_VERSIONS); \ 537160814Ssimon SHLIB=lib$(LIBNAME); \ 538160814Ssimon SHLIB_SUFFIX=.dylib; \ 539160814Ssimon $(SYMLINK_SO) 540160814Ssimonsymlink.hpux: 541160814Ssimon @ $(CALC_VERSIONS); \ 542160814Ssimon SHLIB=lib$(LIBNAME).sl; \ 543160814Ssimon expr $(PLATFORM) : '.*ia64' > /dev/null && SHLIB=lib$(LIBNAME).so; \ 544160814Ssimon $(SYMLINK_SO) 545160814Ssimon# The following lines means those specific architectures do no symlinks 546160814Ssimonsymlink.cygwin symlink.alpha-osf1 symlink.tru64 symlink.tru64-rpath: 547160814Ssimon 548160814Ssimon# Compatibility targets 549160814Ssimonlink_o.bsd-gcc-shared link_o.linux-shared link_o.gnu-shared: link_o.gnu 550160814Ssimonlink_a.bsd-gcc-shared link_a.linux-shared link_a.gnu-shared: link_a.gnu 551160814Ssimonlink_app.bsd-gcc-shared link_app.linux-shared link_app.gnu-shared: link_app.gnu 552160814Ssimonsymlink.bsd-gcc-shared symlink.bsd-shared symlink.linux-shared symlink.gnu-shared: symlink.gnu 553160814Ssimonlink_o.bsd-shared: link_o.bsd 554160814Ssimonlink_a.bsd-shared: link_a.bsd 555160814Ssimonlink_app.bsd-shared: link_app.bsd 556160814Ssimonlink_o.darwin-shared: link_o.darwin 557160814Ssimonlink_a.darwin-shared: link_a.darwin 558160814Ssimonlink_app.darwin-shared: link_app.darwin 559160814Ssimonsymlink.darwin-shared: symlink.darwin 560160814Ssimonlink_o.cygwin-shared: link_o.cygwin 561160814Ssimonlink_a.cygwin-shared: link_a.cygwin 562160814Ssimonlink_app.cygwin-shared: link_app.cygwin 563160814Ssimonsymlink.cygwin-shared: symlink.cygwin 564160814Ssimonlink_o.alpha-osf1-shared: link_o.alpha-osf1 565160814Ssimonlink_a.alpha-osf1-shared: link_a.alpha-osf1 566160814Ssimonlink_app.alpha-osf1-shared: link_app.alpha-osf1 567160814Ssimonsymlink.alpha-osf1-shared: symlink.alpha-osf1 568160814Ssimonlink_o.tru64-shared: link_o.tru64 569160814Ssimonlink_a.tru64-shared: link_a.tru64 570160814Ssimonlink_app.tru64-shared: link_app.tru64 571160814Ssimonsymlink.tru64-shared: symlink.tru64 572160814Ssimonlink_o.tru64-shared-rpath: link_o.tru64-rpath 573160814Ssimonlink_a.tru64-shared-rpath: link_a.tru64-rpath 574160814Ssimonlink_app.tru64-shared-rpath: link_app.tru64-rpath 575160814Ssimonsymlink.tru64-shared-rpath: symlink.tru64-rpath 576160814Ssimonlink_o.solaris-shared: link_o.solaris 577160814Ssimonlink_a.solaris-shared: link_a.solaris 578160814Ssimonlink_app.solaris-shared: link_app.solaris 579160814Ssimonsymlink.solaris-shared: symlink.solaris 580160814Ssimonlink_o.svr3-shared: link_o.svr3 581160814Ssimonlink_a.svr3-shared: link_a.svr3 582160814Ssimonlink_app.svr3-shared: link_app.svr3 583160814Ssimonsymlink.svr3-shared: symlink.svr3 584160814Ssimonlink_o.svr5-shared: link_o.svr5 585160814Ssimonlink_a.svr5-shared: link_a.svr5 586160814Ssimonlink_app.svr5-shared: link_app.svr5 587160814Ssimonsymlink.svr5-shared: symlink.svr5 588160814Ssimonlink_o.irix-shared: link_o.irix 589160814Ssimonlink_a.irix-shared: link_a.irix 590160814Ssimonlink_app.irix-shared: link_app.irix 591160814Ssimonsymlink.irix-shared: symlink.irix 592160814Ssimonlink_o.hpux-shared: link_o.hpux 593160814Ssimonlink_a.hpux-shared: link_a.hpux 594160814Ssimonlink_app.hpux-shared: link_app.hpux 595160814Ssimonsymlink.hpux-shared: symlink.hpux 596160814Ssimonlink_o.aix-shared: link_o.aix 597160814Ssimonlink_a.aix-shared: link_a.aix 598160814Ssimonlink_app.aix-shared: link_app.aix 599160814Ssimonsymlink.aix-shared: symlink.aix 600160814Ssimonlink_o.reliantunix-shared: link_o.reliantunix 601160814Ssimonlink_a.reliantunix-shared: link_a.reliantunix 602160814Ssimonlink_app.reliantunix-shared: link_app.reliantunix 603160814Ssimonsymlink.reliantunix-shared: symlink.reliantunix 604