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