Makefile.shared revision 306195
1#
2# Helper makefile to link shared libraries in a portable way.
3# This is much simpler than libtool, and hopefully not too error-prone.
4#
5# The following variables need to be set on the command line to build
6# properly
7
8# CC contains the current compiler.  This one MUST be defined
9CC=cc
10CFLAGS=$(CFLAG)
11# LDFLAGS contains flags to be used when temporary object files (when building
12# shared libraries) are created, or when an application is linked.
13# SHARED_LDFLAGS contains flags to be used when the shared library is created.
14LDFLAGS=
15SHARED_LDFLAGS=
16
17NM=nm
18
19# LIBNAME contains just the name of the library, without prefix ("lib"
20# on Unix, "cyg" for certain forms under Cygwin...) or suffix (.a, .so,
21# .dll, ...).  This one MUST have a value when using this makefile to
22# build shared libraries.
23# For example, to build libfoo.so, you need to do the following:
24#LIBNAME=foo
25LIBNAME=
26
27# APPNAME contains just the name of the application, without suffix (""
28# on Unix, ".exe" on Windows, ...).  This one MUST have a value when using
29# this makefile to build applications.
30# For example, to build foo, you need to do the following:
31#APPNAME=foo
32APPNAME=
33
34# OBJECTS contains all the object files to link together into the application.
35# This must contain at least one object file.
36#OBJECTS=foo.o
37OBJECTS=
38
39# LIBEXTRAS contains extra modules to link together with the library.
40# For example, if a second library, say libbar.a needs to be linked into
41# libfoo.so, you need to do the following:
42#LIBEXTRAS=libbar.a
43# Note that this MUST be used when using the link_o targets, to hold the
44# names of all object files that go into the target library.
45LIBEXTRAS=
46
47# LIBVERSION contains the current version of the library.
48# For example, to build libfoo.so.1.2, you need to do the following:
49#LIBVERSION=1.2
50LIBVERSION=
51
52# LIBCOMPATVERSIONS contains the compatibility versions (a list) of
53# the library.  They MUST be in decreasing order.
54# For example, if libfoo.so.1.2.1 is backward compatible with libfoo.so.1.2
55# and libfoo.so.1, you need to do the following:
56#LIBCOMPATVERSIONS=1.2 1
57# Note that on systems that use sonames, the last number will appear as
58# part of it.
59# It's also possible, for systems that support it (Tru64, for example),
60# to add extra compatibility info with more precision, by adding a second
61# list of versions, separated from the first with a semicolon, like this:
62#LIBCOMPATVERSIONS=1.2 1;1.2.0 1.1.2 1.1.1 1.1.0 1.0.0
63LIBCOMPATVERSIONS=
64
65# LIBDEPS contains all the flags necessary to cover all necessary
66# dependencies to other libraries.
67LIBDEPS=
68
69#------------------------------------------------------------------------------
70# The rest is private to this makefile.
71
72SET_X=:
73#SET_X=set -x
74
75top:
76	echo "Trying to use this makefile interactively?  Don't."
77
78CALC_VERSIONS=	\
79	SHLIB_COMPAT=; SHLIB_SOVER=; \
80	if [ -n "$(LIBVERSION)$(LIBCOMPATVERSIONS)" ]; then \
81		prev=""; \
82		for v in `echo "$(LIBVERSION) $(LIBCOMPATVERSIONS)" | cut -d';' -f1`; do \
83			SHLIB_SOVER_NODOT=$$v; \
84			SHLIB_SOVER=.$$v; \
85			if [ -n "$$prev" ]; then \
86				SHLIB_COMPAT="$$SHLIB_COMPAT .$$prev"; \
87			fi; \
88			prev=$$v; \
89		done; \
90	fi
91
92LINK_APP=	\
93  ( $(SET_X);   \
94    LIBDEPS="$${LIBDEPS:-$(LIBDEPS)}"; \
95    LDCMD="$${LDCMD:-$(CC)}"; LDFLAGS="$${LDFLAGS:-$(CFLAGS)}"; \
96    LIBPATH=`for x in $$LIBDEPS; do echo $$x; done | sed -e 's/^ *-L//;t' -e d | uniq`; \
97    LIBPATH=`echo $$LIBPATH | sed -e 's/ /:/g'`; \
98    LD_LIBRARY_PATH=$$LIBPATH:$$LD_LIBRARY_PATH \
99    $${LDCMD} $${LDFLAGS} -o $${APPNAME:=$(APPNAME)} $(OBJECTS) $${LIBDEPS} )
100
101LINK_SO=	\
102  ( $(SET_X);   \
103    LIBDEPS="$${LIBDEPS:-$(LIBDEPS)}"; \
104    SHAREDCMD="$${SHAREDCMD:-$(CC)}"; \
105    SHAREDFLAGS="$${SHAREDFLAGS:-$(CFLAGS) $(SHARED_LDFLAGS)}"; \
106    LIBPATH=`for x in $$LIBDEPS; do echo $$x; done | sed -e 's/^ *-L//;t' -e d | uniq`; \
107    LIBPATH=`echo $$LIBPATH | sed -e 's/ /:/g'`; \
108    LD_LIBRARY_PATH=$$LIBPATH:$$LD_LIBRARY_PATH \
109    $${SHAREDCMD} $${SHAREDFLAGS} \
110	-o $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX \
111	$$ALLSYMSFLAGS $$SHOBJECTS $$NOALLSYMSFLAGS $$LIBDEPS \
112  ) && $(SYMLINK_SO)
113
114SYMLINK_SO=	\
115	if [ -n "$$INHIBIT_SYMLINKS" ]; then :; else \
116		prev=$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX; \
117		if [ -n "$$SHLIB_COMPAT" ]; then \
118			for x in $$SHLIB_COMPAT; do \
119				( $(SET_X); rm -f $$SHLIB$$x$$SHLIB_SUFFIX; \
120				  ln -s $$prev $$SHLIB$$x$$SHLIB_SUFFIX ); \
121				prev=$$SHLIB$$x$$SHLIB_SUFFIX; \
122			done; \
123		fi; \
124		if [ -n "$$SHLIB_SOVER" ]; then \
125			( $(SET_X); rm -f $$SHLIB$$SHLIB_SUFFIX; \
126			  ln -s $$prev $$SHLIB$$SHLIB_SUFFIX ); \
127		fi; \
128	fi
129
130LINK_SO_A=	SHOBJECTS="lib$(LIBNAME).a $(LIBEXTRAS)"; $(LINK_SO)
131LINK_SO_O=	SHOBJECTS="$(LIBEXTRAS)"; $(LINK_SO)
132
133LINK_SO_A_VIA_O=	\
134  SHOBJECTS=lib$(LIBNAME).o; \
135  ALL=$$ALLSYMSFLAGS; ALLSYMSFLAGS=; NOALLSYMSFLAGS=; \
136  ( $(SET_X); \
137    ld $(LDFLAGS) -r -o lib$(LIBNAME).o $$ALL lib$(LIBNAME).a $(LIBEXTRAS) ); \
138  $(LINK_SO) && rm -f lib$(LIBNAME).o
139
140LINK_SO_A_UNPACKED=	\
141  UNPACKDIR=link_tmp.$$$$; rm -rf $$UNPACKDIR; mkdir $$UNPACKDIR; \
142  (cd $$UNPACKDIR; ar x ../lib$(LIBNAME).a) && \
143  ([ -z "$(LIBEXTRAS)" ] || cp $(LIBEXTRAS) $$UNPACKDIR) && \
144  SHOBJECTS=$$UNPACKDIR/*.o; \
145  $(LINK_SO) && rm -rf $$UNPACKDIR
146
147DETECT_GNU_LD=($(CC) -Wl,-V /dev/null 2>&1 | grep '^GNU ld' )>/dev/null
148
149DO_GNU_SO=$(CALC_VERSIONS); \
150	SHLIB=lib$(LIBNAME).so; \
151	SHLIB_SUFFIX=; \
152	ALLSYMSFLAGS='-Wl,--whole-archive'; \
153	NOALLSYMSFLAGS='-Wl,--no-whole-archive'; \
154	SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared -Wl,-Bsymbolic -Wl,-soname=$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"
155
156DO_GNU_APP=LDFLAGS="$(CFLAGS) -Wl,-rpath,$(LIBRPATH)"
157
158#This is rather special.  It's a special target with which one can link
159#applications without bothering with any features that have anything to
160#do with shared libraries, for example when linking against static
161#libraries.  It's mostly here to avoid a lot of conditionals everywhere
162#else...
163link_app.:
164	$(LINK_APP)
165
166link_o.gnu:
167	@ $(DO_GNU_SO); $(LINK_SO_O)
168link_a.gnu:
169	@ $(DO_GNU_SO); $(LINK_SO_A)
170link_app.gnu:
171	@ $(DO_GNU_APP); $(LINK_APP)
172
173DO_BEOS_SO=	SHLIB=lib$(LIBNAME).so; \
174	SHLIB_SUFFIX=; \
175	ALLSYMSFLAGS='-Wl,--whole-archive'; \
176	NOALLSYMSFLAGS='-Wl,--no-whole-archive'; \
177	SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared -Wl,-Bsymbolic -Wl,-soname=$$SHLIB$$SHLIB_SUFFIX"
178
179link_o.beos:
180	@ $(DO_BEOS_SO); $(LINK_SO_O)
181link_a.beos:
182	@ $(DO_BEOS_SO); $(LINK_SO_A)
183
184link_o.bsd:
185	@if $(DETECT_GNU_LD); then $(DO_GNU_SO); else \
186	$(CALC_VERSIONS); \
187	SHLIB=lib$(LIBNAME).so; \
188	SHLIB_SUFFIX=; \
189	LIBDEPS=" "; \
190	ALLSYMSFLAGS="-Wl,-Bforcearchive"; \
191	NOALLSYMSFLAGS=; \
192	SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared -nostdlib"; \
193	fi; $(LINK_SO_O)
194link_a.bsd:
195	@if $(DETECT_GNU_LD); then $(DO_GNU_SO); else \
196	$(CALC_VERSIONS); \
197	SHLIB=lib$(LIBNAME).so; \
198	SHLIB_SUFFIX=; \
199	LIBDEPS=" "; \
200	ALLSYMSFLAGS="-Wl,-Bforcearchive"; \
201	NOALLSYMSFLAGS=; \
202	SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared -nostdlib"; \
203	fi; $(LINK_SO_A)
204link_app.bsd:
205	@if $(DETECT_GNU_LD); then $(DO_GNU_APP); else \
206	LDFLAGS="$(CFLAGS) -Wl,-rpath,$(LIBPATH)"; \
207	fi; $(LINK_APP)
208
209# For Darwin AKA Mac OS/X (dyld)
210# Originally link_o.darwin produced .so, because it was hard-coded
211# in dso_dlfcn module. At later point dso_dlfcn switched to .dylib
212# extension in order to allow for run-time linking with vendor-
213# supplied shared libraries such as libz, so that link_o.darwin had
214# to be harmonized with it. This caused minor controversy, because
215# it was believed that dlopen can't be used to dynamically load
216# .dylib-s, only so called bundle modules (ones linked with -bundle
217# flag). The belief seems to be originating from pre-10.4 release,
218# where dlfcn functionality was emulated by dlcompat add-on. In
219# 10.4 dlopen was rewritten as native part of dyld and is documented
220# to be capable of loading both dynamic libraries and bundles. In
221# order to provide compatibility with pre-10.4 dlopen, modules are
222# linked with -bundle flag, which makes .dylib extension misleading.
223# It works, because dlopen is [and always was] extension-agnostic.
224# Alternative to this heuristic approach is to develop specific
225# MacOS X dso module relying on whichever "native" dyld interface.
226link_o.darwin:
227	@ $(CALC_VERSIONS); \
228	SHLIB=lib$(LIBNAME); \
229	SHLIB_SUFFIX=.dylib; \
230	ALLSYMSFLAGS='-all_load'; \
231	NOALLSYMSFLAGS=''; \
232	SHAREDFLAGS="$(CFLAGS) `echo $(SHARED_LDFLAGS) | sed s/dynamiclib/bundle/`"; \
233	if [ -n "$(LIBVERSION)" ]; then \
234		SHAREDFLAGS="$$SHAREDFLAGS -current_version $(LIBVERSION)"; \
235	fi; \
236	if [ -n "$$SHLIB_SOVER_NODOT" ]; then \
237		SHAREDFLAGS="$$SHAREDFLAGS -compatibility_version $$SHLIB_SOVER_NODOT"; \
238	fi; \
239	$(LINK_SO_O)
240link_a.darwin:
241	@ $(CALC_VERSIONS); \
242	SHLIB=lib$(LIBNAME); \
243	SHLIB_SUFFIX=.dylib; \
244	ALLSYMSFLAGS='-all_load'; \
245	NOALLSYMSFLAGS=''; \
246	SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS)"; \
247	if [ -n "$(LIBVERSION)" ]; then \
248		SHAREDFLAGS="$$SHAREDFLAGS -current_version $(LIBVERSION)"; \
249	fi; \
250	if [ -n "$$SHLIB_SOVER_NODOT" ]; then \
251		SHAREDFLAGS="$$SHAREDFLAGS -compatibility_version $$SHLIB_SOVER_NODOT"; \
252	fi; \
253	SHAREDFLAGS="$$SHAREDFLAGS -install_name $(INSTALLTOP)/$(LIBDIR)/$$SHLIB$(SHLIB_EXT)"; \
254	$(LINK_SO_A)
255link_app.darwin:	# is there run-path on darwin?
256	$(LINK_APP)
257
258link_o.cygwin:
259	@ $(CALC_VERSIONS); \
260	INHIBIT_SYMLINKS=yes; \
261	SHLIB=cyg$(LIBNAME); \
262	base=-Wl,--enable-auto-image-base; \
263	deffile=; \
264	if expr $(PLATFORM) : 'mingw' > /dev/null; then \
265		SHLIB=$(LIBNAME)eay32; base=; \
266		if test -f $(LIBNAME)eay32.def; then \
267			deffile=$(LIBNAME)eay32.def; \
268		fi; \
269	fi; \
270	SHLIB_SUFFIX=.dll; \
271	LIBVERSION="$(LIBVERSION)"; \
272	SHLIB_SOVER=${LIBVERSION:+"-$(LIBVERSION)"}; \
273	ALLSYMSFLAGS='-Wl,--whole-archive'; \
274	NOALLSYMSFLAGS='-Wl,--no-whole-archive'; \
275	SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared $$base $$deffile -Wl,-Bsymbolic"; \
276	$(LINK_SO_O)
277#for mingw target if def-file is in use dll-name should match library-name
278link_a.cygwin:
279	@ $(CALC_VERSIONS); \
280	INHIBIT_SYMLINKS=yes; \
281	SHLIB=cyg$(LIBNAME); SHLIB_SOVER=-$(LIBVERSION); SHLIB_SUFFIX=.dll; \
282	dll_name=$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX; extras=; \
283	base=-Wl,--enable-auto-image-base; \
284	if expr $(PLATFORM) : 'mingw' > /dev/null; then \
285		case $(LIBNAME) in \
286			crypto) SHLIB=libeay;; \
287			ssl) SHLIB=ssleay;; \
288		esac; \
289		SHLIB_SOVER=32; \
290		extras="$(LIBNAME).def"; \
291		$(PERL) util/mkdef.pl 32 $$SHLIB > $$extras; \
292		base=; [ $(LIBNAME) = "crypto" -a -n "$(FIPSCANLIB)" ] && base=-Wl,--image-base,0x63000000; \
293	fi; \
294	dll_name=$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX; \
295	$(PERL) util/mkrc.pl $$dll_name | \
296		$(RC) -o rc.o; \
297	extras="$$extras rc.o"; \
298	ALLSYMSFLAGS='-Wl,--whole-archive'; \
299	NOALLSYMSFLAGS='-Wl,--no-whole-archive'; \
300	SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared $$base -Wl,-Bsymbolic -Wl,--out-implib,lib$(LIBNAME).dll.a $$extras"; \
301	[ -f apps/$$dll_name ] && rm apps/$$dll_name; \
302	[ -f test/$$dll_name ] && rm test/$$dll_name; \
303	$(LINK_SO_A) || exit 1; \
304	rm $$extras; \
305	cp -p $$dll_name apps/; \
306	cp -p $$dll_name test/
307link_app.cygwin:
308	@if expr "$(CFLAGS)" : '.*OPENSSL_USE_APPLINK' > /dev/null; then \
309		LIBDEPS="$(TOP)/crypto/applink.o $${LIBDEPS:-$(LIBDEPS)}"; \
310		export LIBDEPS; \
311	fi; \
312	$(LINK_APP)
313
314link_o.alpha-osf1:
315	@ if $(DETECT_GNU_LD); then \
316		$(DO_GNU_SO); \
317	else \
318		SHLIB=lib$(LIBNAME).so; \
319		SHLIB_SUFFIX=; \
320		SHLIB_HIST=`echo "$(LIBCOMPATVERSIONS)" | cut -d';' -f2 | sed -e 's/ */:/'`; \
321		if [ -n "$$SHLIB_HIST" ]; then \
322			SHLIB_HIST="$${SHLIB_HIST}:$(LIBVERSION)"; \
323		else \
324			SHLIB_HIST="$(LIBVERSION)"; \
325		fi; \
326		SHLIB_SOVER=; \
327		ALLSYMSFLAGS='-all'; \
328		NOALLSYMSFLAGS='-none'; \
329		SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared -Wl,-B,symbolic"; \
330		if [ -n "$$SHLIB_HIST" ]; then \
331			SHAREDFLAGS="$$SHAREDFLAGS -set_version $$SHLIB_HIST"; \
332		fi; \
333	fi; \
334	$(LINK_SO_O)
335link_a.alpha-osf1:
336	@ if $(DETECT_GNU_LD); then \
337		$(DO_GNU_SO); \
338	else \
339		SHLIB=lib$(LIBNAME).so; \
340		SHLIB_SUFFIX=; \
341		SHLIB_HIST=`echo "$(LIBCOMPATVERSIONS)" | cut -d';' -f2 | sed -e 's/ */:/'`; \
342		if [ -n "$$SHLIB_HIST" ]; then \
343			SHLIB_HIST="$${SHLIB_HIST}:$(LIBVERSION)"; \
344		else \
345			SHLIB_HIST="$(LIBVERSION)"; \
346		fi; \
347		SHLIB_SOVER=; \
348		ALLSYMSFLAGS='-all'; \
349		NOALLSYMSFLAGS='-none'; \
350		SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared -Wl,-B,symbolic"; \
351		if [ -n "$$SHLIB_HIST" ]; then \
352			SHAREDFLAGS="$$SHAREDFLAGS -set_version $$SHLIB_HIST"; \
353		fi; \
354	fi; \
355	$(LINK_SO_A)
356link_app.alpha-osf1:
357	@if $(DETECT_GNU_LD); then \
358		$(DO_GNU_APP); \
359	else \
360		LDFLAGS="$(CFLAGS) -rpath $(LIBRPATH)"; \
361	fi; \
362	$(LINK_APP)
363
364link_o.solaris:
365	@ if $(DETECT_GNU_LD); then \
366		$(DO_GNU_SO); \
367	else \
368		$(CALC_VERSIONS); \
369		MINUSZ='-z '; \
370		($(CC) -v 2>&1 | grep gcc) > /dev/null && MINUSZ='-Wl,-z,'; \
371		SHLIB=lib$(LIBNAME).so; \
372		SHLIB_SUFFIX=; \
373		ALLSYMSFLAGS="$${MINUSZ}allextract"; \
374		NOALLSYMSFLAGS="$${MINUSZ}defaultextract"; \
375		SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX -Wl,-Bsymbolic"; \
376	fi; \
377	$(LINK_SO_O)
378link_a.solaris:
379	@ if $(DETECT_GNU_LD); then \
380		$(DO_GNU_SO); \
381	else \
382		$(CALC_VERSIONS); \
383		MINUSZ='-z '; \
384		($(CC) -v 2>&1 | grep gcc) > /dev/null && MINUSZ='-Wl,-z,'; \
385		SHLIB=lib$(LIBNAME).so; \
386		SHLIB_SUFFIX=;\
387		ALLSYMSFLAGS="$${MINUSZ}allextract"; \
388		NOALLSYMSFLAGS="$${MINUSZ}defaultextract"; \
389		SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX -Wl,-Bsymbolic"; \
390	fi; \
391	$(LINK_SO_A)
392link_app.solaris:
393	@ if $(DETECT_GNU_LD); then \
394		$(DO_GNU_APP); \
395	else \
396		LDFLAGS="$(CFLAGS) -R $(LIBRPATH)"; \
397	fi; \
398	$(LINK_APP)
399
400# OpenServer 5 native compilers used
401link_o.svr3:
402	@ if $(DETECT_GNU_LD); then \
403		$(DO_GNU_SO); \
404	else \
405		$(CALC_VERSIONS); \
406		SHLIB=lib$(LIBNAME).so; \
407		SHLIB_SUFFIX=; \
408		ALLSYMSFLAGS=''; \
409		NOALLSYMSFLAGS=''; \
410		SHAREDFLAGS="$(CFLAGS) -G -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"; \
411	fi; \
412	$(LINK_SO_O)
413link_a.svr3:
414	@ if $(DETECT_GNU_LD); then \
415		$(DO_GNU_SO); \
416	else \
417		$(CALC_VERSIONS); \
418		SHLIB=lib$(LIBNAME).so; \
419		SHLIB_SUFFIX=; \
420		ALLSYMSFLAGS=''; \
421		NOALLSYMSFLAGS=''; \
422		SHAREDFLAGS="$(CFLAGS) -G -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"; \
423	fi; \
424	$(LINK_SO_A_UNPACKED)
425link_app.svr3:
426	@$(DETECT_GNU_LD) && $(DO_GNU_APP); \
427	$(LINK_APP)
428
429# UnixWare 7 and OpenUNIX 8 native compilers used
430link_o.svr5:
431	@ if $(DETECT_GNU_LD); then \
432		$(DO_GNU_SO); \
433	else \
434		$(CALC_VERSIONS); \
435		SHARE_FLAG='-G'; \
436		($(CC) -v 2>&1 | grep gcc) > /dev/null && SHARE_FLAG='-shared'; \
437		SHLIB=lib$(LIBNAME).so; \
438		SHLIB_SUFFIX=; \
439		ALLSYMSFLAGS=''; \
440		NOALLSYMSFLAGS=''; \
441		SHAREDFLAGS="$(CFLAGS) $${SHARE_FLAG} -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"; \
442	fi; \
443	$(LINK_SO_O)
444link_a.svr5:
445	@ if $(DETECT_GNU_LD); then \
446		$(DO_GNU_SO); \
447	else \
448		$(CALC_VERSIONS); \
449		SHARE_FLAG='-G'; \
450		($(CC) -v 2>&1 | grep gcc) > /dev/null && SHARE_FLAG='-shared'; \
451		SHLIB=lib$(LIBNAME).so; \
452		SHLIB_SUFFIX=; \
453		ALLSYMSFLAGS=''; \
454		NOALLSYMSFLAGS=''; \
455		SHAREDFLAGS="$(CFLAGS) $${SHARE_FLAG} -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"; \
456	fi; \
457	$(LINK_SO_A_UNPACKED)
458link_app.svr5:
459	@$(DETECT_GNU_LD) && $(DO_GNU_APP); \
460	$(LINK_APP)
461
462link_o.irix:
463	@ if $(DETECT_GNU_LD); then \
464		$(DO_GNU_SO); \
465	else \
466		$(CALC_VERSIONS); \
467		SHLIB=lib$(LIBNAME).so; \
468		SHLIB_SUFFIX=; \
469		MINUSWL=""; \
470		($(CC) -v 2>&1 | grep gcc) > /dev/null && MINUSWL="-Wl,"; \
471		ALLSYMSFLAGS="$${MINUSWL}-all"; \
472		NOALLSYMSFLAGS="$${MINUSWL}-none"; \
473		SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared -Wl,-soname,$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX,-B,symbolic"; \
474	fi; \
475	$(LINK_SO_O)
476link_a.irix:
477	@ if $(DETECT_GNU_LD); then \
478		$(DO_GNU_SO); \
479	else \
480		$(CALC_VERSIONS); \
481		SHLIB=lib$(LIBNAME).so; \
482		SHLIB_SUFFIX=; \
483		MINUSWL=""; \
484		($(CC) -v 2>&1 | grep gcc) > /dev/null && MINUSWL="-Wl,"; \
485		ALLSYMSFLAGS="$${MINUSWL}-all"; \
486		NOALLSYMSFLAGS="$${MINUSWL}-none"; \
487		SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared -Wl,-soname,$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX,-B,symbolic"; \
488	fi; \
489	$(LINK_SO_A)
490link_app.irix:
491	@LDFLAGS="$(CFLAGS) -Wl,-rpath,$(LIBRPATH)"; \
492	$(LINK_APP)
493
494# 32-bit PA-RISC HP-UX embeds the -L pathname of libs we link with, so
495# we compensate for it with +cdp ../: and +cdp ./:. Yes, these rewrite
496# rules imply that we can only link one level down in catalog structure,
497# but that's what takes place for the moment of this writing. +cdp option
498# was introduced in HP-UX 11.x and applies in 32-bit PA-RISC link
499# editor context only [it's simply ignored in other cases, which are all
500# ELFs by the way].
501#
502link_o.hpux:
503	@if $(DETECT_GNU_LD); then $(DO_GNU_SO); else \
504	$(CALC_VERSIONS); \
505	SHLIB=lib$(LIBNAME).sl; \
506	expr "$(CFLAGS)" : '.*DSO_DLFCN' > /dev/null && SHLIB=lib$(LIBNAME).so; \
507	SHLIB_SUFFIX=; \
508	ALLSYMSFLAGS='-Wl,-Fl'; \
509	NOALLSYMSFLAGS=''; \
510	expr $(PLATFORM) : 'hpux64' > /dev/null && ALLSYMSFLAGS='-Wl,+forceload'; \
511	SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -Wl,-B,symbolic,+vnocompatwarnings,-z,+s,+h,$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX,+cdp,../:,+cdp,./:"; \
512	fi; \
513	rm -f $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX || :; \
514	$(LINK_SO_O) && chmod a=rx $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX
515link_a.hpux:
516	@if $(DETECT_GNU_LD); then $(DO_GNU_SO); else \
517	$(CALC_VERSIONS); \
518	SHLIB=lib$(LIBNAME).sl; \
519	expr $(PLATFORM) : '.*ia64' > /dev/null && SHLIB=lib$(LIBNAME).so; \
520	SHLIB_SUFFIX=; \
521	ALLSYMSFLAGS='-Wl,-Fl'; \
522	NOALLSYMSFLAGS=''; \
523	expr $(PLATFORM) : 'hpux64' > /dev/null && ALLSYMSFLAGS='-Wl,+forceload'; \
524	SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -Wl,-B,symbolic,+vnocompatwarnings,-z,+s,+h,$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX,+cdp,../:,+cdp,./:"; \
525	fi; \
526	rm -f $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX || :; \
527	$(LINK_SO_A) && chmod a=rx $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX
528link_app.hpux:
529	@if $(DETECT_GNU_LD); then $(DO_GNU_APP); else \
530	LDFLAGS="$(CFLAGS) -Wl,+s,+cdp,../:,+cdp,./:,+b,$(LIBRPATH)"; \
531	fi; \
532	$(LINK_APP)
533
534link_o.aix:
535	@ $(CALC_VERSIONS); \
536	OBJECT_MODE=`expr "x$(SHARED_LDFLAGS)" : 'x\-[a-z]*\(64\)'` || :; \
537	OBJECT_MODE=$${OBJECT_MODE:-32}; export OBJECT_MODE; \
538	SHLIB=lib$(LIBNAME).so; \
539	SHLIB_SUFFIX=; \
540	ALLSYMSFLAGS=''; \
541	NOALLSYMSFLAGS=''; \
542	SHAREDFLAGS='$(CFLAGS) $(SHARED_LDFLAGS) -Wl,-bexpall,-bnolibpath,-bM:SRE'; \
543	$(LINK_SO_O);
544link_a.aix:
545	@ $(CALC_VERSIONS); \
546	OBJECT_MODE=`expr "x$(SHARED_LDFLAGS)" : 'x\-[a-z]*\(64\)'` || : ; \
547	OBJECT_MODE=$${OBJECT_MODE:-32}; export OBJECT_MODE; \
548	SHLIB=lib$(LIBNAME).so; \
549	SHLIB_SUFFIX=; \
550	ALLSYMSFLAGS='-bnogc'; \
551	NOALLSYMSFLAGS=''; \
552	SHAREDFLAGS='$(CFLAGS) $(SHARED_LDFLAGS) -Wl,-bexpall,-bnolibpath,-bM:SRE'; \
553	$(LINK_SO_A_VIA_O)
554link_app.aix:
555	LDFLAGS="$(CFLAGS) -Wl,-brtl,-blibpath:$(LIBRPATH):$${LIBPATH:-/usr/lib:/lib}"; \
556	$(LINK_APP)
557
558link_o.reliantunix:
559	@ $(CALC_VERSIONS); \
560	SHLIB=lib$(LIBNAME).so; \
561	SHLIB_SUFFIX=; \
562	ALLSYMSFLAGS=; \
563	NOALLSYMSFLAGS=''; \
564	SHAREDFLAGS='$(CFLAGS) -G'; \
565	$(LINK_SO_O)
566link_a.reliantunix:
567	@ $(CALC_VERSIONS); \
568	SHLIB=lib$(LIBNAME).so; \
569	SHLIB_SUFFIX=; \
570	ALLSYMSFLAGS=; \
571	NOALLSYMSFLAGS=''; \
572	SHAREDFLAGS='$(CFLAGS) -G'; \
573	$(LINK_SO_A_UNPACKED)
574link_app.reliantunix:
575	$(LINK_APP)
576
577# Targets to build symbolic links when needed
578symlink.gnu symlink.solaris symlink.svr3 symlink.svr5 symlink.irix \
579symlink.aix symlink.reliantunix:
580	@ $(CALC_VERSIONS); \
581	SHLIB=lib$(LIBNAME).so; \
582	$(SYMLINK_SO)
583symlink.darwin:
584	@ $(CALC_VERSIONS); \
585	SHLIB=lib$(LIBNAME); \
586	SHLIB_SUFFIX=.dylib; \
587	$(SYMLINK_SO)
588symlink.hpux:
589	@ $(CALC_VERSIONS); \
590	SHLIB=lib$(LIBNAME).sl; \
591	expr $(PLATFORM) : '.*ia64' > /dev/null && SHLIB=lib$(LIBNAME).so; \
592	$(SYMLINK_SO)
593# The following lines means those specific architectures do no symlinks
594symlink.cygwin symlink.alpha-osf1 symlink.tru64 symlink.tru64-rpath symlink.beos:
595
596# Compatibility targets
597link_o.bsd-gcc-shared link_o.linux-shared link_o.gnu-shared: link_o.gnu
598link_a.bsd-gcc-shared link_a.linux-shared link_a.gnu-shared: link_a.gnu
599link_app.bsd-gcc-shared link_app.linux-shared link_app.gnu-shared: link_app.gnu
600symlink.bsd-gcc-shared symlink.bsd-shared symlink.linux-shared symlink.gnu-shared: symlink.gnu
601link_o.bsd-shared: link_o.bsd
602link_a.bsd-shared: link_a.bsd
603link_app.bsd-shared: link_app.bsd
604link_o.darwin-shared: link_o.darwin
605link_a.darwin-shared: link_a.darwin
606link_app.darwin-shared: link_app.darwin
607symlink.darwin-shared: symlink.darwin
608link_o.cygwin-shared: link_o.cygwin
609link_a.cygwin-shared: link_a.cygwin
610link_app.cygwin-shared: link_app.cygwin
611symlink.cygwin-shared: symlink.cygwin
612link_o.alpha-osf1-shared: link_o.alpha-osf1
613link_a.alpha-osf1-shared: link_a.alpha-osf1
614link_app.alpha-osf1-shared: link_app.alpha-osf1
615symlink.alpha-osf1-shared: symlink.alpha-osf1
616link_o.tru64-shared: link_o.tru64
617link_a.tru64-shared: link_a.tru64
618link_app.tru64-shared: link_app.tru64
619symlink.tru64-shared: symlink.tru64
620link_o.tru64-shared-rpath: link_o.tru64-rpath
621link_a.tru64-shared-rpath: link_a.tru64-rpath
622link_app.tru64-shared-rpath: link_app.tru64-rpath
623symlink.tru64-shared-rpath: symlink.tru64-rpath
624link_o.solaris-shared: link_o.solaris
625link_a.solaris-shared: link_a.solaris
626link_app.solaris-shared: link_app.solaris
627symlink.solaris-shared: symlink.solaris
628link_o.svr3-shared: link_o.svr3
629link_a.svr3-shared: link_a.svr3
630link_app.svr3-shared: link_app.svr3
631symlink.svr3-shared: symlink.svr3
632link_o.svr5-shared: link_o.svr5
633link_a.svr5-shared: link_a.svr5
634link_app.svr5-shared: link_app.svr5
635symlink.svr5-shared: symlink.svr5
636link_o.irix-shared: link_o.irix
637link_a.irix-shared: link_a.irix
638link_app.irix-shared: link_app.irix
639symlink.irix-shared: symlink.irix
640link_o.hpux-shared: link_o.hpux
641link_a.hpux-shared: link_a.hpux
642link_app.hpux-shared: link_app.hpux
643symlink.hpux-shared: symlink.hpux
644link_o.aix-shared: link_o.aix
645link_a.aix-shared: link_a.aix
646link_app.aix-shared: link_app.aix
647symlink.aix-shared: symlink.aix
648link_o.reliantunix-shared: link_o.reliantunix
649link_a.reliantunix-shared: link_a.reliantunix
650link_app.reliantunix-shared: link_app.reliantunix
651symlink.reliantunix-shared: symlink.reliantunix
652link_o.beos-shared: link_o.beos
653link_a.beos-shared: link_a.beos
654link_app.beos-shared: link_app.gnu
655symlink.beos-shared: symlink.beos
656