fix typo
[openssl.git] / Makefile.shared
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
9 CC=cc
10 # LDFLAGS contains flags to be used when temporary object files (when building
11 # shared libraries) are created, or when an application is linked.
12 # SHARED_LDFLAGS contains flags to be used when the shared library is created.
13 LDFLAGS=
14 SHARED_LDFLAGS=
15
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 # .dll, ...).  This one MUST have a value when using this makefile to
19 # build shared libraries.
20 # For example, to build libfoo.so, you need to do the following:
21 #LIBNAME=foo
22 LIBNAME=
23
24 # APPNAME contains just the name of the application, without suffix (""
25 # on Unix, ".exe" on Windows, ...).  This one MUST have a value when using
26 # this makefile to build applications.
27 # For example, to build foo, you need to do the following:
28 #APPNAME=foo
29 APPNAME=
30
31 # OBJECTS contains all the object files to link together into the application.
32 # This must contain at least one object file.
33 #OBJECTS=foo.o
34 OBJECTS=
35
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 # libfoo.so, you need to do the following:
39 #LIBEXTRAS=libbar.a
40 # Note that this MUST be used when using the link_o targets, to hold the
41 # names of all object files that go into the target library.
42 LIBEXTRAS=
43
44 # LIBVERSION contains the current version of the library.
45 # For example, to build libfoo.so.1.2, you need to do the following:
46 #LIBVERSION=1.2
47 LIBVERSION=
48
49 # LIBCOMPATVERSIONS contains the compatibility versions (a list) of
50 # the library.  They MUST be in decreasing order.
51 # For example, if libfoo.so.1.2.1 is backward compatible with libfoo.so.1.2
52 # and libfoo.so.1, you need to do the following:
53 #LIBCOMPATVERSIONS=1.2 1
54 # Note that on systems that use sonames, the last number will appear as
55 # part of it.
56 # It's also possible, for systems that support it (Tru64, for example),
57 # to add extra compatibility info with more precision, by adding a second
58 # list of versions, separated from the first with a semicolon, like this:
59 #LIBCOMPATVERSIONS=1.2 1;1.2.0 1.1.2 1.1.1 1.1.0 1.0.0
60 LIBCOMPATVERSIONS=
61
62 # LIBDEPS contains all the flags necessary to cover all necessary
63 # dependencies to other libraries.
64 LIBDEPS=
65
66 #------------------------------------------------------------------------------
67 # The rest is private to this makefile.
68
69 SET_X=:
70 #SET_X=set -x
71
72 top:
73         echo "Trying to use this makefile interactively?  Don't."
74
75 CALC_VERSIONS=  \
76         SHLIB_COMPAT=; SHLIB_SOVER=; \
77         if [ -n "$(LIBVERSION)$(LIBCOMPATVERSIONS)" ]; then \
78                 prev=""; \
79                 for v in `echo "$(LIBVERSION) $(LIBCOMPATVERSIONS)" | cut -d';' -f1`; do \
80                         SHLIB_SOVER_NODOT=$$v; \
81                         SHLIB_SOVER=.$$v; \
82                         if [ -n "$$prev" ]; then \
83                                 SHLIB_COMPAT="$$SHLIB_COMPAT .$$prev"; \
84                         fi; \
85                         prev=$$v; \
86                 done; \
87         fi
88
89 LINK_APP=       \
90   ( $(SET_X);   \
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`; \
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; \
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`; \
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         if [ -n "$$INHIBIT_SYMLINKS" ]; then :; else \
107                 prev=$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX; \
108                 if [ -n "$$SHLIB_COMPAT" ]; then \
109                         for x in $$SHLIB_COMPAT; do \
110                                 ( $(SET_X); rm -f $$SHLIB$$x$$SHLIB_SUFFIX; \
111                                   ln -s $$prev $$SHLIB$$x$$SHLIB_SUFFIX ); \
112                                 prev=$$SHLIB$$x$$SHLIB_SUFFIX; \
113                         done; \
114                 fi; \
115                 if [ -n "$$SHLIB_SOVER" ]; then \
116                         ( $(SET_X); rm -f $$SHLIB$$SHLIB_SUFFIX; \
117                           ln -s $$prev $$SHLIB$$SHLIB_SUFFIX ); \
118                 fi; \
119         fi
120
121 LINK_SO_A=      SHOBJECTS="lib$(LIBNAME).a $(LIBEXTRAS)"; $(LINK_SO)
122 LINK_SO_O=      SHOBJECTS="$(LIBEXTRAS)"; $(LINK_SO)
123 LINK_SO_A_VIA_O=        \
124   SHOBJECTS=lib$(LIBNAME).o; \
125   ALL=$$ALLSYMSFLAGS; ALLSYMSFLAGS=; NOALLSYMSFLAGS=; \
126   ( $(SET_X); \
127     ld $(LDFLAGS) -r -o lib$(LIBNAME).o $$ALL lib$(LIBNAME).a $(LIBEXTRAS) ); \
128   $(LINK_SO) && rm -f $(LIBNAME).o
129 LINK_SO_A_UNPACKED=     \
130   UNPACKDIR=link_tmp.$$$$; rm -rf $$UNPACKDIR; mkdir $$UNPACKDIR; \
131   (cd $$UNPACKDIR; ar x ../lib$(LIBNAME).a) && \
132   ([ -z "$(LIBEXTRAS)" ] || cp $(LIBEXTRAS) $$UNPACKDIR) && \
133   SHOBJECTS=$$UNPACKDIR/*.o; \
134   $(LINK_SO) && rm -rf $$UNPACKDIR
135
136 DETECT_GNU_LD=(${CC} -Wl,-V /dev/null 2>&1 | grep '^GNU ld' )>/dev/null
137
138 DO_GNU_SO=$(CALC_VERSIONS); \
139         SHLIB=lib$(LIBNAME).so; \
140         SHLIB_SUFFIX=; \
141         LIBDEPS="$(LIBDEPS)"; \
142         ALLSYMSFLAGS='-Wl,--whole-archive'; \
143         NOALLSYMSFLAGS='-Wl,--no-whole-archive'; \
144         SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -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 #This is rather special.  It's a special target with which one can link
152 #applications without bothering with any features that have anything to
153 #do with shared libraries, for example when linking against static
154 #libraries.  It's mostly here to avoid a lot of conditionals everywhere
155 #else...
156 link_app.:
157         LDCMD=$(CC); \
158         LDFLAGS="$(CFLAGS)"; \
159         LIBDEPS="$(LIBDEPS)"; \
160         APPNAME="$(APPNAME)"; \
161         $(LINK_APP)
162
163 link_o.gnu:
164         @ $(DO_GNU_SO); $(LINK_SO_O)
165 link_a.gnu:
166         @ $(DO_GNU_SO); $(LINK_SO_A)
167 link_app.gnu:
168         @ $(DO_GNU_APP); $(LINK_APP)
169
170 link_o.bsd:
171         @if ${DETECT_GNU_LD}; then $(DO_GNU_SO); else \
172         $(CALC_VERSIONS); \
173         SHLIB=lib$(LIBNAME).so; \
174         SHLIB_SUFFIX=; \
175         LIBDEPS=; \
176         ALLSYMSFLAGS="-Wl,-Bforcearchive"; \
177         NOALLSYMSFLAGS=; \
178         SHAREDFLAGS="$(CFLAGS) -shared -nostdlib"; \
179         SHAREDCMD=$(CC); \
180         fi; $(LINK_SO_O)
181 link_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 -nostdlib"; \
190         SHAREDCMD=$(CC); \
191         fi; $(LINK_SO_A)
192 link_app.bsd:
193         @if ${DETECT_GNU_LD}; then $(DO_GNU_APP); else \
194         LDCMD=$(CC); \
195         LDFLAGS="$(CFLAGS) -Wl,-rpath,$(LIBPATH)"; \
196         LIBDEPS="$(LIBDEPS)"; \
197         APPNAME="$(APPNAME)"; \
198         fi; $(LINK_APP)
199
200 # For Darwin AKA Mac OS/X (dyld)
201 link_o.darwin:
202         @ $(CALC_VERSIONS); \
203         SHLIB=lib$(LIBNAME); \
204         SHLIB_SUFFIX=.dylib; \
205         LIBDEPS="$(LIBDEPS)"; \
206         ALLSYMSFLAGS='-all_load'; \
207         NOALLSYMSFLAGS=''; \
208         SHAREDFLAGS="$(CFLAGS) -dynamiclib"; \
209         SHAREDCMD='$(CC)'; \
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)
217 link_a.darwin:
218         @ $(CALC_VERSIONS); \
219         SHLIB=lib$(LIBNAME); \
220         SHLIB_SUFFIX=.dylib; \
221         LIBDEPS="$(LIBDEPS)"; \
222         ALLSYMSFLAGS='-all_load'; \
223         NOALLSYMSFLAGS=''; \
224         SHAREDFLAGS="$(CFLAGS) -dynamiclib"; \
225         SHAREDCMD='$(CC)'; \
226         if [ -n "$(LIBVERSION)" ]; then \
227                 SHAREDFLAGS="$$SHAREDFLAGS -current_version $(LIBVERSION)"; \
228         fi; \
229         if [ -n "$$SHLIB_SOVER_NODOT" ]; then \
230                 SHAREDFLAGS="$$SHAREDFLAGS -compatibility_version $$SHLIB_SOVER_NODOT"; \
231         fi; \
232         $(LINK_SO_A)
233 link_app.darwin:
234         LDCMD=$(CC);\
235         LDFLAGS="$(CFLAGS)"; \
236         LIBDEPS="$(LIBDEPS)"; \
237         APPNAME="$(APPNAME)"; \
238         $(LINK_APP)
239
240 link_o.cygwin:
241         @ $(CALC_VERSIONS); \
242         INHIBIT_SYMLINKS=yes; \
243         SHLIB=cyg$(LIBNAME); \
244         expr $(PLATFORM) : 'mingw' > /dev/null && SHLIB=$(LIBNAME)eay32; \
245         SHLIB_SUFFIX=.dll; \
246         LIBDEPS="$(LIBDEPS)"; \
247         SHLIB_SOVER=-$(LIBVERSION); \
248         ALLSYMSFLAGS='-Wl,--whole-archive'; \
249         NOALLSYMSFLAGS='-Wl,--no-whole-archive'; \
250         SHAREDFLAGS="$(CFLAGS) -Wl,-Bsymbolic -Wl,--out-implib,lib$(LIBNAME).dll.a"; \
251         SHAREDCMD='${CC}'; \
252         $(LINK_SO_O)
253 link_a.cygwin:
254         @ $(CALC_VERSIONS); \
255         INHIBIT_SYMLINKS=yes; \
256         SHLIB=cyg$(LIBNAME); \
257         expr $(PLATFORM) : 'mingw' > /dev/null && SHLIB=$(LIBNAME)eay32; \
258         SHLIB_SUFFIX=.dll; \
259         LIBDEPS="$(LIBDEPS)"; \
260         SHLIB_SOVER=; \
261         ALLSYMSFLAGS='-Wl,--whole-archive'; \
262         NOALLSYMSFLAGS='-Wl,--no-whole-archive'; \
263         base=;  [ $(LIBNAME) = "crypto" ] && base=-Wl,--image-base,0x61200000; \
264         SHAREDFLAGS="$(CFLAGS) $$base -Wl,-Bsymbolic -Wl,--out-implib,lib$(LIBNAME).dll.a"; \
265         SHAREDCMD='${CC}'; \
266         [ -f apps/$$SHLIB$$SHLIB_SUFFIX ] && rm apps/$$SHLIB$$SHLIB_SUFFIX; \
267         [ -f test/$$SHLIB$$SHLIB_SUFFIX ] && rm test/$$SHLIB$$SHLIB_SUFFIX; \
268         $(LINK_SO_A) || exit 1; \
269         cp -p $$SHLIB$$SHLIB_SUFFIX apps/; \
270         cp -p $$SHLIB$$SHLIB_SUFFIX test/
271 link_app.cygwin:
272         LDCMD=$(CC);\
273         LDFLAGS="$(CFLAGS)"; \
274         LIBDEPS="$(LIBDEPS)"; \
275         APPNAME="$(APPNAME)"; \
276         $(LINK_APP)
277
278 link_o.alpha-osf1:
279         @ if ${DETECT_GNU_LD}; then \
280                 $(DO_GNU_SO); \
281         else \
282                 SHLIB=lib$(LIBNAME).so; \
283                 SHLIB_SUFFIX=; \
284                 LIBDEPS="$(LIBDEPS)"; \
285                 SHLIB_HIST=`echo "$(LIBCOMPATVERSIONS)" | cut -d';' -f2 | sed -e 's/ */:/'`; \
286                 if [ -n "$$SHLIB_HIST" ]; then \
287                         SHLIB_HIST="$${SHLIB_HIST}:$(LIBVERSION)"; \
288                 else \
289                         SHLIB_HIST="$(LIBVERSION)"; \
290                 fi; \
291                 SHLIB_SOVER=; \
292                 ALLSYMSFLAGS='-all'; \
293                 NOALLSYMSFLAGS='-none'; \
294                 SHAREDFLAGS="$(CFLAGS) -shared"; \
295                 SHAREDCMD='$(CC)'; \
296                 if [ -n "$$SHLIB_HIST" ]; then \
297                         SHAREDFLAGS="$$SHAREDFLAGS -set_version \"$$SHLIB_HIST\""; \
298                 fi; \
299         fi; \
300         $(LINK_SO_O)
301 link_a.alpha-osf1:
302         @ if ${DETECT_GNU_LD}; then \
303                 $(DO_GNU_SO); \
304         else \
305                 SHLIB=lib$(LIBNAME).so; \
306                 SHLIB_SUFFIX=; \
307                 LIBDEPS="$(LIBDEPS)"; \
308                 SHLIB_HIST=`echo "$(LIBCOMPATVERSIONS)" | cut -d';' -f2 | sed -e 's/ */:/'`; \
309                 if [ -n "$$SHLIB_HIST" ]; then \
310                         SHLIB_HIST="$${SHLIB_HIST}:$(LIBVERSION)"; \
311                 else \
312                         SHLIB_HIST="$(LIBVERSION)"; \
313                 fi; \
314                 SHLIB_SOVER=; \
315                 ALLSYMSFLAGS='-all'; \
316                 NOALLSYMSFLAGS='-none'; \
317                 SHAREDFLAGS="$(CFLAGS) -shared"; \
318                 SHAREDCMD='$(CC)'; \
319                 if [ -n "$$SHLIB_HIST" ]; then \
320                         SHAREDFLAGS="$$SHAREDFLAGS -set_version \"$$SHLIB_HIST\""; \
321                 fi; \
322         fi; \
323         $(LINK_SO_A)
324 link_app.alpha-osf1:
325         @ if ${DETECT_GNU_LD}; then \
326                 $(DO_GNU_APP); \
327         else \
328                 LDCMD=$(CC);\
329                 LDFLAGS="$(CFLAGS)"; \
330                 LIBDEPS="$(LIBDEPS)"; \
331                 APPNAME="$(APPNAME)"
332         fi; \
333         $(LINK_APP)
334
335 # The difference between alpha-osf1-shared and tru64-shared is the `-msym'
336 # option passed to the linker.
337 link_o.tru64:
338         @ if ${DETECT_GNU_LD}; then \
339                 $(DO_GNU_SO); \
340         else \
341                 SHLIB=lib$(LIBNAME).so; \
342                 SHLIB_SUFFIX=; \
343                 LIBDEPS="$(LIBDEPS)"; \
344                 SHLIB_HIST=`echo "$(LIBCOMPATVERSIONS)" | cut -d';' -f2 | sed -e 's/ */:/'`; \
345                 if [ -n "$$SHLIB_HIST" ]; then \
346                         SHLIB_HIST="$${SHLIB_HIST}:$(LIBVERSION)"; \
347                 else \
348                         SHLIB_HIST="$(LIBVERSION)"; \
349                 fi; \
350                 SHLIB_SOVER=; \
351                 ALLSYMSFLAGS='-all'; \
352                 NOALLSYMSFLAGS='-none'; \
353                 SHAREDFLAGS="$(CFLAGS) -shared -msym -rpath $(LIBRPATH)"; \
354                 SHAREDCMD='$(CC)'; \
355                 if [ -n "$$SHLIB_HIST" ]; then \
356                         SHAREDFLAGS="$$SHAREDFLAGS -set_version \"$$SHLIB_HIST\""; \
357                 fi; \
358         fi; \
359         $(LINK_SO_O)
360 link_a.tru64:
361         @ if ${DETECT_GNU_LD}; then \
362                 $(DO_GNU_SO); \
363         else \
364                 SHLIB=lib$(LIBNAME).so; \
365                 SHLIB_SUFFIX=; \
366                 LIBDEPS="$(LIBDEPS)"; \
367                 SHLIB_HIST=`echo "$(LIBCOMPATVERSIONS)" | cut -d';' -f2 | sed -e 's/ */:/'`; \
368                 if [ -n "$$SHLIB_HIST" ]; then \
369                         SHLIB_HIST="$${SHLIB_HIST}:$(LIBVERSION)"; \
370                 else \
371                         SHLIB_HIST="$(LIBVERSION)"; \
372                 fi; \
373                 SHLIB_SOVER=; \
374                 ALLSYMSFLAGS='-all'; \
375                 NOALLSYMSFLAGS='-none'; \
376                 SHAREDFLAGS="$(CFLAGS) -shared -msym -rpath $(LIBRPATH)"; \
377                 SHAREDCMD='$(CC)'; \
378                 if [ -n "$$SHLIB_HIST" ]; then \
379                         SHAREDFLAGS="$$SHAREDFLAGS -set_version \"$$SHLIB_HIST\""; \
380                 fi; \
381         fi; \
382         $(LINK_SO_A)
383 link_app.tru64:
384         @ if ${DETECT_GNU_LD}; then \
385                 $(DO_GNU_APP); \
386         else \
387                 LDCMD=$(CC);\
388                 LDFLAGS="$(CFLAGS) -rpath $(LIBRPATH)"; \
389                 LIBDEPS="$(LIBDEPS)"; \
390                 APPNAME="$(APPNAME)"; \
391         fi; \
392         $(LINK_APP)
393
394 # The difference between tru64-shared and tru64-shared-rpath is the
395 # -rpath ${LIBRPATH} passed to the linker.
396 link_o.tru64-rpath:
397         @ if ${DETECT_GNU_LD}; then \
398                 $(DO_GNU_SO); \
399         else \
400                 SHLIB=lib$(LIBNAME).so; \
401                 SHLIB_SUFFIX=; \
402                 LIBDEPS="$(LIBDEPS)"; \
403                 SHLIB_HIST=`echo "$(LIBCOMPATVERSIONS)" | cut -d';' -f2 | sed -e 's/ */:/'`; \
404                 if [ -n "$$SHLIB_HIST" ]; then \
405                         SHLIB_HIST="$${SHLIB_HIST}:$(LIBVERSION)"; \
406                 else \
407                         SHLIB_HIST="$(LIBVERSION)"; \
408                 fi; \
409                 SHLIB_SOVER=; \
410                 ALLSYMSFLAGS='-all'; \
411                 NOALLSYMSFLAGS='-none'; \
412                 SHAREDFLAGS="$(CFLAGS) -shared -msym -rpath $(LIBRPATH)"; \
413                 SHAREDCMD='$(CC)'; \
414                 if [ -n "$$SHLIB_HIST" ]; then \
415                         SHAREDFLAGS="$$SHAREDFLAGS -set_version \"$$SHLIB_HIST\""; \
416                 fi; \
417         fi; \
418         $(LINK_SO_O)
419 link_a.tru64-rpath:
420         @ if ${DETECT_GNU_LD}; then \
421                 $(DO_GNU_SO); \
422         else \
423                 SHLIB=lib$(LIBNAME).so; \
424                 SHLIB_SUFFIX=; \
425                 LIBDEPS="$(LIBDEPS)"; \
426                 SHLIB_HIST=`echo "$(LIBCOMPATVERSIONS)" | cut -d';' -f2 | sed -e 's/ */:/'`; \
427                 if [ -n "$$SHLIB_HIST" ]; then \
428                         SHLIB_HIST="$${SHLIB_HIST}:$(LIBVERSION)"; \
429                 else \
430                         SHLIB_HIST="$(LIBVERSION)"; \
431                 fi; \
432                 SHLIB_SOVER=; \
433                 ALLSYMSFLAGS='-all'; \
434                 NOALLSYMSFLAGS='-none'; \
435                 SHAREDFLAGS="$(CFLAGS) -shared -msym -rpath $(LIBRPATH)"; \
436                 SHAREDCMD='$(CC)'; \
437                 if [ -n "$$SHLIB_HIST" ]; then \
438                         SHAREDFLAGS="$$SHAREDFLAGS -set_version \"$$SHLIB_HIST\""; \
439                 fi; \
440         fi; \
441         $(LINK_SO_A)
442 link_app.tru64-rpath:
443         @ if ${DETECT_GNU_LD}; then \
444                 $(DO_GNU_APP); \
445         else \
446                 LDCMD=$(CC);\
447                 LDFLAGS="$(CFLAGS) -rpath $(LIBRPATH)"; \
448                 LIBDEPS="$(LIBDEPS)"; \
449                 APPNAME="$(APPNAME)"; \
450         fi; \
451         $(LINK_APP)
452
453 link_o.solaris:
454         @ if ${DETECT_GNU_LD}; then \
455                 $(DO_GNU_SO); \
456         else \
457                 $(CALC_VERSIONS); \
458                 MINUSZ='-z '; \
459                 (${CC} -v 2>&1 | grep gcc) > /dev/null && MINUSZ='-Wl,-z,'; \
460                 SHLIB=lib$(LIBNAME).so; \
461                 SHLIB_SUFFIX=; \
462                 LIBDEPS="$(LIBDEPS)"; \
463                 ALLSYMSFLAGS="$${MINUSZ}allextract"; \
464                 NOALLSYMSFLAGS="$${MINUSZ}defaultextract"; \
465                 SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX -R $(LIBRPATH) -Wl,-Bsymbolic"; \
466                 SHAREDCMD='$(CC)'; \
467         fi; \
468         $(LINK_SO_O)
469 link_a.solaris:
470         @ if ${DETECT_GNU_LD}; then \
471                 $(DO_GNU_SO); \
472         else \
473                 $(CALC_VERSIONS); \
474                 MINUSZ='-z '; \
475                 (${CC} -v 2>&1 | grep gcc) > /dev/null && MINUSZ='-Wl,-z,'; \
476                 SHLIB=lib$(LIBNAME).so; \
477                 SHLIB_SUFFIX=;\
478                 LIBDEPS="$(LIBDEPS)"; \
479                 ALLSYMSFLAGS="$${MINUSZ}allextract"; \
480                 NOALLSYMSFLAGS="$${MINUSZ}defaultextract"; \
481                 SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX -R $(LIBRPATH) -Wl,-Bsymbolic"; \
482                 SHAREDCMD='$(CC)'; \
483         fi; \
484         $(LINK_SO_A)
485 link_app.solaris:
486         @ if ${DETECT_GNU_LD}; then \
487                 $(DO_GNU_APP); \
488         else \
489                 LDCMD=$(CC);\
490                 LDFLAGS="$(CFLAGS) -R $(LIBRPATH)"; \
491                 LIBDEPS="$(LIBDEPS)"; \
492                 APPNAME="$(APPNAME)"; \
493         fi; \
494         $(LINK_APP)
495
496 # OpenServer 5 native compilers used
497 link_o.svr3:
498         @ if ${DETECT_GNU_LD}; then \
499                 $(DO_GNU_SO); \
500         else \
501                 $(CALC_VERSIONS); \
502                 SHLIB=lib$(LIBNAME).so; \
503                 SHLIB_SUFFIX=; \
504                 LIBDEPS="$(LIBDEPS)"; \
505                 ALLSYMSFLAGS=''; \
506                 NOALLSYMSFLAGS=''; \
507                 SHAREDFLAGS="$(CFLAGS) -G -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"; \
508                 SHAREDCMD='$(CC)'; \
509         fi; \
510         $(LINK_SO_O)
511 link_a.svr3:
512         @ if ${DETECT_GNU_LD}; then \
513                 $(DO_GNU_SO); \
514         else \
515                 $(CALC_VERSIONS); \
516                 SHLIB=lib$(LIBNAME).so; \
517                 SHLIB_SUFFIX=; \
518                 LIBDEPS="$(LIBDEPS)"; \
519                 ALLSYMSFLAGS=''; \
520                 NOALLSYMSFLAGS=''; \
521                 SHAREDFLAGS="$(CFLAGS) -G -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"; \
522                 SHAREDCMD='$(CC)'; \
523         fi; \
524         $(LINK_SO_A_UNPACKED)
525 link_app.svr3:
526         @ if ${DETECT_GNU_LD}; then \
527                 $(DO_GNU_APP); \
528         else \
529                 LDCMD=$(CC);\
530                 LDFLAGS="$(CFLAGS)"; \
531                 LIBDEPS="$(LIBDEPS)"; \
532                 APPNAME="$(APPNAME)"; \
533         fi; \
534         $(LINK_APP)
535
536 # UnixWare 7 and OpenUNIX 8 native compilers used
537 link_o.svr5:
538         @ if ${DETECT_GNU_LD}; then \
539                 $(DO_GNU_SO); \
540         else \
541                 $(CALC_VERSIONS); \
542                 SHARE_FLAG='-G'; \
543                 (${CC} -v 2>&1 | grep gcc) > /dev/null && SHARE_FLAG='-shared'; \
544                 SHLIB=lib$(LIBNAME).so; \
545                 SHLIB_SUFFIX=; \
546                 LIBDEPS="$(LIBDEPS)"; \
547                 ALLSYMSFLAGS=''; \
548                 NOALLSYMSFLAGS=''; \
549                 SHAREDFLAGS="$(CFLAGS) $${SHARE_FLAG} -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"; \
550                 SHAREDCMD='$(CC)'; \
551         fi; \
552         $(LINK_SO_O)
553 link_a.svr5:
554         @ if ${DETECT_GNU_LD}; then \
555                 $(DO_GNU_SO); \
556         else \
557                 $(CALC_VERSIONS); \
558                 SHARE_FLAG='-G'; \
559                 (${CC} -v 2>&1 | grep gcc) > /dev/null && SHARE_FLAG='-shared'; \
560                 SHLIB=lib$(LIBNAME).so; \
561                 SHLIB_SUFFIX=; \
562                 LIBDEPS="$(LIBDEPS)"; \
563                 ALLSYMSFLAGS=''; \
564                 NOALLSYMSFLAGS=''; \
565                 SHAREDFLAGS="$(CFLAGS) $${SHARE_FLAG} -h $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX"; \
566                 SHAREDCMD='$(CC)'; \
567         fi; \
568         $(LINK_SO_A_UNPACKED)
569 link_app.svr5:
570         @ if ${DETECT_GNU_LD}; then \
571                 $(DO_GNU_APP); \
572         else \
573                 LDCMD=$(CC);\
574                 LDFLAGS="$(CFLAGS)"; \
575                 LIBDEPS="$(LIBDEPS)"; \
576                 APPNAME="$(APPNAME)"; \
577         fi; \
578         $(LINK_APP)
579
580 link_o.irix:
581         @ if ${DETECT_GNU_LD}; then \
582                 $(DO_GNU_SO); \
583         else \
584                 $(CALC_VERSIONS); \
585                 SHLIB=lib$(LIBNAME).so; \
586                 SHLIB_SUFFIX=; \
587                 LIBDEPS="$(LIBDEPS)"; \
588                 MINUSWL=""; \
589                 ($(CC) -v 2>&1 | grep gcc) > /dev/null && MINUSWL="-Wl,"; \
590                 ALLSYMSFLAGS="$${MINUSWL}-all"; \
591                 NOALLSYMSFLAGS="$${MINUSWL}-none"; \
592                 SHAREDFLAGS="$(CFLAGS) -shared -Wl,-soname,$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX -Wl,-rpath,$(LIBRPATH)"; \
593                 SHAREDCMD='$(CC)'; \
594         fi; \
595         $(LINK_SO_O)
596 link_a.irix:
597         @ if ${DETECT_GNU_LD}; then \
598                 $(DO_GNU_SO); \
599         else \
600                 $(CALC_VERSIONS); \
601                 SHLIB=lib$(LIBNAME).so; \
602                 SHLIB_SUFFIX=; \
603                 LIBDEPS="$(LIBDEPS)"; \
604                 MINUSWL=""; \
605                 ($(CC) -v 2>&1 | grep gcc) > /dev/null && MINUSWL="-Wl,"; \
606                 ALLSYMSFLAGS="$${MINUSWL}-all"; \
607                 NOALLSYMSFLAGS="$${MINUSWL}-none"; \
608                 SHAREDFLAGS="$(CFLAGS) -shared -Wl,-soname,$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX -Wl,-rpath,$(LIBRPATH)"; \
609                 SHAREDCMD='$(CC)'; \
610         fi; \
611         $(LINK_SO_A)
612 link_app.irix:
613         @ if ${DETECT_GNU_LD}; then \
614                 $(DO_GNU_APP); \
615         else \
616                 LDCMD=$(CC);\
617                 LDFLAGS="$(CFLAGS) -Wl,-rpath,$(LIBRPATH)"; \
618                 LIBDEPS="$(LIBDEPS)"; \
619                 APPNAME="$(APPNAME)"; \
620         fi; \
621         $(LINK_APP)
622
623 # 32-bit PA-RISC HP-UX embeds the -L pathname of libs we link with, so
624 # we compensate for it with +cdp ../: and +cdp ./:. Yes, these rewrite
625 # rules imply that we can only link one level down in catalog structure,
626 # but that's what takes place for the moment of this writing. +cdp option
627 # was introduced in HP-UX 11.x and applies in 32-bit PA-RISC link
628 # editor context only [it's simply ignored in other cases, which are all
629 # ELFs by the way].
630 #
631 link_o.hpux:
632         @if ${DETECT_GNU_LD}; then $(DO_GNU_SO); else \
633         $(CALC_VERSIONS); \
634         SHLIB=lib$(LIBNAME).sl; \
635         expr $(PLATFORM) : '.*ia64' > /dev/null && SHLIB=lib$(LIBNAME).so; \
636         SHLIB_SUFFIX=; \
637         LIBDEPS="$(LIBDEPS)"; \
638         ALLSYMSFLAGS='-Wl,-Fl'; \
639         NOALLSYMSFLAGS=''; \
640         expr $(PLATFORM) : 'hpux64' > /dev/null && ALLSYMSFLAGS='-Wl,+forceload'; \
641         SHAREDFLAGS="$(CFLAGS) -Wl,-B,symbolic,+vnocompatwarnings,-z,+s,+cdp,../:,+cdp,./:,+h,$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX,+b,$(LIBRPATH)"; \
642         SHAREDCMD=$(CC); \
643         fi; \
644         $(LINK_SO_O) && chmod a=rx $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX
645 link_a.hpux:
646         @if ${DETECT_GNU_LD}; then $(DO_GNU_SO); else \
647         $(CALC_VERSIONS); \
648         SHLIB=lib$(LIBNAME).sl; \
649         expr $(PLATFORM) : '.*ia64' > /dev/null && SHLIB=lib$(LIBNAME).so; \
650         SHLIB_SUFFIX=; \
651         LIBDEPS="$(LIBDEPS)"; \
652         ALLSYMSFLAGS='-Wl,-Fl'; \
653         NOALLSYMSFLAGS=''; \
654         expr $(PLATFORM) : 'hpux64' > /dev/null && ALLSYMSFLAGS='-Wl,+forceload'; \
655         SHAREDFLAGS="$(CFLAGS) -Wl,-B,symbolic,+vnocompatwarnings,-z,+s,+cdp,../:,+cdp,./:,+h,$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX,+b,$(LIBRPATH)"; \
656         SHAREDCMD='$(CC)'; \
657         fi; \
658         $(LINK_SO_A) && chmod a=rx $$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX
659 link_app.hpux:
660         @if ${DETECT_GNU_LD}; then $(DO_GNU_APP); else \
661         LDCMD=$(CC);\
662         LDFLAGS="$(CFLAGS) -Wl,+s,+cdp,../:,+cdp,./:,+b,$(LIBRPATH)"; \
663         LIBDEPS="$(LIBDEPS)"; \
664         APPNAME="$(APPNAME)"; \
665         fi; \
666         $(LINK_APP)
667
668 link_o.aix:
669         @ $(CALC_VERSIONS); \
670         OBJECT_MODE=`expr x$(SHARED_LDFLAGS) : 'x\-[a-z]\([0-9]*\)'`; \
671         OBJECT_MODE=$${OBJECT_MODE:-32}; export OBJECT_MODE; \
672         SHLIB=lib$(LIBNAME).so; \
673         SHLIB_SUFFIX=; \
674         LIBDEPS="$(LIBDEPS)"; \
675         ALLSYMSFLAGS='-bnogc'; \
676         NOALLSYMSFLAGS=''; \
677         SHAREDFLAGS='$(CFLAGS) -G -bE:lib$(LIBNAME).exp -bM:SRE -blibpath:$(LIBRPATH)'; \
678         SHAREDCMD='$(CC)'; \
679         $(LINK_SO_O); rm -rf lib$(LIBNAME).exp
680 link_a.aix:
681         @ $(CALC_VERSIONS); \
682         OBJECT_MODE=`expr x$(SHARED_LDFLAGS) : 'x\-[a-z]\([0-9]*\)'`; \
683         OBJECT_MODE=$${OBJECT_MODE:-32}; export OBJECT_MODE; \
684         SHLIB=lib$(LIBNAME).so; \
685         SHLIB_SUFFIX=; \
686         LIBDEPS="$(LIBDEPS)"; \
687         ALLSYMSFLAGS='-bnogc'; \
688         NOALLSYMSFLAGS=''; \
689         SHAREDFLAGS='$(CFLAGS) -G -bE:lib$(LIBNAME).exp -bM:SRE -blibpath:$(LIBRPATH)'; \
690         SHAREDCMD='$(CC)'; \
691         $(LINK_SO_A_VIA_O)
692 link_app.aix:
693         LDCMD=$(CC);\
694         LDFLAGS="$(CFLAGS) -blibpath:$(LIBRPATH)"; \
695         LIBDEPS="$(LIBDEPS)"; \
696         APPNAME="$(APPNAME)"
697         $(LINK_APP)
698
699 link_o.reliantunix:
700         @ $(CALC_VERSIONS); \
701         SHLIB=lib$(LIBNAME).so; \
702         SHLIB_SUFFIX=; \
703         LIBDEPS="$(LIBDEPS)"; \
704         ALLSYMSFLAGS=; \
705         NOALLSYMSFLAGS=''; \
706         SHAREDFLAGS='$(CFLAGS) -G'; \
707         SHAREDCMD='$(CC)'; \
708         $(LINK_SO_O)
709 link_a.reliantunix:
710         @ $(CALC_VERSIONS); \
711         SHLIB=lib$(LIBNAME).so; \
712         SHLIB_SUFFIX=; \
713         LIBDEPS="$(LIBDEPS)"; \
714         ALLSYMSFLAGS=; \
715         NOALLSYMSFLAGS=''; \
716         SHAREDFLAGS='$(CFLAGS) -G'; \
717         SHAREDCMD='$(CC)'; \
718         $(LINK_SO_A_UNPACKED)
719 link_app.reliantunix:
720         LDCMD=$(CC);\
721         LDFLAGS="$(CFLAGS)"; \
722         LIBDEPS="$(LIBDEPS)"; \
723         APPNAME="$(APPNAME)"
724         $(LINK_APP)
725
726 # Targets to build symbolic links when needed
727 symlink.gnu symlink.solaris symlink.svr3 symlink.svr5 symlink.irix \
728 symlink.aix symlink.reliantunix:
729         @ $(CALC_VERSIONS); \
730         SHLIB=lib$(LIBNAME).so; \
731         $(SYMLINK_SO)
732 symlink.darwin:
733         @ $(CALC_VERSIONS); \
734         SHLIB=lib$(LIBNAME); \
735         SHLIB_SUFFIX=.dylib; \
736         $(SYMLINK_SO)
737 symlink.hpux:
738         @ $(CALC_VERSIONS); \
739         SHLIB=lib$(LIBNAME).sl; \
740         expr $(PLATFORM) : '.*ia64' > /dev/null && SHLIB=lib$(LIBNAME).so; \
741         $(SYMLINK_SO)
742 # The following lines means those specific architectures do no symlinks
743 symlink.cygwin symlib.alpha-osf1 symlink.tru64 symlink.tru64-rpath:
744
745 # Compatibility targets
746 link_o.bsd-gcc-shared link_o.linux-shared link_o.gnu-shared: link_o.gnu
747 link_a.bsd-gcc-shared link_a.linux-shared link_a.gnu-shared: link_a.gnu
748 link_app.bsd-gcc-shared link_app.linux-shared link_app.gnu-shared: link_app.gnu
749 symlink.bsd-gcc-shared symlink.bsd-shared symlink.linux-shared symlink.gnu-shared: symlink.gnu
750 link_o.bsd-shared: link_o.bsd
751 link_a.bsd-shared: link_a.bsd
752 link_app.bsd-shared: link_app.bsd
753 link_o.darwin-shared: link_o.darwin
754 link_a.darwin-shared: link_a.darwin
755 link_app.darwin-shared: link_app.darwin
756 symlink.darwin-shared: symlink.darwin
757 link_o.cygwin-shared: link_o.cygwin
758 link_a.cygwin-shared: link_a.cygwin
759 link_app.cygwin-shared: link_app.cygwin
760 symlink.cygwin-shared: symlink.cygwin
761 link_o.alpha-osf1-shared: link_o.alpha-osf1
762 link_a.alpha-osf1-shared: link_a.alpha-osf1
763 link_app.alpha-osf1-shared: link_app.alpha-osf1
764 symlink.alpha-osf1-shared: symlink.alpha-osf1
765 link_o.tru64-shared: link_o.tru64
766 link_a.tru64-shared: link_a.tru64
767 link_app.tru64-shared: link_app.tru64
768 symlink.tru64-shared: symlink.tru64
769 link_o.tru64-shared-rpath: link_o.tru64-rpath
770 link_a.tru64-shared-rpath: link_a.tru64-rpath
771 link_app.tru64-shared-rpath: link_app.tru64-rpath
772 symlink.tru64-shared-rpath: symlink.tru64-rpath
773 link_o.solaris-shared: link_o.solaris
774 link_a.solaris-shared: link_a.solaris
775 link_app.solaris-shared: link_app.solaris
776 symlink.solaris-shared: symlink.solaris
777 link_o.svr3-shared: link_o.svr3
778 link_a.svr3-shared: link_a.svr3
779 link_app.svr3-shared: link_app.svr3
780 symlink.svr3-shared: symlink.svr3
781 link_o.svr5-shared: link_o.svr5
782 link_a.svr5-shared: link_a.svr5
783 link_app.svr5-shared: link_app.svr5
784 symlink.svr5-shared: symlink.svr5
785 link_o.irix-shared: link_o.irix
786 link_a.irix-shared: link_a.irix
787 link_app.irix-shared: link_app.irix
788 symlink.irix-shared: symlink.irix
789 link_o.hpux-shared: link_o.hpux
790 link_a.hpux-shared: link_a.hpux
791 link_app.hpux-shared: link_app.hpux
792 symlink.hpux-shared: symlink.hpux
793 link_o.aix-shared: link_o.aix
794 link_a.aix-shared: link_a.aix
795 link_app.aix-shared: link_app.aix
796 symlink.aix-shared: symlink.aix
797 link_o.reliantunix-shared: link_o.reliantunix
798 link_a.reliantunix-shared: link_a.reliantunix
799 link_app.reliantunix-shared: link_app.reliantunix
800 symlink.reliantunix-shared: symlink.reliantunix