Makefile.shared 21.9 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

# For Darwin AKA Mac OS/X (dyld)
link_o.darwin:
	@ $(CALC_VERSIONS); \
173 174 175 176 177 178
	SHLIB=lib$(LIBNAME); \
	SHLIB_SUFFIX=.dylib; \
	LIBDEPS="$(LIBDEPS) -lc"; \
	ALLSYMSFLAGS='-all_load'; \
	NOALLSYMSFLAGS=''; \
	SHAREDFLAGS="-dynamiclib"; \
179
	SHAREDCMD='$(CC)'; \
180
	if [ -n "$(LIBVERSION)" ]; then \
181
		SHAREDFLAGS="$$SHAREDFLAGS -current_version $(LIBVERSION)"; \
182 183
	fi; \
	if [ -n "$$SHLIB_SOVER_NODOT" ]; then \
184
		SHAREDFLAGS="$$SHAREDFLAGS -compatibility_version $$SHLIB_SOVER_NODOT"; \
185
	fi; \
186 187 188
	$(LINK_SO_O)
link_a.darwin:
	@ $(CALC_VERSIONS); \
189 190 191 192 193 194
	SHLIB=lib$(LIBNAME); \
	SHLIB_SUFFIX=.dylib; \
	LIBDEPS="$(LIBDEPS) -lc"; \
	ALLSYMSFLAGS='-all_load'; \
	NOALLSYMSFLAGS=''; \
	SHAREDFLAGS="-dynamiclib"; \
195
	SHAREDCMD='$(CC)'; \
196
	if [ -n "$(LIBVERSION)" ]; then \
197
		SHAREDFLAGS="$$SHAREDFLAGS -current_version $(LIBVERSION)"; \
198 199
	fi; \
	if [ -n "$$SHLIB_SOVER_NODOT" ]; then \
200
		SHAREDFLAGS="$$SHAREDFLAGS -compatibility_version $$SHLIB_SOVER_NODOT"; \
201
	fi; \
202
	$(LINK_SO_A)
203 204 205 206 207 208
link_app.darwin:
	LDCMD=$(CC);\
	LDFLAGS=""; \
	LIBDEPS="$(LIBDEPS) -lc"; \
	APPNAME="$(APPNAME)"; \
	$(LINK_APP)
209 210

link_o.cygwin:
211 212
	@ $(CALC_VERSIONS); \
	INHIBIT_SYMLINKS=yes; \
213 214 215 216 217 218 219
	SHLIB=cyg$(LIBNAME); \
	SHLIB_SUFFIX=.dll; \
	LIBDEPS="$(LIBDEPS) -lc"; \
	SHLIB_SOVER=-$(LIBVERSION); \
	ALLSYMSFLAGS='-Wl,--whole-archive'; \
	NOALLSYMSFLAGS='-Wl,--no-whole-archive'; \
	SHAREDFLAGS="-shared -Wl,-Bsymbolic -Wl,--out-implib,lib$(LIBNAME).dll.a"; \
220 221 222
	SHAREDCMD='${CC}'; \
	$(LINK_SO_O)
link_a.cygwin:
223 224
	@ $(CALC_VERSIONS); \
	INHIBIT_SYMLINKS=yes; \
225 226 227 228 229 230 231
	SHLIB=cyg$(LIBNAME); \
	SHLIB_SUFFIX=.dll; \
	LIBDEPS="$(LIBDEPS) -lc"; \
	SHLIB_SOVER=; \
	ALLSYMSFLAGS='-Wl,--whole-archive'; \
	NOALLSYMSFLAGS='-Wl,--no-whole-archive'; \
	SHAREDFLAGS="-shared -Wl,-Bsymbolic -Wl,--out-implib,lib$(LIBNAME).dll.a"; \
232 233
	SHAREDCMD='${CC}'; \
	$(LINK_SO_A)
234 235 236 237 238 239
link_app.cygwin:
	LDCMD=$(CC);\
	LDFLAGS=""; \
	LIBDEPS="$(LIBDEPS) -lc"; \
	APPNAME="$(APPNAME).exe"
	$(LINK_APP)
240 241 242

link_o.alpha-osf1:
	@ if ${DETECT_GNU_LD}; then \
243
		$(DO_GNU_SO); \
244
	else \
245 246 247
		SHLIB=lib$(LIBNAME).so; \
		SHLIB_SUFFIX=; \
		LIBDEPS="$(LIBDEPS) -lc"; \
248 249 250 251 252
		SHLIB_HIST=`echo "$(LIBCOMPATVERSIONS)" | cut -d';' -f2 | sed -e 's/ */:/'`; \
		if [ -n "$$SHLIB_HIST" ]; then \
			SHLIB_HIST="$${SHLIB_HIST}:$(LIBVERSION)"; \
		else \
			SHLIB_HIST="$(LIBVERSION)"; \
253
		fi; \
254 255 256 257
		SHLIB_SOVER=; \
		ALLSYMSFLAGS='-all'; \
		NOALLSYMSFLAGS='-none'; \
		SHAREDFLAGS="-shared"; \
258
		SHAREDCMD='$(CC)'; \
259
		if [ -n "$$SHLIB_HIST" ]; then \
260
			SHAREDFLAGS="$$SHAREDFLAGS -set_version \"$$SHLIB_HIST\""; \
261
		fi; \
262 263
	fi; \
	$(LINK_SO_O)
264 265
link_a.alpha-osf1:
	@ if ${DETECT_GNU_LD}; then \
266
		$(DO_GNU_SO); \
267
	else \
268 269 270
		SHLIB=lib$(LIBNAME).so; \
		SHLIB_SUFFIX=; \
		LIBDEPS="$(LIBDEPS) -lc"; \
271 272 273 274 275
		SHLIB_HIST=`echo "$(LIBCOMPATVERSIONS)" | cut -d';' -f2 | sed -e 's/ */:/'`; \
		if [ -n "$$SHLIB_HIST" ]; then \
			SHLIB_HIST="$${SHLIB_HIST}:$(LIBVERSION)"; \
		else \
			SHLIB_HIST="$(LIBVERSION)"; \
276
		fi; \
277 278 279 280
		SHLIB_SOVER=; \
		ALLSYMSFLAGS='-all'; \
		NOALLSYMSFLAGS='-none'; \
		SHAREDFLAGS="-shared"; \
281
		SHAREDCMD='$(CC)'; \
282
		if [ -n "$$SHLIB_HIST" ]; then \
283
			SHAREDFLAGS="$$SHAREDFLAGS -set_version \"$$SHLIB_HIST\""; \
284
		fi; \
285 286
	fi; \
	$(LINK_SO_A)
287 288 289 290 291 292 293 294 295 296
link_app.alpha-osf1:
	@ if ${DETECT_GNU_LD}; then \
		$(DO_GNU_APP); \
	else \
		LDCMD=$(CC);\
		LDFLAGS=""; \
		LIBDEPS="$(LIBDEPS) -lc"; \
		APPNAME="$(APPNAME)"
	fi; \
	$(LINK_APP)
297 298 299 300 301

# 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 \
302
		$(DO_GNU_SO); \
303
	else \
304 305 306
		SHLIB=lib$(LIBNAME).so; \
		SHLIB_SUFFIX=; \
		LIBDEPS="$(LIBDEPS) -lc"; \
307 308 309 310 311
		SHLIB_HIST=`echo "$(LIBCOMPATVERSIONS)" | cut -d';' -f2 | sed -e 's/ */:/'`; \
		if [ -n "$$SHLIB_HIST" ]; then \
			SHLIB_HIST="$${SHLIB_HIST}:$(LIBVERSION)"; \
		else \
			SHLIB_HIST="$(LIBVERSION)"; \
312
		fi; \
313 314 315
		SHLIB_SOVER=; \
		ALLSYMSFLAGS='-all'; \
		NOALLSYMSFLAGS='-none'; \
316
		SHAREDFLAGS="-shared -msym -rpath $(LIBRPATH)"; \
317
		SHAREDCMD='$(CC)'; \
318
		if [ -n "$$SHLIB_HIST" ]; then \
319
			SHAREDFLAGS="$$SHAREDFLAGS -set_version \"$$SHLIB_HIST\""; \
320
		fi; \
321 322
	fi; \
	$(LINK_SO_O)
323 324
link_a.tru64:
	@ if ${DETECT_GNU_LD}; then \
325
		$(DO_GNU_SO); \
326
	else \
327 328 329
		SHLIB=lib$(LIBNAME).so; \
		SHLIB_SUFFIX=; \
		LIBDEPS="$(LIBDEPS) -lc"; \
330 331 332 333 334
		SHLIB_HIST=`echo "$(LIBCOMPATVERSIONS)" | cut -d';' -f2 | sed -e 's/ */:/'`; \
		if [ -n "$$SHLIB_HIST" ]; then \
			SHLIB_HIST="$${SHLIB_HIST}:$(LIBVERSION)"; \
		else \
			SHLIB_HIST="$(LIBVERSION)"; \
335
		fi; \
336 337 338
		SHLIB_SOVER=; \
		ALLSYMSFLAGS='-all'; \
		NOALLSYMSFLAGS='-none'; \
339
		SHAREDFLAGS="-shared -msym -rpath $(LIBRPATH)"; \
340
		SHAREDCMD='$(CC)'; \
341
		if [ -n "$$SHLIB_HIST" ]; then \
342
			SHAREDFLAGS="$$SHAREDFLAGS -set_version \"$$SHLIB_HIST\""; \
343
		fi; \
344 345
	fi; \
	$(LINK_SO_A)
346 347 348 349 350 351 352 353 354 355
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)
356 357 358 359 360

# 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 \
361
		$(DO_GNU_SO); \
362
	else \
363 364 365
		SHLIB=lib$(LIBNAME).so; \
		SHLIB_SUFFIX=; \
		LIBDEPS="$(LIBDEPS) -lc"; \
366 367 368 369 370
		SHLIB_HIST=`echo "$(LIBCOMPATVERSIONS)" | cut -d';' -f2 | sed -e 's/ */:/'`; \
		if [ -n "$$SHLIB_HIST" ]; then \
			SHLIB_HIST="$${SHLIB_HIST}:$(LIBVERSION)"; \
		else \
			SHLIB_HIST="$(LIBVERSION)"; \
371
		fi; \
372 373 374 375
		SHLIB_SOVER=; \
		ALLSYMSFLAGS='-all'; \
		NOALLSYMSFLAGS='-none'; \
		SHAREDFLAGS="-shared -msym -rpath $(LIBRPATH)"; \
376
		SHAREDCMD='$(CC)'; \
377
		if [ -n "$$SHLIB_HIST" ]; then \
378
			SHAREDFLAGS="$$SHAREDFLAGS -set_version \"$$SHLIB_HIST\""; \
379
		fi; \
380 381
	fi; \
	$(LINK_SO_O)
382 383
link_a.tru64-rpath:
	@ if ${DETECT_GNU_LD}; then \
384
		$(DO_GNU_SO); \
385
	else \
386 387 388
		SHLIB=lib$(LIBNAME).so; \
		SHLIB_SUFFIX=; \
		LIBDEPS="$(LIBDEPS) -lc"; \
389 390 391 392 393
		SHLIB_HIST=`echo "$(LIBCOMPATVERSIONS)" | cut -d';' -f2 | sed -e 's/ */:/'`; \
		if [ -n "$$SHLIB_HIST" ]; then \
			SHLIB_HIST="$${SHLIB_HIST}:$(LIBVERSION)"; \
		else \
			SHLIB_HIST="$(LIBVERSION)"; \
394
		fi; \
395 396 397 398
		SHLIB_SOVER=; \
		ALLSYMSFLAGS='-all'; \
		NOALLSYMSFLAGS='-none'; \
		SHAREDFLAGS="-shared -msym -rpath $(LIBRPATH)"; \
399
		SHAREDCMD='$(CC)'; \
400
		if [ -n "$$SHLIB_HIST" ]; then \
401
			SHAREDFLAGS="$$SHAREDFLAGS -set_version \"$$SHLIB_HIST\""; \
402
		fi; \
403 404
	fi; \
	$(LINK_SO_A)
405 406 407 408 409 410 411 412 413 414
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)
415 416

link_o.solaris:
R
Richard Levitte 已提交
417
	@ if ${DETECT_GNU_LD}; then \
418
		$(DO_GNU_SO); \
419 420
	else \
		$(CALC_VERSIONS); \
421 422
		MINUSZ='-z '; \
		(${CC} -v 2>&1 | grep gcc) > /dev/null && MINUSZ='-Wl,-z,'; \
423 424 425 426 427
		SHLIB=lib$(LIBNAME).so; \
		SHLIB_SUFFIX=; \
		LIBDEPS="$(LIBDEPS) -lc"; \
		ALLSYMSFLAGS="$${MINUSZ}allextract"; \
		NOALLSYMSFLAGS="$${MINUSZ}defaultextract"; \
428
		SHAREDFLAGS="-G -dy -z text -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX -R $(LIBRPATH)"; \
429
		SHAREDCMD='$(CC)'; \
430 431
	fi; \
	$(LINK_SO_O)
432
link_a.solaris:
R
Richard Levitte 已提交
433
	@ if ${DETECT_GNU_LD}; then \
434
		$(DO_GNU_SO); \
435 436
	else \
		$(CALC_VERSIONS); \
437 438
		MINUSZ='-z '; \
		(${CC} -v 2>&1 | grep gcc) > /dev/null && MINUSZ='-Wl,-z,'; \
439 440 441 442 443
		SHLIB=lib$(LIBNAME).so; \
		SHLIB_SUFFIX=;\
		LIBDEPS="$(LIBDEPS) -lc"; \
		ALLSYMSFLAGS="$${MINUSZ}allextract"; \
		NOALLSYMSFLAGS="$${MINUSZ}defaultextract"; \
444
		SHAREDFLAGS="-G -dy -z text -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX -R $(LIBRPATH)"; \
445
		SHAREDCMD='$(CC)'; \
446 447
	fi; \
	$(LINK_SO_A)
448 449 450 451 452 453 454 455 456 457
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)
458 459 460

# OpenServer 5 native compilers used
link_o.svr3:
R
Richard Levitte 已提交
461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500
	@ 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:
501
	@ if ${DETECT_GNU_LD}; then \
502
		$(DO_GNU_SO); \
503 504
	else \
		$(CALC_VERSIONS); \
505
		SHARE_FLAG='-G'; \
506
		(${CC} -v 2>&1 | grep gcc) > /dev/null && SHARE_FLAG='-shared'; \
507 508 509
		SHLIB=lib$(LIBNAME).so; \
		SHLIB_SUFFIX=; \
		LIBDEPS="$(LIBDEPS) -lc"; \
510
		ALLSYMSFLAGS=''; \
511
		NOALLSYMSFLAGS=''; \
512
		SHAREDFLAGS="$${SHARE_FLAG} -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"; \
513
		SHAREDCMD='$(CC)'; \
514 515
	fi; \
	$(LINK_SO_O)
R
Richard Levitte 已提交
516
link_a.svr5:
517
	@ if ${DETECT_GNU_LD}; then \
518
		$(DO_GNU_SO); \
519 520
	else \
		$(CALC_VERSIONS); \
521
		SHARE_FLAG='-G'; \
522
		(${CC} -v 2>&1 | grep gcc) > /dev/null && SHARE_FLAG='-shared'; \
523 524 525
		SHLIB=lib$(LIBNAME).so; \
		SHLIB_SUFFIX=; \
		LIBDEPS="$(LIBDEPS) -lc"; \
526
		ALLSYMSFLAGS=''; \
527
		NOALLSYMSFLAGS=''; \
528
		SHAREDFLAGS="$${SHARE_FLAG} -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"; \
529
		SHAREDCMD='$(CC)'; \
530 531
	fi; \
	$(LINK_SO_A_UNPACKED)
R
Richard Levitte 已提交
532
link_app.svr5:
533 534 535 536 537 538 539 540 541
	@ if ${DETECT_GNU_LD}; then \
		$(DO_GNU_APP); \
	else \
		LDCMD=$(CC);\
		LDFLAGS=""; \
		LIBDEPS="$(LIBDEPS) -lc"; \
		APPNAME="$(APPNAME)"; \
	fi; \
	$(LINK_APP)
542 543 544

link_o.irix:
	@ if ${DETECT_GNU_LD}; then \
545
		$(DO_GNU_SO); \
546 547
	else \
		$(CALC_VERSIONS); \
548 549 550
		SHLIB=lib$(LIBNAME).so; \
		SHLIB_SUFFIX=; \
		LIBDEPS="$(LIBDEPS) -lc"; \
A
Andy Polyakov 已提交
551 552 553 554
		MINUSWL=""; \
		($(CC) -v 2>&1 | grep gcc) > /dev/null && MINUSWL="-Wl,"; \
		ALLSYMSFLAGS="$${MINUSWL}-all"; \
		NOALLSYMSFLAGS="$${MINUSWL}-notall"; \
555
		SHAREDFLAGS="-shared -Wl,-soname,$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX -Wl,-rpath,$(LIBRPATH)"; \
556
		SHAREDCMD='$(CC)'; \
557 558
	fi; \
	$(LINK_SO_O)
559 560
link_a.irix:
	@ if ${DETECT_GNU_LD}; then \
561
		$(DO_GNU_SO); \
562 563
	else \
		$(CALC_VERSIONS); \
564 565 566
		SHLIB=lib$(LIBNAME).so; \
		SHLIB_SUFFIX=; \
		LIBDEPS="$(LIBDEPS) -lc"; \
A
Andy Polyakov 已提交
567 568 569 570
		MINUSWL=""; \
		($(CC) -v 2>&1 | grep gcc) > /dev/null && MINUSWL="-Wl,"; \
		ALLSYMSFLAGS="$${MINUSWL}-all"; \
		NOALLSYMSFLAGS="$${MINUSWL}-notall"; \
571
		SHAREDFLAGS="-shared -Wl,-soname,$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX -Wl,-rpath,$(LIBRPATH)"; \
572
		SHAREDCMD='$(CC)'; \
573 574
	fi; \
	$(LINK_SO_A)
575 576 577 578 579 580 581 582 583 584
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)
585

586 587 588 589 590 591 592
# 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].
593
#
594
link_o.hpux:
595 596
	@if ${DETECT_GNU_LD}; then $(DO_GNU_SO); else \
	$(CALC_VERSIONS); \
597 598
	SHLIB=lib$(LIBNAME).sl; \
	SHLIB_SUFFIX=; \
599 600
	LIBDEPS="$(LIBDEPS)"; \
	ALLSYMSFLAGS='-Wl,-Fl'; \
601
	NOALLSYMSFLAGS=''; \
602
	expr $(PLATFORM) : 'hpux64' > /dev/null && ALLSYMSFLAGS='-Wl,+forceload'; \
603
	SHAREDFLAGS="-Wl,-B,symbolic,+vnocompatwarnings,-z,+s,+cdp,../:,+cdp,./:,+h,$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX,+b,$(LIBRPATH)"; \
604
	SHAREDCMD=$(CC); \
605
	fi; \
606
	$(LINK_SO_O) && chmod a=rx $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX
607
link_a.hpux:
608 609
	@if ${DETECT_GNU_LD}; then $(DO_GNU_SO); else \
	$(CALC_VERSIONS); \
610 611
	SHLIB=lib$(LIBNAME).sl; \
	SHLIB_SUFFIX=; \
612 613
	LIBDEPS="$(LIBDEPS)"; \
	ALLSYMSFLAGS='-Wl,-Fl'; \
614
	NOALLSYMSFLAGS=''; \
615
	expr $(PLATFORM) : 'hpux64' > /dev/null && ALLSYMSFLAGS='-Wl,+forceload'; \
616
	SHAREDFLAGS="-Wl,-B,symbolic,+vnocompatwarnings,-z,+s,+cdp,../:,+cdp,./:,+h,$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX,+b,$(LIBRPATH)"; \
617
	SHAREDCMD='$(CC)'; \
618
	fi; \
619
	$(LINK_SO_A) && chmod a=rx $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX
620
link_app.hpux:
621
	@if ${DETECT_GNU_LD}; then $(DO_GNU_APP); else \
622
	LDCMD=$(CC);\
623
	LDFLAGS="-Wl,+s,+cdp,../:,+cdp,./:,+b,$(LIBRPATH)"; \
624 625
	LIBDEPS="$(LIBDEPS)"; \
	APPNAME="$(APPNAME)"; \
626
	fi; \
627
	$(LINK_APP)
628 629 630

link_o.aix:
	@ $(CALC_VERSIONS); \
631 632 633 634 635
	SHLIB=lib$(LIBNAME).so; \
	SHLIB_SUFFIX=; \
	LIBDEPS="$(LIBDEPS) -lc"; \
	ALLSYMSFLAGS='-bnogc'; \
	NOALLSYMSFLAGS=''; \
636
	SHAREDFLAGS='-G -bE:lib$(LIBNAME).exp -bM:SRE -blibpath:$(LIBRPATH)'; \
637 638 639 640
	SHAREDCMD='$(CC)'; \
	$(LINK_SO_O)
link_a.aix:
	@ $(CALC_VERSIONS); \
641 642 643 644 645
	SHLIB=lib$(LIBNAME).so; \
	SHLIB_SUFFIX=; \
	LIBDEPS="$(LIBDEPS) -lc"; \
	ALLSYMSFLAGS='-bnogc'; \
	NOALLSYMSFLAGS=''; \
646
	SHAREDFLAGS='-G -bE:lib$(LIBNAME).exp -bM:SRE -blibpath:$(LIBRPATH)'; \
647 648
	SHAREDCMD='$(CC)'; \
	$(LINK_SO_A_VIA_O)
649 650 651 652 653 654
link_app.aix:
	LDCMD=$(CC);\
	LDFLAGS="-blibpath:$(LIBRPATH)"; \
	LIBDEPS="$(LIBDEPS) -lc"; \
	APPNAME="$(APPNAME)"
	$(LINK_APP)
655 656 657

link_o.reliantunix:
	@ $(CALC_VERSIONS); \
658 659 660 661 662 663
	SHLIB=lib$(LIBNAME).so; \
	SHLIB_SUFFIX=; \
	LIBDEPS="$(LIBDEPS) -lc"; \
	ALLSYMSFLAGS=; \
	NOALLSYMSFLAGS=''; \
	SHAREDFLAGS='-G'; \
664 665 666 667
	SHAREDCMD='$(CC)'; \
	$(LINK_SO_O)
link_a.reliantunix:
	@ $(CALC_VERSIONS); \
668 669 670 671 672 673
	SHLIB=lib$(LIBNAME).so; \
	SHLIB_SUFFIX=; \
	LIBDEPS="$(LIBDEPS) -lc"; \
	ALLSYMSFLAGS=; \
	NOALLSYMSFLAGS=''; \
	SHAREDFLAGS='-G'; \
674 675
	SHAREDCMD='$(CC)'; \
	$(LINK_SO_A_UNPACKED)
676 677 678 679 680 681
link_app.reliantunix:
	LDCMD=$(CC);\
	LDFLAGS=""; \
	LIBDEPS="$(LIBDEPS) -lc"; \
	APPNAME="$(APPNAME)"
	$(LINK_APP)
682 683

# Targets to build symbolic links when needed
R
Richard Levitte 已提交
684
symlink.gnu symlink.solaris symlink.svr3 symlink.svr5 symlink.irix \
685 686
symlink.aix symlink.reliantunix:
	@ $(CALC_VERSIONS); \
687
	SHLIB=lib$(LIBNAME).so; \
688
	$(SYMLINK_SO)
689 690
symlink.darwin:
	@ $(CALC_VERSIONS); \
691
	SHLIB=lib$(LIBNAME); \
692
	SHLIB_SUFFIX=.dylib; \
693
	$(SYMLINK_SO)
694
symlink.hpux:
695
	@ $(CALC_VERSIONS); \
696
	SHLIB=lib$(LIBNAME).sl; \
697
	$(SYMLINK_SO)
698 699
# The following lines means those specific architectures do no symlinks
symlink.cygwin symlib.alpha-osf1 symlink.tru64 symlink.tru64-rpath:
700 701 702 703

# 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
704
link_app.bsd-gcc-shared link_app.linux-shared link_app.gnu-shared: link_app.gnu
705 706 707
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
708
link_app.darwin-shared: link_app.darwin
709 710 711
symlink.darwin-shared: symlink.darwin
link_o.cygwin-shared: link_o.cygwin
link_a.cygwin-shared: link_a.cygwin
712
link_app.cygwin-shared: link_app.cygwin
713 714 715
symlink.cygwin-shared: symlink.cygwin
link_o.alpha-osf1-shared: link_o.alpha-osf1
link_a.alpha-osf1-shared: link_a.alpha-osf1
716
link_app.alpha-osf1-shared: link_app.alpha-osf1
717 718 719
symlink.alpha-osf1-shared: symlink.alpha-osf1
link_o.tru64-shared: link_o.tru64
link_a.tru64-shared: link_a.tru64
720
link_app.tru64-shared: link_app.tru64
721 722 723
symlink.tru64-shared: symlink.tru64
link_o.tru64-shared-rpath: link_o.tru64-rpath
link_a.tru64-shared-rpath: link_a.tru64-rpath
724
link_app.tru64-shared-rpath: link_app.tru64-rpath
725 726 727
symlink.tru64-shared-rpath: symlink.tru64-rpath
link_o.solaris-shared: link_o.solaris
link_a.solaris-shared: link_a.solaris
728
link_app.solaris-shared: link_app.solaris
729 730 731
symlink.solaris-shared: symlink.solaris
link_o.svr3-shared: link_o.svr3
link_a.svr3-shared: link_a.svr3
732
link_app.svr3-shared: link_app.svr3
733
symlink.svr3-shared: symlink.svr3
R
Richard Levitte 已提交
734 735 736 737
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
738 739
link_o.irix-shared: link_o.irix
link_a.irix-shared: link_a.irix
740
link_app.irix-shared: link_app.irix
741
symlink.irix-shared: symlink.irix
742 743 744 745
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
746 747
link_o.aix-shared: link_o.aix
link_a.aix-shared: link_a.aix
748
link_app.aix-shared: link_app.aix
749 750 751
symlink.aix-shared: symlink.aix
link_o.reliantunix-shared: link_o.reliantunix
link_a.reliantunix-shared: link_a.reliantunix
752
link_app.reliantunix-shared: link_app.reliantunix
753
symlink.reliantunix-shared: symlink.reliantunix