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