Makefile.shared 23.6 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
# 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.

B
Ben Laurie 已提交
69 70
SET_X=:
#SET_X=set -x
71 72 73 74 75 76

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
LINK_APP=	\
90
  ( $(SET_X);   \
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
    $$LDCMD $$LDFLAGS -o $$APPNAME $(OBJECTS) $$LIBDEPS )
95

96
LINK_SO=	\
97
  ( $(SET_X);   \
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 $$SHAREDFLAGS -o $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX \
103
	$$ALLSYMSFLAGS $$SHOBJECTS $$NOALLSYMSFLAGS $$LIBDEPS ) && \
104
  $(SYMLINK_SO); ( $(SET_X); rm -f lib$(LIBNAME).exp )
105
SYMLINK_SO=	\
106 107 108 109
	if [ -n "$$INHIBIT_SYMLINKS" ]; then :; else \
		prev=$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX; \
		if [ -n "$$SHLIB_COMPAT" ]; then \
			for x in $$SHLIB_COMPAT; do \
110
				( $(SET_X); rm -f $$SHLIB$$x$$SHLIB_SUFFIX; \
111 112 113 114 115
				  ln -s $$prev $$SHLIB$$x$$SHLIB_SUFFIX ); \
				prev=$$SHLIB$$x$$SHLIB_SUFFIX; \
			done; \
		fi; \
		if [ -n "$$SHLIB_SOVER" ]; then \
116
			( $(SET_X); rm -f $$SHLIB$$SHLIB_SUFFIX; \
117 118
			  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
  ( $(SET_X); \
127 128 129 130
    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
	SHLIB=lib$(LIBNAME).so; \
	SHLIB_SUFFIX=; \
141
	LIBDEPS="$(LIBDEPS)"; \
142 143
	ALLSYMSFLAGS='-Wl,--whole-archive'; \
	NOALLSYMSFLAGS='-Wl,--no-whole-archive'; \
144
	SHAREDFLAGS="$(CFLAGS) -shared -Wl,-Bsymbolic -Wl,-soname=$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX -Wl,-rpath,$(LIBRPATH)"; \
145
	SHAREDCMD='$(CC)'
146
DO_GNU_APP=LDCMD=$(CC);\
147
	LDFLAGS="$(CFLAGS) -Wl,-rpath,$(LIBRPATH)"; \
148
	LIBDEPS="$(LIBDEPS)"; \
149
	APPNAME=$(APPNAME)
150

151 152 153 154 155 156 157
#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); \
158
	LDFLAGS="$(CFLAGS)"; \
159 160 161 162
	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
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=; \
178
	SHAREDFLAGS="$(CFLAGS) -shared -nostdlib"; \
179 180 181 182 183 184 185 186 187 188
	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=; \
189
	SHAREDFLAGS="$(CFLAGS) -shared -nostdlib"; \
190 191 192 193 194
	SHAREDCMD=$(CC); \
	fi; $(LINK_SO_A)
link_app.bsd:
	@if ${DETECT_GNU_LD}; then $(DO_GNU_APP); else \
	LDCMD=$(CC); \
195
	LDFLAGS="$(CFLAGS) -Wl,-rpath,$(LIBPATH)"; \
196 197 198 199
	LIBDEPS="$(LIBDEPS)"; \
	APPNAME="$(APPNAME)"; \
	fi; $(LINK_APP)

200 201 202
# For Darwin AKA Mac OS/X (dyld)
link_o.darwin:
	@ $(CALC_VERSIONS); \
203 204
	SHLIB=lib$(LIBNAME); \
	SHLIB_SUFFIX=.dylib; \
205
	LIBDEPS="$(LIBDEPS)"; \
206 207
	ALLSYMSFLAGS='-all_load'; \
	NOALLSYMSFLAGS=''; \
208
	SHAREDFLAGS="$(CFLAGS) -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
	SHLIB=lib$(LIBNAME); \
	SHLIB_SUFFIX=.dylib; \
221
	LIBDEPS="$(LIBDEPS)"; \
222 223
	ALLSYMSFLAGS='-all_load'; \
	NOALLSYMSFLAGS=''; \
224
	SHAREDFLAGS="$(CFLAGS) -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
link_app.darwin:
	LDCMD=$(CC);\
235
	LDFLAGS="$(CFLAGS)"; \
236
	LIBDEPS="$(LIBDEPS)"; \
237 238
	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="$(CFLAGS) -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="$(CFLAGS) -Wl,-Bsymbolic -Wl,--out-implib,lib$(LIBNAME).dll.a"; \
264 265
	SHAREDCMD='${CC}'; \
	$(LINK_SO_A)
266 267
link_app.cygwin:
	LDCMD=$(CC);\
268
	LDFLAGS="$(CFLAGS)"; \
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
		SHLIB=lib$(LIBNAME).so; \
		SHLIB_SUFFIX=; \
279
		LIBDEPS="$(LIBDEPS)"; \
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
		SHLIB_SOVER=; \
		ALLSYMSFLAGS='-all'; \
		NOALLSYMSFLAGS='-none'; \
289
		SHAREDFLAGS="$(CFLAGS) -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
		SHLIB=lib$(LIBNAME).so; \
		SHLIB_SUFFIX=; \
302
		LIBDEPS="$(LIBDEPS)"; \
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
		SHLIB_SOVER=; \
		ALLSYMSFLAGS='-all'; \
		NOALLSYMSFLAGS='-none'; \
312
		SHAREDFLAGS="$(CFLAGS) -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
link_app.alpha-osf1:
	@ if ${DETECT_GNU_LD}; then \
		$(DO_GNU_APP); \
	else \
		LDCMD=$(CC);\
324
		LDFLAGS="$(CFLAGS)"; \
325
		LIBDEPS="$(LIBDEPS)"; \
326 327 328
		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
		SHLIB=lib$(LIBNAME).so; \
		SHLIB_SUFFIX=; \
338
		LIBDEPS="$(LIBDEPS)"; \
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="$(CFLAGS) -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
		SHLIB=lib$(LIBNAME).so; \
		SHLIB_SUFFIX=; \
361
		LIBDEPS="$(LIBDEPS)"; \
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="$(CFLAGS) -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
link_app.tru64:
	@ if ${DETECT_GNU_LD}; then \
		$(DO_GNU_APP); \
	else \
		LDCMD=$(CC);\
383
		LDFLAGS="$(CFLAGS) -rpath $(LIBRPATH)"; \
384
		LIBDEPS="$(LIBDEPS)"; \
385 386 387
		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
		SHLIB=lib$(LIBNAME).so; \
		SHLIB_SUFFIX=; \
397
		LIBDEPS="$(LIBDEPS)"; \
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
		SHLIB_SOVER=; \
		ALLSYMSFLAGS='-all'; \
		NOALLSYMSFLAGS='-none'; \
407
		SHAREDFLAGS="$(CFLAGS) -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
		SHLIB=lib$(LIBNAME).so; \
		SHLIB_SUFFIX=; \
420
		LIBDEPS="$(LIBDEPS)"; \
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
		SHLIB_SOVER=; \
		ALLSYMSFLAGS='-all'; \
		NOALLSYMSFLAGS='-none'; \
430
		SHAREDFLAGS="$(CFLAGS) -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
link_app.tru64-rpath:
	@ if ${DETECT_GNU_LD}; then \
		$(DO_GNU_APP); \
	else \
		LDCMD=$(CC);\
442
		LDFLAGS="$(CFLAGS) -rpath $(LIBRPATH)"; \
443
		LIBDEPS="$(LIBDEPS)"; \
444 445 446
		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
		SHLIB=lib$(LIBNAME).so; \
		SHLIB_SUFFIX=; \
457
		LIBDEPS="$(LIBDEPS)"; \
458 459
		ALLSYMSFLAGS="$${MINUSZ}allextract"; \
		NOALLSYMSFLAGS="$${MINUSZ}defaultextract"; \
460
		SHAREDFLAGS="$(CFLAGS) -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
		SHLIB=lib$(LIBNAME).so; \
		SHLIB_SUFFIX=;\
473
		LIBDEPS="$(LIBDEPS)"; \
474 475
		ALLSYMSFLAGS="$${MINUSZ}allextract"; \
		NOALLSYMSFLAGS="$${MINUSZ}defaultextract"; \
476
		SHAREDFLAGS="$(CFLAGS) -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
link_app.solaris:
	@ if ${DETECT_GNU_LD}; then \
		$(DO_GNU_APP); \
	else \
		LDCMD=$(CC);\
485
		LDFLAGS="$(CFLAGS) -R $(LIBRPATH)"; \
486
		LIBDEPS="$(LIBDEPS)"; \
487 488 489
		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
	@ if ${DETECT_GNU_LD}; then \
		$(DO_GNU_SO); \
	else \
		$(CALC_VERSIONS); \
		SHLIB=lib$(LIBNAME).so; \
		SHLIB_SUFFIX=; \
499
		LIBDEPS="$(LIBDEPS)"; \
R
Richard Levitte 已提交
500 501
		ALLSYMSFLAGS=''; \
		NOALLSYMSFLAGS=''; \
502
		SHAREDFLAGS="$(CFLAGS) -G -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"; \
R
Richard Levitte 已提交
503 504 505 506 507 508 509 510 511 512
		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=; \
513
		LIBDEPS="$(LIBDEPS)"; \
R
Richard Levitte 已提交
514 515
		ALLSYMSFLAGS=''; \
		NOALLSYMSFLAGS=''; \
516
		SHAREDFLAGS="$(CFLAGS) -G -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"; \
R
Richard Levitte 已提交
517 518 519 520 521 522 523 524
		SHAREDCMD='$(CC)'; \
	fi; \
	$(LINK_SO_A_UNPACKED)
link_app.svr3:
	@ if ${DETECT_GNU_LD}; then \
		$(DO_GNU_APP); \
	else \
		LDCMD=$(CC);\
525
		LDFLAGS="$(CFLAGS)"; \
526
		LIBDEPS="$(LIBDEPS)"; \
R
Richard Levitte 已提交
527 528 529 530 531 532
		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
		SHLIB=lib$(LIBNAME).so; \
		SHLIB_SUFFIX=; \
541
		LIBDEPS="$(LIBDEPS)"; \
542
		ALLSYMSFLAGS=''; \
543
		NOALLSYMSFLAGS=''; \
544
		SHAREDFLAGS="$(CFLAGS) $${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
		SHLIB=lib$(LIBNAME).so; \
		SHLIB_SUFFIX=; \
557
		LIBDEPS="$(LIBDEPS)"; \
558
		ALLSYMSFLAGS=''; \
559
		NOALLSYMSFLAGS=''; \
560
		SHAREDFLAGS="$(CFLAGS) $${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
	@ if ${DETECT_GNU_LD}; then \
		$(DO_GNU_APP); \
	else \
		LDCMD=$(CC);\
569
		LDFLAGS="$(CFLAGS)"; \
570
		LIBDEPS="$(LIBDEPS)"; \
571 572 573
		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
		SHLIB=lib$(LIBNAME).so; \
		SHLIB_SUFFIX=; \
582
		LIBDEPS="$(LIBDEPS)"; \
A
Andy Polyakov 已提交
583 584 585
		MINUSWL=""; \
		($(CC) -v 2>&1 | grep gcc) > /dev/null && MINUSWL="-Wl,"; \
		ALLSYMSFLAGS="$${MINUSWL}-all"; \
586
		NOALLSYMSFLAGS="$${MINUSWL}-none"; \
587
		SHAREDFLAGS="$(CFLAGS) -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
		SHLIB=lib$(LIBNAME).so; \
		SHLIB_SUFFIX=; \
598
		LIBDEPS="$(LIBDEPS)"; \
A
Andy Polyakov 已提交
599 600 601
		MINUSWL=""; \
		($(CC) -v 2>&1 | grep gcc) > /dev/null && MINUSWL="-Wl,"; \
		ALLSYMSFLAGS="$${MINUSWL}-all"; \
602
		NOALLSYMSFLAGS="$${MINUSWL}-none"; \
603
		SHAREDFLAGS="$(CFLAGS) -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
link_app.irix:
	@ if ${DETECT_GNU_LD}; then \
		$(DO_GNU_APP); \
	else \
		LDCMD=$(CC);\
612
		LDFLAGS="$(CFLAGS) -Wl,-rpath,$(LIBRPATH)"; \
613
		LIBDEPS="$(LIBDEPS)"; \
614 615 616
		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="$(CFLAGS) -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="$(CFLAGS) -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="$(CFLAGS) -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
	OBJECT_MODE=`expr x$(SHARED_LDFLAGS) : 'x\-[a-z]\([0-9]*\)'`; \
	OBJECT_MODE=$${OBJECT_MODE:-32}; export OBJECT_MODE; \
667 668
	SHLIB=lib$(LIBNAME).so; \
	SHLIB_SUFFIX=; \
669
	LIBDEPS="$(LIBDEPS)"; \
670 671
	ALLSYMSFLAGS='-bnogc'; \
	NOALLSYMSFLAGS=''; \
672
	SHAREDFLAGS='$(CFLAGS) -G -bE:lib$(LIBNAME).exp -bM:SRE -blibpath:$(LIBRPATH)'; \
673
	SHAREDCMD='$(CC)'; \
674
	$(LINK_SO_O); rm -rf lib$(LIBNAME).exp
675 676
link_a.aix:
	@ $(CALC_VERSIONS); \
677 678
	OBJECT_MODE=`expr x$(SHARED_LDFLAGS) : 'x\-[a-z]\([0-9]*\)'`; \
	OBJECT_MODE=$${OBJECT_MODE:-32}; export OBJECT_MODE; \
679 680
	SHLIB=lib$(LIBNAME).so; \
	SHLIB_SUFFIX=; \
681
	LIBDEPS="$(LIBDEPS)"; \
682 683
	ALLSYMSFLAGS='-bnogc'; \
	NOALLSYMSFLAGS=''; \
684
	SHAREDFLAGS='$(CFLAGS) -G -bE:lib$(LIBNAME).exp -bM:SRE -blibpath:$(LIBRPATH)'; \
685 686
	SHAREDCMD='$(CC)'; \
	$(LINK_SO_A_VIA_O)
687 688
link_app.aix:
	LDCMD=$(CC);\
689
	LDFLAGS="$(CFLAGS) -blibpath:$(LIBRPATH)"; \
690
	LIBDEPS="$(LIBDEPS)"; \
691 692
	APPNAME="$(APPNAME)"
	$(LINK_APP)
693 694 695

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

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

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