Makefile.shared 23.0 KB
Newer Older
1 2 3 4 5 6 7 8 9
#
# Helper makefile to link shared libraries in a portable way.
# This is much simpler than libtool, and hopefully not too error-prone.
#
# The following variables need to be set on the command line to build
# properly

# CC contains the current compiler.  This one MUST be defined
CC=cc
10 11 12
# 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.
13 14 15
LDFLAGS=
SHARED_LDFLAGS=

16
# LIBNAME contains just the name of the library, without prefix ("lib"
17
# on Unix, "cyg" for certain forms under Cygwin...) or suffix (.a, .so,
18 19
# .dll, ...).  This one MUST have a value when using this makefile to
# build shared libraries.
20 21 22 23
# For example, to build libfoo.so, you need to do the following:
#LIBNAME=foo
LIBNAME=

24 25 26 27 28 29 30 31 32 33 34 35
# 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=

36
# LIBEXTRAS contains extra modules to link together with the library.
37
# For example, if a second library, say libbar.a needs to be linked into
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
# libfoo.so, you need to do the following:
#LIBEXTRAS=libbar.a
# Note that this MUST be used when using the link_o targets, to hold the
# names of all object files that go into the target library.
LIBEXTRAS=

# LIBVERSION contains the current version of the library.
# For example, to build libfoo.so.1.2, you need to do the following:
#LIBVERSION=1.2
LIBVERSION=

# LIBCOMPATVERSIONS contains the compatibility versions (a list) of
# the library.  They MUST be in decreasing order.
# For example, if libfoo.so.1.2.1 is backward compatible with libfoo.so.1.2
# and libfoo.so.1, you need to do the following:
#LIBCOMPATVERSIONS=1.2 1
# Note that on systems that use sonames, the last number will appear as
# part of it.
# It's also possible, for systems that support it (Tru64, for example),
# to add extra compatibility info with more precision, by adding a second
# list of versions, separated from the first with a semicolon, like this:
#LIBCOMPATVERSIONS=1.2 1;1.2.0 1.1.2 1.1.1 1.1.0 1.0.0
LIBCOMPATVERSIONS=

# LIBDEPS contains all the flags necessary to cover all necessary
# dependencies to other libraries.
LIBDEPS=

#------------------------------------------------------------------------------
# The rest is private to this makefile.

#DEBUG=:
DEBUG=set -x

top:
	echo "Trying to use this makefile interactively?  Don't."

CALC_VERSIONS=	\
	SHLIB_COMPAT=; SHLIB_SOVER=; \
77
	if [ -n "$(LIBVERSION)$(LIBCOMPATVERSIONS)" ]; then \
78 79
		prev=""; \
		for v in `echo "$(LIBVERSION) $(LIBCOMPATVERSIONS)" | cut -d';' -f1`; do \
80
			SHLIB_SOVER_NODOT=$$v; \
81 82
			SHLIB_SOVER=.$$v; \
			if [ -n "$$prev" ]; then \
R
Richard Levitte 已提交
83
				SHLIB_COMPAT="$$SHLIB_COMPAT .$$prev"; \
84 85 86 87 88
			fi; \
			prev=$$v; \
		done; \
	fi

89 90
LINK_APP=	\
  ( $(DEBUG);   \
R
Richard Levitte 已提交
91
    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`; \
R
Richard Levitte 已提交
92
    LIBPATH=`echo $$LIBPATH | sed -e 's/ /:/g'`; \
93
    LD_LIBRARY_PATH=$$LIBPATH:$$LD_LIBRARY_PATH \
94 95
    $$LDCMD $(LDFLAGS) $$LDFLAGS -o $$APPNAME $(OBJECTS) $$LIBDEPS )

96
LINK_SO=	\
97
  ( $(DEBUG);   \
98
    nm -Pg $$SHOBJECTS | grep ' [BDT] ' | cut -f1 -d' ' > lib$(LIBNAME).exp; \
R
Richard Levitte 已提交
99
    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`; \
R
Richard Levitte 已提交
100
    LIBPATH=`echo $$LIBPATH | sed -e 's/ /:/g'`; \
101
    LD_LIBRARY_PATH=$$LIBPATH:$$LD_LIBRARY_PATH \
102
    $$SHAREDCMD $(SHARED_LDFLAGS) $$SHAREDFLAGS -o $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX \
103 104 105
	$$ALLSYMSFLAGS $$SHOBJECTS $$NOALLSYMSFLAGS $$LIBDEPS ) && \
  $(SYMLINK_SO); ( $(DEBUG); rm -f lib$(LIBNAME).exp )
SYMLINK_SO=	\
106 107 108 109 110 111 112 113 114 115 116 117 118
	if [ -n "$$INHIBIT_SYMLINKS" ]; then :; else \
		prev=$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX; \
		if [ -n "$$SHLIB_COMPAT" ]; then \
			for x in $$SHLIB_COMPAT; do \
				( $(DEBUG); rm -f $$SHLIB$$x$$SHLIB_SUFFIX; \
				  ln -s $$prev $$SHLIB$$x$$SHLIB_SUFFIX ); \
				prev=$$SHLIB$$x$$SHLIB_SUFFIX; \
			done; \
		fi; \
		if [ -n "$$SHLIB_SOVER" ]; then \
			( $(DEBUG); rm -f $$SHLIB$$SHLIB_SUFFIX; \
			  ln -s $$prev $$SHLIB$$SHLIB_SUFFIX ); \
		fi; \
119
	fi
120

121 122 123
LINK_SO_A=	SHOBJECTS="lib$(LIBNAME).a $(LIBEXTRAS)"; $(LINK_SO)
LINK_SO_O=	SHOBJECTS="$(LIBEXTRAS)"; $(LINK_SO)
LINK_SO_A_VIA_O=	\
124 125
  SHOBJECTS=lib$(LIBNAME).o; \
  ALL=$$ALLSYMSFLAGS; ALLSYMSFLAGS=; NOALLSYMSFLAGS=; \
126 127 128 129 130
  ( $(DEBUG); \
    ld $(LDFLAGS) -r -o lib$(LIBNAME).o $$ALL lib$(LIBNAME).a $(LIBEXTRAS) ); \
  $(LINK_SO) && rm -f $(LIBNAME).o
LINK_SO_A_UNPACKED=	\
  UNPACKDIR=link_tmp.$$$$; rm -rf $$UNPACKDIR; mkdir $$UNPACKDIR; \
131 132
  (cd $$UNPACKDIR; ar x ../lib$(LIBNAME).a) && \
  ([ -z "$(LIBEXTRAS)" ] || cp $(LIBEXTRAS) $$UNPACKDIR) && \
133 134 135
  SHOBJECTS=$$UNPACKDIR/*.o; \
  $(LINK_SO) && rm -rf $$UNPACKDIR

A
Andy Polyakov 已提交
136 137
DETECT_GNU_LD=(${CC} -Wl,-V /dev/null 2>&1 | grep '^GNU ld' )>/dev/null

138
DO_GNU_SO=$(CALC_VERSIONS); \
139 140 141 142 143
	SHLIB=lib$(LIBNAME).so; \
	SHLIB_SUFFIX=; \
	LIBDEPS="$(LIBDEPS) -lc"; \
	ALLSYMSFLAGS='-Wl,--whole-archive'; \
	NOALLSYMSFLAGS='-Wl,--no-whole-archive'; \
144
	SHAREDFLAGS="-shared -Wl,-Bsymbolic -Wl,-soname=$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX -Wl,-rpath,$(LIBRPATH)"; \
145
	SHAREDCMD='$(CC)'
146 147 148 149
DO_GNU_APP=LDCMD=$(CC);\
	LDFLAGS="-Wl,-rpath,$(LIBRPATH)"; \
	LIBDEPS="$(LIBDEPS) -lc"; \
	APPNAME=$(APPNAME)
150

151 152 153 154 155 156 157 158 159 160 161 162
#This is rather special.  It's a special target with which one can link
#applications without bothering with any features that have anything to
#do with shared libraries, for example when linking against static
#libraries.  It's mostly here to avoid a lot of conditionals everywhere
#else...
link_app.:
	LDCMD=$(CC); \
	LDFLAGS=""; \
	LIBDEPS="$(LIBDEPS)"; \
	APPNAME="$(APPNAME)"; \
	$(LINK_APP)

163
link_o.gnu:
164
	@ $(DO_GNU_SO); $(LINK_SO_O)
165
link_a.gnu:
166 167 168
	@ $(DO_GNU_SO); $(LINK_SO_A)
link_app.gnu:
	@ $(DO_GNU_APP); $(LINK_APP)
169

170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199
link_o.bsd:
	@if ${DETECT_GNU_LD}; then $(DO_GNU_SO); else \
	$(CALC_VERSIONS); \
	SHLIB=lib$(LIBNAME).so; \
	SHLIB_SUFFIX=; \
	LIBDEPS=; \
	ALLSYMSFLAGS="-Wl,-Bforcearchive"; \
	NOALLSYMSFLAGS=; \
	SHAREDFLAGS="-shared -nostdlib"; \
	SHAREDCMD=$(CC); \
	fi; $(LINK_SO_O)
link_a.bsd:
	@if ${DETECT_GNU_LD}; then $(DO_GNU_SO); else \
	$(CALC_VERSIONS); \
	SHLIB=lib$(LIBNAME).so; \
	SHLIB_SUFFIX=; \
	LIBDEPS=; \
	ALLSYMSFLAGS="-Wl,-Bforcearchive"; \
	NOALLSYMSFLAGS=; \
	SHAREDFLAGS="-shared -nostdlib"; \
	SHAREDCMD=$(CC); \
	fi; $(LINK_SO_A)
link_app.bsd:
	@if ${DETECT_GNU_LD}; then $(DO_GNU_APP); else \
	LDCMD=$(CC); \
	LDFLAGS="-Wl,-rpath,$(LIBPATH)"; \
	LIBDEPS="$(LIBDEPS)"; \
	APPNAME="$(APPNAME)"; \
	fi; $(LINK_APP)

200 201 202
# For Darwin AKA Mac OS/X (dyld)
link_o.darwin:
	@ $(CALC_VERSIONS); \
203 204 205 206 207 208
	SHLIB=lib$(LIBNAME); \
	SHLIB_SUFFIX=.dylib; \
	LIBDEPS="$(LIBDEPS) -lc"; \
	ALLSYMSFLAGS='-all_load'; \
	NOALLSYMSFLAGS=''; \
	SHAREDFLAGS="-dynamiclib"; \
209
	SHAREDCMD='$(CC)'; \
210
	if [ -n "$(LIBVERSION)" ]; then \
211
		SHAREDFLAGS="$$SHAREDFLAGS -current_version $(LIBVERSION)"; \
212 213
	fi; \
	if [ -n "$$SHLIB_SOVER_NODOT" ]; then \
214
		SHAREDFLAGS="$$SHAREDFLAGS -compatibility_version $$SHLIB_SOVER_NODOT"; \
215
	fi; \
216 217 218
	$(LINK_SO_O)
link_a.darwin:
	@ $(CALC_VERSIONS); \
219 220 221 222 223 224
	SHLIB=lib$(LIBNAME); \
	SHLIB_SUFFIX=.dylib; \
	LIBDEPS="$(LIBDEPS) -lc"; \
	ALLSYMSFLAGS='-all_load'; \
	NOALLSYMSFLAGS=''; \
	SHAREDFLAGS="-dynamiclib"; \
225
	SHAREDCMD='$(CC)'; \
226
	if [ -n "$(LIBVERSION)" ]; then \
227
		SHAREDFLAGS="$$SHAREDFLAGS -current_version $(LIBVERSION)"; \
228 229
	fi; \
	if [ -n "$$SHLIB_SOVER_NODOT" ]; then \
230
		SHAREDFLAGS="$$SHAREDFLAGS -compatibility_version $$SHLIB_SOVER_NODOT"; \
231
	fi; \
232
	$(LINK_SO_A)
233 234 235 236 237 238
link_app.darwin:
	LDCMD=$(CC);\
	LDFLAGS=""; \
	LIBDEPS="$(LIBDEPS) -lc"; \
	APPNAME="$(APPNAME)"; \
	$(LINK_APP)
239 240

link_o.cygwin:
241 242
	@ $(CALC_VERSIONS); \
	INHIBIT_SYMLINKS=yes; \
243
	SHLIB=cyg$(LIBNAME); \
244
	expr $(PLATFORM) : 'mingw' > /dev/null && SHLIB=$(LIBNAME)eay32; \
245
	SHLIB_SUFFIX=.dll; \
246
	LIBDEPS="$(LIBDEPS)"; \
247 248 249
	SHLIB_SOVER=-$(LIBVERSION); \
	ALLSYMSFLAGS='-Wl,--whole-archive'; \
	NOALLSYMSFLAGS='-Wl,--no-whole-archive'; \
250
	SHAREDFLAGS="-Wl,-Bsymbolic -Wl,--out-implib,lib$(LIBNAME).dll.a"; \
251 252 253
	SHAREDCMD='${CC}'; \
	$(LINK_SO_O)
link_a.cygwin:
254 255
	@ $(CALC_VERSIONS); \
	INHIBIT_SYMLINKS=yes; \
256
	SHLIB=cyg$(LIBNAME); \
257
	expr $(PLATFORM) : 'mingw' > /dev/null && SHLIB=$(LIBNAME)eay32; \
258
	SHLIB_SUFFIX=.dll; \
259
	LIBDEPS="$(LIBDEPS)"; \
260 261 262
	SHLIB_SOVER=; \
	ALLSYMSFLAGS='-Wl,--whole-archive'; \
	NOALLSYMSFLAGS='-Wl,--no-whole-archive'; \
263
	SHAREDFLAGS="-Wl,-Bsymbolic -Wl,--out-implib,lib$(LIBNAME).dll.a"; \
264 265
	SHAREDCMD='${CC}'; \
	$(LINK_SO_A)
266 267 268
link_app.cygwin:
	LDCMD=$(CC);\
	LDFLAGS=""; \
269 270
	LIBDEPS="$(LIBDEPS)"; \
	APPNAME="$(APPNAME)"; \
271
	$(LINK_APP)
272 273 274

link_o.alpha-osf1:
	@ if ${DETECT_GNU_LD}; then \
275
		$(DO_GNU_SO); \
276
	else \
277 278 279
		SHLIB=lib$(LIBNAME).so; \
		SHLIB_SUFFIX=; \
		LIBDEPS="$(LIBDEPS) -lc"; \
280 281 282 283 284
		SHLIB_HIST=`echo "$(LIBCOMPATVERSIONS)" | cut -d';' -f2 | sed -e 's/ */:/'`; \
		if [ -n "$$SHLIB_HIST" ]; then \
			SHLIB_HIST="$${SHLIB_HIST}:$(LIBVERSION)"; \
		else \
			SHLIB_HIST="$(LIBVERSION)"; \
285
		fi; \
286 287 288 289
		SHLIB_SOVER=; \
		ALLSYMSFLAGS='-all'; \
		NOALLSYMSFLAGS='-none'; \
		SHAREDFLAGS="-shared"; \
290
		SHAREDCMD='$(CC)'; \
291
		if [ -n "$$SHLIB_HIST" ]; then \
292
			SHAREDFLAGS="$$SHAREDFLAGS -set_version \"$$SHLIB_HIST\""; \
293
		fi; \
294 295
	fi; \
	$(LINK_SO_O)
296 297
link_a.alpha-osf1:
	@ if ${DETECT_GNU_LD}; then \
298
		$(DO_GNU_SO); \
299
	else \
300 301 302
		SHLIB=lib$(LIBNAME).so; \
		SHLIB_SUFFIX=; \
		LIBDEPS="$(LIBDEPS) -lc"; \
303 304 305 306 307
		SHLIB_HIST=`echo "$(LIBCOMPATVERSIONS)" | cut -d';' -f2 | sed -e 's/ */:/'`; \
		if [ -n "$$SHLIB_HIST" ]; then \
			SHLIB_HIST="$${SHLIB_HIST}:$(LIBVERSION)"; \
		else \
			SHLIB_HIST="$(LIBVERSION)"; \
308
		fi; \
309 310 311 312
		SHLIB_SOVER=; \
		ALLSYMSFLAGS='-all'; \
		NOALLSYMSFLAGS='-none'; \
		SHAREDFLAGS="-shared"; \
313
		SHAREDCMD='$(CC)'; \
314
		if [ -n "$$SHLIB_HIST" ]; then \
315
			SHAREDFLAGS="$$SHAREDFLAGS -set_version \"$$SHLIB_HIST\""; \
316
		fi; \
317 318
	fi; \
	$(LINK_SO_A)
319 320 321 322 323 324 325 326 327 328
link_app.alpha-osf1:
	@ if ${DETECT_GNU_LD}; then \
		$(DO_GNU_APP); \
	else \
		LDCMD=$(CC);\
		LDFLAGS=""; \
		LIBDEPS="$(LIBDEPS) -lc"; \
		APPNAME="$(APPNAME)"
	fi; \
	$(LINK_APP)
329 330 331 332 333

# 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 \
334
		$(DO_GNU_SO); \
335
	else \
336 337 338
		SHLIB=lib$(LIBNAME).so; \
		SHLIB_SUFFIX=; \
		LIBDEPS="$(LIBDEPS) -lc"; \
339 340 341 342 343
		SHLIB_HIST=`echo "$(LIBCOMPATVERSIONS)" | cut -d';' -f2 | sed -e 's/ */:/'`; \
		if [ -n "$$SHLIB_HIST" ]; then \
			SHLIB_HIST="$${SHLIB_HIST}:$(LIBVERSION)"; \
		else \
			SHLIB_HIST="$(LIBVERSION)"; \
344
		fi; \
345 346 347
		SHLIB_SOVER=; \
		ALLSYMSFLAGS='-all'; \
		NOALLSYMSFLAGS='-none'; \
348
		SHAREDFLAGS="-shared -msym -rpath $(LIBRPATH)"; \
349
		SHAREDCMD='$(CC)'; \
350
		if [ -n "$$SHLIB_HIST" ]; then \
351
			SHAREDFLAGS="$$SHAREDFLAGS -set_version \"$$SHLIB_HIST\""; \
352
		fi; \
353 354
	fi; \
	$(LINK_SO_O)
355 356
link_a.tru64:
	@ if ${DETECT_GNU_LD}; then \
357
		$(DO_GNU_SO); \
358
	else \
359 360 361
		SHLIB=lib$(LIBNAME).so; \
		SHLIB_SUFFIX=; \
		LIBDEPS="$(LIBDEPS) -lc"; \
362 363 364 365 366
		SHLIB_HIST=`echo "$(LIBCOMPATVERSIONS)" | cut -d';' -f2 | sed -e 's/ */:/'`; \
		if [ -n "$$SHLIB_HIST" ]; then \
			SHLIB_HIST="$${SHLIB_HIST}:$(LIBVERSION)"; \
		else \
			SHLIB_HIST="$(LIBVERSION)"; \
367
		fi; \
368 369 370
		SHLIB_SOVER=; \
		ALLSYMSFLAGS='-all'; \
		NOALLSYMSFLAGS='-none'; \
371
		SHAREDFLAGS="-shared -msym -rpath $(LIBRPATH)"; \
372
		SHAREDCMD='$(CC)'; \
373
		if [ -n "$$SHLIB_HIST" ]; then \
374
			SHAREDFLAGS="$$SHAREDFLAGS -set_version \"$$SHLIB_HIST\""; \
375
		fi; \
376 377
	fi; \
	$(LINK_SO_A)
378 379 380 381 382 383 384 385 386 387
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)
388 389 390 391 392

# 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 \
393
		$(DO_GNU_SO); \
394
	else \
395 396 397
		SHLIB=lib$(LIBNAME).so; \
		SHLIB_SUFFIX=; \
		LIBDEPS="$(LIBDEPS) -lc"; \
398 399 400 401 402
		SHLIB_HIST=`echo "$(LIBCOMPATVERSIONS)" | cut -d';' -f2 | sed -e 's/ */:/'`; \
		if [ -n "$$SHLIB_HIST" ]; then \
			SHLIB_HIST="$${SHLIB_HIST}:$(LIBVERSION)"; \
		else \
			SHLIB_HIST="$(LIBVERSION)"; \
403
		fi; \
404 405 406 407
		SHLIB_SOVER=; \
		ALLSYMSFLAGS='-all'; \
		NOALLSYMSFLAGS='-none'; \
		SHAREDFLAGS="-shared -msym -rpath $(LIBRPATH)"; \
408
		SHAREDCMD='$(CC)'; \
409
		if [ -n "$$SHLIB_HIST" ]; then \
410
			SHAREDFLAGS="$$SHAREDFLAGS -set_version \"$$SHLIB_HIST\""; \
411
		fi; \
412 413
	fi; \
	$(LINK_SO_O)
414 415
link_a.tru64-rpath:
	@ if ${DETECT_GNU_LD}; then \
416
		$(DO_GNU_SO); \
417
	else \
418 419 420
		SHLIB=lib$(LIBNAME).so; \
		SHLIB_SUFFIX=; \
		LIBDEPS="$(LIBDEPS) -lc"; \
421 422 423 424 425
		SHLIB_HIST=`echo "$(LIBCOMPATVERSIONS)" | cut -d';' -f2 | sed -e 's/ */:/'`; \
		if [ -n "$$SHLIB_HIST" ]; then \
			SHLIB_HIST="$${SHLIB_HIST}:$(LIBVERSION)"; \
		else \
			SHLIB_HIST="$(LIBVERSION)"; \
426
		fi; \
427 428 429 430
		SHLIB_SOVER=; \
		ALLSYMSFLAGS='-all'; \
		NOALLSYMSFLAGS='-none'; \
		SHAREDFLAGS="-shared -msym -rpath $(LIBRPATH)"; \
431
		SHAREDCMD='$(CC)'; \
432
		if [ -n "$$SHLIB_HIST" ]; then \
433
			SHAREDFLAGS="$$SHAREDFLAGS -set_version \"$$SHLIB_HIST\""; \
434
		fi; \
435 436
	fi; \
	$(LINK_SO_A)
437 438 439 440 441 442 443 444 445 446
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)
447 448

link_o.solaris:
R
Richard Levitte 已提交
449
	@ if ${DETECT_GNU_LD}; then \
450
		$(DO_GNU_SO); \
451 452
	else \
		$(CALC_VERSIONS); \
453 454
		MINUSZ='-z '; \
		(${CC} -v 2>&1 | grep gcc) > /dev/null && MINUSZ='-Wl,-z,'; \
455 456 457 458 459
		SHLIB=lib$(LIBNAME).so; \
		SHLIB_SUFFIX=; \
		LIBDEPS="$(LIBDEPS) -lc"; \
		ALLSYMSFLAGS="$${MINUSZ}allextract"; \
		NOALLSYMSFLAGS="$${MINUSZ}defaultextract"; \
460
		SHAREDFLAGS="-G -dy -z text -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX -R $(LIBRPATH) -Wl,-Bsymbolic"; \
461
		SHAREDCMD='$(CC)'; \
462 463
	fi; \
	$(LINK_SO_O)
464
link_a.solaris:
R
Richard Levitte 已提交
465
	@ if ${DETECT_GNU_LD}; then \
466
		$(DO_GNU_SO); \
467 468
	else \
		$(CALC_VERSIONS); \
469 470
		MINUSZ='-z '; \
		(${CC} -v 2>&1 | grep gcc) > /dev/null && MINUSZ='-Wl,-z,'; \
471 472 473 474 475
		SHLIB=lib$(LIBNAME).so; \
		SHLIB_SUFFIX=;\
		LIBDEPS="$(LIBDEPS) -lc"; \
		ALLSYMSFLAGS="$${MINUSZ}allextract"; \
		NOALLSYMSFLAGS="$${MINUSZ}defaultextract"; \
476
		SHAREDFLAGS="-G -dy -z text -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX -R $(LIBRPATH) -Wl,-Bsymbolic"; \
477
		SHAREDCMD='$(CC)'; \
478 479
	fi; \
	$(LINK_SO_A)
480 481 482 483 484 485 486 487 488 489
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)
490 491 492

# OpenServer 5 native compilers used
link_o.svr3:
R
Richard Levitte 已提交
493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532
	@ if ${DETECT_GNU_LD}; then \
		$(DO_GNU_SO); \
	else \
		$(CALC_VERSIONS); \
		SHLIB=lib$(LIBNAME).so; \
		SHLIB_SUFFIX=; \
		LIBDEPS="$(LIBDEPS) -lc"; \
		ALLSYMSFLAGS=''; \
		NOALLSYMSFLAGS=''; \
		SHAREDFLAGS="-G -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"; \
		SHAREDCMD='$(CC)'; \
	fi; \
	$(LINK_SO_O)
link_a.svr3:
	@ if ${DETECT_GNU_LD}; then \
		$(DO_GNU_SO); \
	else \
		$(CALC_VERSIONS); \
		SHLIB=lib$(LIBNAME).so; \
		SHLIB_SUFFIX=; \
		LIBDEPS="$(LIBDEPS) -lc"; \
		ALLSYMSFLAGS=''; \
		NOALLSYMSFLAGS=''; \
		SHAREDFLAGS="-G -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"; \
		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)

# UnixWare 7 and OpenUNIX 8 native compilers used
link_o.svr5:
533
	@ if ${DETECT_GNU_LD}; then \
534
		$(DO_GNU_SO); \
535 536
	else \
		$(CALC_VERSIONS); \
537
		SHARE_FLAG='-G'; \
538
		(${CC} -v 2>&1 | grep gcc) > /dev/null && SHARE_FLAG='-shared'; \
539 540 541
		SHLIB=lib$(LIBNAME).so; \
		SHLIB_SUFFIX=; \
		LIBDEPS="$(LIBDEPS) -lc"; \
542
		ALLSYMSFLAGS=''; \
543
		NOALLSYMSFLAGS=''; \
544
		SHAREDFLAGS="$${SHARE_FLAG} -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"; \
545
		SHAREDCMD='$(CC)'; \
546 547
	fi; \
	$(LINK_SO_O)
R
Richard Levitte 已提交
548
link_a.svr5:
549
	@ if ${DETECT_GNU_LD}; then \
550
		$(DO_GNU_SO); \
551 552
	else \
		$(CALC_VERSIONS); \
553
		SHARE_FLAG='-G'; \
554
		(${CC} -v 2>&1 | grep gcc) > /dev/null && SHARE_FLAG='-shared'; \
555 556 557
		SHLIB=lib$(LIBNAME).so; \
		SHLIB_SUFFIX=; \
		LIBDEPS="$(LIBDEPS) -lc"; \
558
		ALLSYMSFLAGS=''; \
559
		NOALLSYMSFLAGS=''; \
560
		SHAREDFLAGS="$${SHARE_FLAG} -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"; \
561
		SHAREDCMD='$(CC)'; \
562 563
	fi; \
	$(LINK_SO_A_UNPACKED)
R
Richard Levitte 已提交
564
link_app.svr5:
565 566 567 568 569 570 571 572 573
	@ if ${DETECT_GNU_LD}; then \
		$(DO_GNU_APP); \
	else \
		LDCMD=$(CC);\
		LDFLAGS=""; \
		LIBDEPS="$(LIBDEPS) -lc"; \
		APPNAME="$(APPNAME)"; \
	fi; \
	$(LINK_APP)
574 575 576

link_o.irix:
	@ if ${DETECT_GNU_LD}; then \
577
		$(DO_GNU_SO); \
578 579
	else \
		$(CALC_VERSIONS); \
580 581 582
		SHLIB=lib$(LIBNAME).so; \
		SHLIB_SUFFIX=; \
		LIBDEPS="$(LIBDEPS) -lc"; \
A
Andy Polyakov 已提交
583 584 585 586
		MINUSWL=""; \
		($(CC) -v 2>&1 | grep gcc) > /dev/null && MINUSWL="-Wl,"; \
		ALLSYMSFLAGS="$${MINUSWL}-all"; \
		NOALLSYMSFLAGS="$${MINUSWL}-notall"; \
587
		SHAREDFLAGS="-shared -Wl,-soname,$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX -Wl,-rpath,$(LIBRPATH)"; \
588
		SHAREDCMD='$(CC)'; \
589 590
	fi; \
	$(LINK_SO_O)
591 592
link_a.irix:
	@ if ${DETECT_GNU_LD}; then \
593
		$(DO_GNU_SO); \
594 595
	else \
		$(CALC_VERSIONS); \
596 597 598
		SHLIB=lib$(LIBNAME).so; \
		SHLIB_SUFFIX=; \
		LIBDEPS="$(LIBDEPS) -lc"; \
A
Andy Polyakov 已提交
599 600 601 602
		MINUSWL=""; \
		($(CC) -v 2>&1 | grep gcc) > /dev/null && MINUSWL="-Wl,"; \
		ALLSYMSFLAGS="$${MINUSWL}-all"; \
		NOALLSYMSFLAGS="$${MINUSWL}-notall"; \
603
		SHAREDFLAGS="-shared -Wl,-soname,$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX -Wl,-rpath,$(LIBRPATH)"; \
604
		SHAREDCMD='$(CC)'; \
605 606
	fi; \
	$(LINK_SO_A)
607 608 609 610 611 612 613 614 615 616
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)
617

618 619 620 621 622 623 624
# 32-bit PA-RISC HP-UX embeds the -L pathname of libs we link with, so
# we compensate for it with +cdp ../: and +cdp ./:. Yes, these rewrite
# rules imply that we can only link one level down in catalog structure,
# but that's what takes place for the moment of this writing. +cdp option
# was introduced in HP-UX 11.x and applies in 32-bit PA-RISC link
# editor context only [it's simply ignored in other cases, which are all
# ELFs by the way].
625
#
626
link_o.hpux:
627 628
	@if ${DETECT_GNU_LD}; then $(DO_GNU_SO); else \
	$(CALC_VERSIONS); \
629
	SHLIB=lib$(LIBNAME).sl; \
630
	expr $(PLATFORM) : '.*ia64' > /dev/null && SHLIB=lib$(LIBNAME).so; \
631
	SHLIB_SUFFIX=; \
632 633
	LIBDEPS="$(LIBDEPS)"; \
	ALLSYMSFLAGS='-Wl,-Fl'; \
634
	NOALLSYMSFLAGS=''; \
635
	expr $(PLATFORM) : 'hpux64' > /dev/null && ALLSYMSFLAGS='-Wl,+forceload'; \
636
	SHAREDFLAGS="-Wl,-B,symbolic,+vnocompatwarnings,-z,+s,+cdp,../:,+cdp,./:,+h,$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX,+b,$(LIBRPATH)"; \
637
	SHAREDCMD=$(CC); \
638
	fi; \
639
	$(LINK_SO_O) && chmod a=rx $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX
640
link_a.hpux:
641 642
	@if ${DETECT_GNU_LD}; then $(DO_GNU_SO); else \
	$(CALC_VERSIONS); \
643
	SHLIB=lib$(LIBNAME).sl; \
644
	expr $(PLATFORM) : '.*ia64' > /dev/null && SHLIB=lib$(LIBNAME).so; \
645
	SHLIB_SUFFIX=; \
646 647
	LIBDEPS="$(LIBDEPS)"; \
	ALLSYMSFLAGS='-Wl,-Fl'; \
648
	NOALLSYMSFLAGS=''; \
649
	expr $(PLATFORM) : 'hpux64' > /dev/null && ALLSYMSFLAGS='-Wl,+forceload'; \
650
	SHAREDFLAGS="-Wl,-B,symbolic,+vnocompatwarnings,-z,+s,+cdp,../:,+cdp,./:,+h,$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX,+b,$(LIBRPATH)"; \
651
	SHAREDCMD='$(CC)'; \
652
	fi; \
653
	$(LINK_SO_A) && chmod a=rx $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX
654
link_app.hpux:
655
	@if ${DETECT_GNU_LD}; then $(DO_GNU_APP); else \
656
	LDCMD=$(CC);\
657
	LDFLAGS="-Wl,+s,+cdp,../:,+cdp,./:,+b,$(LIBRPATH)"; \
658 659
	LIBDEPS="$(LIBDEPS)"; \
	APPNAME="$(APPNAME)"; \
660
	fi; \
661
	$(LINK_APP)
662 663 664

link_o.aix:
	@ $(CALC_VERSIONS); \
665 666 667 668 669
	SHLIB=lib$(LIBNAME).so; \
	SHLIB_SUFFIX=; \
	LIBDEPS="$(LIBDEPS) -lc"; \
	ALLSYMSFLAGS='-bnogc'; \
	NOALLSYMSFLAGS=''; \
670
	SHAREDFLAGS='-G -bE:lib$(LIBNAME).exp -bM:SRE -blibpath:$(LIBRPATH)'; \
671 672 673 674
	SHAREDCMD='$(CC)'; \
	$(LINK_SO_O)
link_a.aix:
	@ $(CALC_VERSIONS); \
675 676 677 678 679
	SHLIB=lib$(LIBNAME).so; \
	SHLIB_SUFFIX=; \
	LIBDEPS="$(LIBDEPS) -lc"; \
	ALLSYMSFLAGS='-bnogc'; \
	NOALLSYMSFLAGS=''; \
680
	SHAREDFLAGS='-G -bE:lib$(LIBNAME).exp -bM:SRE -blibpath:$(LIBRPATH)'; \
681 682
	SHAREDCMD='$(CC)'; \
	$(LINK_SO_A_VIA_O)
683 684 685 686 687 688
link_app.aix:
	LDCMD=$(CC);\
	LDFLAGS="-blibpath:$(LIBRPATH)"; \
	LIBDEPS="$(LIBDEPS) -lc"; \
	APPNAME="$(APPNAME)"
	$(LINK_APP)
689 690 691

link_o.reliantunix:
	@ $(CALC_VERSIONS); \
692 693 694 695 696 697
	SHLIB=lib$(LIBNAME).so; \
	SHLIB_SUFFIX=; \
	LIBDEPS="$(LIBDEPS) -lc"; \
	ALLSYMSFLAGS=; \
	NOALLSYMSFLAGS=''; \
	SHAREDFLAGS='-G'; \
698 699 700 701
	SHAREDCMD='$(CC)'; \
	$(LINK_SO_O)
link_a.reliantunix:
	@ $(CALC_VERSIONS); \
702 703 704 705 706 707
	SHLIB=lib$(LIBNAME).so; \
	SHLIB_SUFFIX=; \
	LIBDEPS="$(LIBDEPS) -lc"; \
	ALLSYMSFLAGS=; \
	NOALLSYMSFLAGS=''; \
	SHAREDFLAGS='-G'; \
708 709
	SHAREDCMD='$(CC)'; \
	$(LINK_SO_A_UNPACKED)
710 711 712 713 714 715
link_app.reliantunix:
	LDCMD=$(CC);\
	LDFLAGS=""; \
	LIBDEPS="$(LIBDEPS) -lc"; \
	APPNAME="$(APPNAME)"
	$(LINK_APP)
716 717

# Targets to build symbolic links when needed
R
Richard Levitte 已提交
718
symlink.gnu symlink.solaris symlink.svr3 symlink.svr5 symlink.irix \
719 720
symlink.aix symlink.reliantunix:
	@ $(CALC_VERSIONS); \
721
	SHLIB=lib$(LIBNAME).so; \
722
	$(SYMLINK_SO)
723 724
symlink.darwin:
	@ $(CALC_VERSIONS); \
725
	SHLIB=lib$(LIBNAME); \
726
	SHLIB_SUFFIX=.dylib; \
727
	$(SYMLINK_SO)
728
symlink.hpux:
729
	@ $(CALC_VERSIONS); \
730
	SHLIB=lib$(LIBNAME).sl; \
731
	expr $(PLATFORM) : '.*ia64' > /dev/null && SHLIB=lib$(LIBNAME).so; \
732
	$(SYMLINK_SO)
733 734
# The following lines means those specific architectures do no symlinks
symlink.cygwin symlib.alpha-osf1 symlink.tru64 symlink.tru64-rpath:
735 736 737 738

# 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
739
link_app.bsd-gcc-shared link_app.linux-shared link_app.gnu-shared: link_app.gnu
740 741 742 743
symlink.bsd-gcc-shared symlink.bsd-shared symlink.linux-shared symlink.gnu-shared: symlink.gnu
link_o.bsd-shared: link_o.bsd
link_a.bsd-shared: link_a.bsd
link_app.bsd-shared: link_app.bsd
744 745
link_o.darwin-shared: link_o.darwin
link_a.darwin-shared: link_a.darwin
746
link_app.darwin-shared: link_app.darwin
747 748 749
symlink.darwin-shared: symlink.darwin
link_o.cygwin-shared: link_o.cygwin
link_a.cygwin-shared: link_a.cygwin
750
link_app.cygwin-shared: link_app.cygwin
751 752 753
symlink.cygwin-shared: symlink.cygwin
link_o.alpha-osf1-shared: link_o.alpha-osf1
link_a.alpha-osf1-shared: link_a.alpha-osf1
754
link_app.alpha-osf1-shared: link_app.alpha-osf1
755 756 757
symlink.alpha-osf1-shared: symlink.alpha-osf1
link_o.tru64-shared: link_o.tru64
link_a.tru64-shared: link_a.tru64
758
link_app.tru64-shared: link_app.tru64
759 760 761
symlink.tru64-shared: symlink.tru64
link_o.tru64-shared-rpath: link_o.tru64-rpath
link_a.tru64-shared-rpath: link_a.tru64-rpath
762
link_app.tru64-shared-rpath: link_app.tru64-rpath
763 764 765
symlink.tru64-shared-rpath: symlink.tru64-rpath
link_o.solaris-shared: link_o.solaris
link_a.solaris-shared: link_a.solaris
766
link_app.solaris-shared: link_app.solaris
767 768 769
symlink.solaris-shared: symlink.solaris
link_o.svr3-shared: link_o.svr3
link_a.svr3-shared: link_a.svr3
770
link_app.svr3-shared: link_app.svr3
771
symlink.svr3-shared: symlink.svr3
R
Richard Levitte 已提交
772 773 774 775
link_o.svr5-shared: link_o.svr5
link_a.svr5-shared: link_a.svr5
link_app.svr5-shared: link_app.svr5
symlink.svr5-shared: symlink.svr5
776 777
link_o.irix-shared: link_o.irix
link_a.irix-shared: link_a.irix
778
link_app.irix-shared: link_app.irix
779
symlink.irix-shared: symlink.irix
780 781 782 783
link_o.hpux-shared: link_o.hpux
link_a.hpux-shared: link_a.hpux
link_app.hpux-shared: link_app.hpux
symlink.hpux-shared: symlink.hpux
784 785
link_o.aix-shared: link_o.aix
link_a.aix-shared: link_a.aix
786
link_app.aix-shared: link_app.aix
787 788 789
symlink.aix-shared: symlink.aix
link_o.reliantunix-shared: link_o.reliantunix
link_a.reliantunix-shared: link_a.reliantunix
790
link_app.reliantunix-shared: link_app.reliantunix
791
symlink.reliantunix-shared: symlink.reliantunix