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 593 594 595

# HP-UX includes the full pathname of libs we depend on, so we would get
# ./libcrypto (with ./ as path information) compiled into libssl, hence
# we omit the SHLIBDEPS. Applications must be linked with -lssl -lcrypto
# anyway.
# The object modules are loaded from lib$i.a using the undocumented -Fl
# option.
#
# WARNING: Until DSO is fixed to support a search path, we support SHLIB_PATH
#          by temporarily specifying "+s"!
#
596
link_o.hpux:
597 598
	@if ${DETECT_GNU_LD}; then $(DO_GNU_SO); else \
	$(CALC_VERSIONS); \
599 600
	SHLIB=lib$(LIBNAME).sl; \
	SHLIB_SUFFIX=; \
601 602
	LIBDEPS="$(LIBDEPS)"; \
	ALLSYMSFLAGS='-Wl,-Fl'; \
603
	NOALLSYMSFLAGS=''; \
604
	expr $(PLATFORM) : 'hpux64' > /dev/null && ALLSYMSFLAGS='-Wl,+forceload'; \
605
	SHAREDFLAGS="-Wl,-B,symbolic,+vnocompatwarnings,-z,+s,+cdp,../:,+cdp,./:,+h,$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX,+b,$(LIBRPATH)"; \
606
	SHAREDCMD=$(CC); \
607
	fi; \
608
	$(LINK_SO_O) && chmod a=rx $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX
609
link_a.hpux:
610 611
	@if ${DETECT_GNU_LD}; then $(DO_GNU_SO); else \
	$(CALC_VERSIONS); \
612 613
	SHLIB=lib$(LIBNAME).sl; \
	SHLIB_SUFFIX=; \
614 615
	LIBDEPS="$(LIBDEPS)"; \
	ALLSYMSFLAGS='-Wl,-Fl'; \
616
	NOALLSYMSFLAGS=''; \
617
	expr $(PLATFORM) : 'hpux64' > /dev/null && ALLSYMSFLAGS='-Wl,+forceload'; \
618
	SHAREDFLAGS="-Wl,-B,symbolic,+vnocompatwarnings,-z,+s,+cdp,../:,+cdp,./:,+h,$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX,+b,$(LIBRPATH)"; \
619
	SHAREDCMD='$(CC)'; \
620
	fi; \
621
	$(LINK_SO_A) && chmod a=rx $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX
622
link_app.hpux:
623
	@if ${DETECT_GNU_LD}; then $(DO_GNU_APP); else \
624
	LDCMD=$(CC);\
625
	LDFLAGS="-Wl,+s,+cdp,../:,+cdp,./:,+b,$(LIBRPATH)"; \
626 627
	LIBDEPS="$(LIBDEPS)"; \
	APPNAME="$(APPNAME)"; \
628
	fi; \
629
	$(LINK_APP)
630 631 632

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

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

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

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