1 # $Id: lib.mk,v 1.70 2020/05/02 02:10:20 sjg Exp $
3 .if !target(__${.PARSEFILE}__)
8 .if ${OBJECT_FMT} == "ELF"
12 SHLIB_VERSION_FILE?= ${.CURDIR}/shlib_version
13 .if !defined(SHLIB_MAJOR) && exists(${SHLIB_VERSION_FILE})
14 SHLIB_MAJOR != . ${SHLIB_VERSION_FILE} ; echo $$major
15 SHLIB_MINOR != . ${SHLIB_VERSION_FILE} ; echo $$minor
16 SHLIB_TEENY != . ${SHLIB_VERSION_FILE} ; echo $$teeny
19 .for x in major minor teeny
21 .if defined(SHLIB_${x:tu}) && ${MK_PIC} != "no"
22 @echo ${SHLIB_${x:tu}}
28 SHLIB_FULLVERSION ?= ${${SHLIB_MAJOR} ${SHLIB_MINOR} ${SHLIB_TEENY}:L:ts.}
29 SHLIB_FULLVERSION := ${SHLIB_FULLVERSION}
31 # add additional suffixes not exported.
32 # .po is used for profiling object files.
33 # ${PICO} is used for PIC object files.
35 .SUFFIXES: .out .a .ln ${PICO} .po .o .s .S .c .cc .C .m .F .f .r .y .l .cl .p .h
42 # Originally derrived from NetBSD-1.6
44 # Set PICFLAGS to cc flags for producing position-independent code,
45 # if not already set. Includes -DPIC, if required.
47 # Data-driven table using make variables to control how shared libraries
48 # are built for different platforms and object formats.
49 # OBJECT_FMT: currently either "ELF" or "a.out", from <bsd.own.mk>
50 # SHLIB_SOVERSION: version number to be compiled into a shared library
51 # via -soname. Usually ${SHLIB_MAJOR} on ELF.
52 # NetBSD/pmax used to use ${SHLIB_MAJOR}[.${SHLIB_MINOR}
54 # SHLIB_SHFLAGS: Flags to tell ${LD} to emit shared library.
55 # with ELF, also set shared-lib version for ld.so.
56 # SHLIB_LDSTARTFILE: support .o file, call C++ file-level constructors
57 # SHLIB_LDENDFILE: support .o file, call C++ file-level destructors
58 # FPICFLAGS: flags for ${FC} to compile .[fF] files to ${PICO} objects.
59 # CPPICFLAGS: flags for ${CPP} to preprocess .[sS] files for ${AS}
60 # CPICFLAGS: flags for ${CC} to compile .[cC] files to ${PICO} objects.
61 # CAPICFLAGS flags for {$CC} to compiling .[Ss] files
62 # (usually just ${CPPPICFLAGS} ${CPICFLAGS})
63 # APICFLAGS: flags for ${AS} to assemble .[sS] to ${PICO} objects.
65 .if ${TARGET_OSNAME} == "NetBSD"
66 .if ${MACHINE_ARCH} == "alpha"
67 # Alpha-specific shared library flags
69 CPICFLAGS ?= -fPIC -DPIC
71 CAPICFLAGS?= ${CPPPICFLAGS} ${CPICFLAGS}
73 .elif ${MACHINE_ARCH} == "mipsel" || ${MACHINE_ARCH} == "mipseb"
74 # mips-specific shared library flags
76 # On mips, all libs are compiled with ABIcalls, not just sharedlibs.
79 # so turn shlib PIC flags on for ${AS}.
84 .elif ${MACHINE_ARCH} == "vax" && ${OBJECT_FMT} == "ELF"
85 # On the VAX, all object are PIC by default, not just sharedlibs.
88 .elif (${MACHINE_ARCH} == "sparc" || ${MACHINE_ARCH} == "sparc64") && \
89 ${OBJECT_FMT} == "ELF"
90 # If you use -fPIC you need to define BIGPIC to turn on 32-bit
91 # relocations in asm code
93 CPICFLAGS ?= -fPIC -DPIC
94 CPPPICFLAGS?= -DPIC -DBIGPIC
95 CAPICFLAGS?= ${CPPPICFLAGS} ${CPICFLAGS}
100 # Platform-independent flags for NetBSD a.out shared libraries
101 SHLIB_SOVERSION=${SHLIB_FULLVERSION}
104 CPICFLAGS?= -fPIC -DPIC
106 CAPICFLAGS?= ${CPPPICFLAGS} ${CPICFLAGS}
111 # Platform-independent linker flags for ELF shared libraries
112 .if ${OBJECT_FMT} == "ELF"
113 SHLIB_SOVERSION= ${SHLIB_MAJOR}
114 SHLIB_SHFLAGS= -soname lib${LIB}.so.${SHLIB_SOVERSION}
115 SHLIB_LDSTARTFILE?= /usr/lib/crtbeginS.o
116 SHLIB_LDENDFILE?= /usr/lib/crtendS.o
119 # for compatibility with the following
120 CC_PIC?= ${CPICFLAGS}
121 LD_shared=${SHLIB_SHFLAGS}
125 .if ${TARGET_OSNAME} == "FreeBSD"
126 .if ${OBJECT_FMT} == "ELF"
127 SHLIB_SOVERSION= ${SHLIB_MAJOR}
128 SHLIB_SHFLAGS= -soname lib${LIB}.so.${SHLIB_SOVERSION}
130 SHLIB_SHFLAGS= -assert pure-text
135 LD_shared=${SHLIB_SHFLAGS}
141 # sys.mk can override these
146 # Non BSD machines will be using bmake.
147 .if ${TARGET_OSNAME} == "SunOS"
148 LD_shared=-assert pure-text
149 .if ${OBJECT_FMT} == "ELF" || ${MACHINE} == "solaris"
151 LD_shared=-h lib${LIB}.so.${SHLIB_MAJOR} -G
153 .elif ${TARGET_OSNAME} == "HP-UX"
157 # HPsUX lorder does not grok anything but .o
158 LD_sobjs=`${LORDER} ${OBJS} | ${TSORT} | sed 's,\.o,${PICO},'`
159 LD_pobjs=`${LORDER} ${OBJS} | ${TSORT} | sed 's,\.o,.po,'`
160 .elif ${TARGET_OSNAME} == "OSF1"
161 LD_shared= -msym -shared -expect_unresolved '*'
162 LD_solib= -all lib${LIB}_pic.a
164 # lorder does not grok anything but .o
165 LD_sobjs=`${LORDER} ${OBJS} | ${TSORT} | sed 's,\.o,${PICO},'`
166 LD_pobjs=`${LORDER} ${OBJS} | ${TSORT} | sed 's,\.o,.po,'`
168 .elif ${TARGET_OSNAME} == "FreeBSD"
169 LD_solib= lib${LIB}_pic.a
170 .elif ${TARGET_OSNAME} == "Linux"
172 # this is ambiguous of course
173 LD_shared=-shared -Wl,"-soname lib${LIB}.so.${SHLIB_MAJOR}"
174 LD_solib= -Wl,--whole-archive lib${LIB}_pic.a -Wl,--no-whole-archive
175 .if ${COMPILER_TYPE} == "gcc"
176 # Linux uses GNU ld, which is a multi-pass linker
177 # so we don't need to use lorder or tsort
182 .elif ${TARGET_OSNAME} == "Darwin"
184 SHLIB_INSTALL_VERSION ?= ${SHLIB_MAJOR}
185 SHLIB_COMPATABILITY_VERSION ?= ${SHLIB_MAJOR}.${SHLIB_MINOR:U0}
186 SHLIB_COMPATABILITY ?= \
187 -compatibility_version ${SHLIB_COMPATABILITY_VERSION} \
188 -current_version ${SHLIB_FULLVERSION}
189 LD_shared = -dynamiclib \
190 -flat_namespace -undefined suppress \
191 -install_name ${LIBDIR}/lib${LIB}.${SHLIB_INSTALL_VERSION}.${LD_solink} \
192 ${SHLIB_COMPATABILITY}
194 .for v in ${SHLIB_COMPATABILITY_VERSION} ${SHLIB_INSTALL_VERSION}
195 .if "$v" != "${SHLIB_FULLVERSION}"
196 SHLIB_LINKS += lib${LIB}.$v.${LD_solink}
199 .if ${MK_LINKLIB} != "no"
200 SHLIB_LINKS += lib${LIB}.${LD_solink}
203 LD_so = ${SHLIB_FULLVERSION}.dylib
204 LD_sobjs = ${SOBJS:O:u}
205 LD_solib = ${LD_sobjs}
208 .if ${MACHINE_ARCH} == "i386"
211 PICFLAG ?= -fPIC -fno-common
218 .if !empty(SHLIB_MAJOR)
219 .if ${NEED_SOLINKS} && empty(SHLIB_LINKS)
220 .if ${MK_LINKLIB} != "no"
221 SHLIB_LINKS = lib${LIB}.${LD_solink}
223 .if "${SHLIB_FULLVERSION}" != "${SHLIB_MAJOR}"
224 SHLIB_LINKS += lib${LIB}.${LD_solink}.${SHLIB_MAJOR}
230 LD_shared ?= -Bshareable -Bforcearchive
231 LD_so ?= so.${SHLIB_FULLVERSION}
238 LD_objs ?= `${LORDER} ${OBJS} | ${TSORT}`
239 LD_sobjs ?= `${LORDER} ${SOBJS} | ${TSORT}`
240 LD_pobjs ?= `${LORDER} ${POBJS} | ${TSORT}`
242 LD_solib ?= ${LD_sobjs}
244 .if exists(/netbsd) && exists(${DESTDIR}/usr/lib/libdl.so)
248 # some libs have lots of objects, and scanning all .o, .po and ${PICO} meta files
249 # is a waste of time, this tells meta.autodep.mk to just pick one
250 # (typically ${PICO})
251 # yes, 42 is a random number.
252 .if ${MK_DIRDEPS_BUILD} == "yes" && ${SRCS:Uno:[\#]} > 42
253 OPTIMIZE_OBJECT_META_FILES ?= yes
257 .if ${MK_LIBTOOL} == "yes"
258 # because libtool is so fascist about naming the object files,
259 # we cannot (yet) build profiled libs
262 .if exists(${.CURDIR}/shlib_version)
263 SHLIB_AGE != . ${.CURDIR}/shlib_version ; echo $$age
266 # for the normal .a we do not want to strip symbols
268 ${COMPILE.c} ${.IMPSRC}
270 # for the normal .a we do not want to strip symbols
271 ${CXX_SUFFIXES:%=%.o}:
272 ${COMPILE.cc} ${.IMPSRC}
275 ${COMPILE.S} ${CFLAGS:M-[ID]*} ${AINC} ${.IMPSRC}
279 ${COMPILE.c} ${CC_PG} ${PROFFLAGS} ${.IMPSRC} -o ${.TARGET}
281 ${CXX_SUFFIXES:%=%.po}:
282 ${COMPILE.cc} -pg ${.IMPSRC} -o ${.TARGET}
285 ${COMPILE.S} ${PICFLAG} ${CC_PIC} ${CFLAGS:M-[ID]*} ${AINC} ${.IMPSRC} -o ${.TARGET}
288 ${COMPILE.c} ${CC_PG} ${PROFFLAGS} ${.IMPSRC} -o ${.TARGET}.o
289 @${LD} ${LD_X} ${LD_r} ${.TARGET}.o -o ${.TARGET}
292 ${CXX_SUFFIXES:%=%.po}:
293 ${COMPILE.cc} ${CXX_PG} ${.IMPSRC} -o ${.TARGET}.o
294 ${LD} ${LD_X} ${LD_r} ${.TARGET}.o -o ${.TARGET}
298 ${COMPILE.S} ${PICFLAG} ${CC_PIC} ${CFLAGS:M-[ID]*} ${AINC} ${.IMPSRC} -o ${.TARGET}.o
299 ${LD} ${LD_x} ${LD_r} ${.TARGET}.o -o ${.TARGET}
305 ${COMPILE.c} ${PICFLAG} ${CC_PIC} ${.IMPSRC} -o ${.TARGET}
307 ${CXX_SUFFIXES:%=%${PICO}}:
308 ${COMPILE.cc} ${PICFLAG} ${CC_PIC} ${.IMPSRC} -o ${.TARGET}
311 ${COMPILE.S} ${PROFFLAGS} ${CFLAGS:M-[ID]*} ${AINC} ${.IMPSRC} -o ${.TARGET}
315 ${COMPILE.c} ${PICFLAG} ${CC_PIC} ${.IMPSRC} -o ${.TARGET}.o
316 ${LD} ${LD_x} ${LD_r} ${.TARGET}.o -o ${.TARGET}
319 ${CXX_SUFFIXES:%=%${PICO}}:
320 ${COMPILE.cc} ${PICFLAG} ${CC_PIC} ${.IMPSRC} -o ${.TARGET}.o
321 ${LD} ${LD_x} ${LD_r} ${.TARGET}.o -o ${.TARGET}
325 ${COMPILE.S} ${PROFFLAGS} ${CFLAGS:M-[ID]*} ${AINC} ${.IMPSRC} -o ${.TARGET}.o
326 ${LD} ${LD_X} ${LD_r} ${.TARGET}.o -o ${.TARGET}
333 ${LINT} ${LINTFLAGS} ${CFLAGS:M-[IDU]*} -i ${.IMPSRC}
335 .if ${MK_LIBTOOL} != "yes"
337 .if !defined(PICFLAG)
343 .if ${MK_ARCHIVE} != "no"
347 .if ${MK_PROFILE} != "no"
349 POBJS+=${OBJS:.o=.po}
352 .if ${MK_PIC} != "no"
353 .if ${MK_PICLIB} == "no"
356 SOLIB=lib${LIB}_pic.a
359 .if !empty(SHLIB_FULLVERSION)
360 _LIBS+=lib${LIB}.${LD_so}
364 .if ${MK_LINT} != "no"
365 _LIBS+=llib-l${LIB}.ln
368 # here is where you can define what LIB* are
369 .-include <libnames.mk>
370 .if ${MK_DPADD_MK} == "yes"
371 # lots of cool magic, but might not suit everyone.
377 .elif ${MK_LDORDER_MK} != "no"
378 # Record any libs that we need to be linked with
379 _LIBS+= ${libLDORDER_INC}
381 .include <ldorder.mk>
384 .if !defined(_SKIP_BUILD)
390 .for s in ${SRCS:N*.h:M*/*}
391 ${.o ${PICO} .po .lo:L:@o@${s:T:R}$o@}: $s
394 OBJS+= ${SRCS:T:N*.h:R:S/$/.o/g}
397 .if ${MK_LIBTOOL} == "yes"
398 .if ${MK_PIC} == "no"
405 # .lo's are created as a side effect
407 ${LIBTOOL} --mode=compile ${CC} ${LT_STATIC} ${CFLAGS} ${CPPFLAGS} ${IMPFLAGS} -c ${.IMPSRC}
409 # can't really do profiled libs with libtool - its too fascist about
410 # naming the output...
413 ${LIBTOOL} --mode=link ${CC} ${LT_STATIC} -o ${.TARGET:.a=.la} ${OBJS:.o=.lo} -rpath ${SHLIBDIR}:/usr/lib -version-info ${SHLIB_MAJOR}:${SHLIB_MINOR}:${SHLIB_AGE}
414 @ln .libs/${.TARGET} .
416 lib${LIB}.${LD_so}: lib${LIB}.a
417 @[ -s ${.TARGET}.${SHLIB_AGE} ] || { ln -s .libs/lib${LIB}.${LD_so}* . 2>/dev/null; : }
418 @[ -s ${.TARGET} ] || ln -s ${.TARGET}.${SHLIB_AGE} ${.TARGET}
420 .else # MK_LIBTOOL=yes
423 @${META_NOECHO} building standard ${LIB} library
425 @${AR} ${AR_cq} ${.TARGET} ${LD_objs}
428 POBJS+= ${OBJS:.o=.po}
430 lib${LIB}_p.a: ${POBJS}
431 @${META_NOECHO} building profiled ${LIB} library
433 @${AR} ${AR_cq} ${.TARGET} ${LD_pobjs}
436 SOBJS+= ${OBJS:.o=${PICO}}
438 lib${LIB}_pic.a: ${SOBJS}
439 @${META_NOECHO} building shared object ${LIB} library
441 @${AR} ${AR_cq} ${.TARGET} ${LD_sobjs}
444 #SHLIB_LDADD?= ${LDADD}
446 # bound to be non-portable...
447 # this is known to work for NetBSD 1.6 and FreeBSD 4.2
448 lib${LIB}.${LD_so}: ${SOLIB} ${DPADD}
449 @${META_NOECHO} building shared ${LIB} library \(version ${SHLIB_FULLVERSION}\)
451 .if ${TARGET_OSNAME} == "NetBSD" || ${TARGET_OSNAME} == "FreeBSD"
452 .if ${OBJECT_FMT} == "ELF"
453 ${SHLIB_LD} -x -shared ${SHLIB_SHFLAGS} -o ${.TARGET} \
454 ${SHLIB_LDSTARTFILE} \
455 --whole-archive ${SOLIB} --no-whole-archive ${SHLIB_LDADD} \
458 ${SHLIB_LD} ${LD_x} ${LD_shared} \
459 -o ${.TARGET} ${SOLIB} ${SHLIB_LDADD}
462 ${SHLIB_LD} -o ${.TARGET} ${LD_shared} ${LD_solib} ${DLLIB} ${SHLIB_LDADD}
465 .if !empty(SHLIB_LINKS)
466 rm -f ${SHLIB_LINKS}; ${SHLIB_LINKS:O:u:@x@ln -s ${.TARGET} $x;@}
469 LOBJS+= ${LSRCS:.c=.ln} ${SRCS:M*.c:.c=.ln}
472 llib-l${LIB}.ln: ${LOBJS}
473 @${META_NOECHO} building llib-l${LIB}.ln
474 @rm -f llib-l${LIB}.ln
475 @${LINT} -C${LIB} ${LOBJS} ${LLIBS}
479 rm -f a.out [Ee]rrs mklog core *.core ${CLEANFILES}
480 rm -f lib${LIB}.a ${OBJS}
481 rm -f lib${LIB}_p.a ${POBJS}
482 rm -f lib${LIB}_pic.a lib${LIB}.so.*.* ${SOBJS}
483 rm -f llib-l${LIB}.ln ${LOBJS}
484 .if !empty(SHLIB_LINKS)
488 clean: _SUBDIRUSE cleanlib
489 cleandir: _SUBDIRUSE cleanlib
491 cleandir: _SUBDIRUSE clean
494 .if defined(SRCS) && (!defined(MKDEP) || ${MKDEP} != autodep)
496 @(TMP=/tmp/_depend$$$$; \
497 sed -e 's/^\([^\.]*\).o[ ]*:/\1.o \1.po \1${PICO} \1.ln:/' \
503 .if !target(beforeinstall)
508 LIB_INSTALL_OWN ?= -o ${LIBOWN} -g ${LIBGRP}
513 .if !target(libinstall) && !empty(LIB)
514 realinstall: libinstall
516 [ -d ${DESTDIR}/${LIBDIR} ] || \
517 ${INSTALL} -d ${LIB_INSTALL_OWN} -m 775 ${DESTDIR}${LIBDIR}
518 .if ${MK_ARCHIVE} != "no"
519 ${INSTALL} ${COPY} ${LIB_INSTALL_OWN} -m 644 lib${LIB}.a \
521 ${RANLIB} ${DESTDIR}${LIBDIR}/lib${LIB}.a
522 chmod ${LIBMODE} ${DESTDIR}${LIBDIR}/lib${LIB}.a
524 .if ${MK_PROFILE} != "no"
525 ${INSTALL} ${COPY} ${LIB_INSTALL_OWN} -m 644 \
526 lib${LIB}_p.a ${DESTDIR}${LIBDIR}
527 ${RANLIB} ${DESTDIR}${LIBDIR}/lib${LIB}_p.a
528 chmod ${LIBMODE} ${DESTDIR}${LIBDIR}/lib${LIB}_p.a
530 .if ${MK_LDORDER_MK} != "no"
531 ${INSTALL} ${COPY} ${LIB_INSTALL_OWN} -m 644 \
532 lib${LIB}.ldorder.inc ${DESTDIR}${LIBDIR}
534 .if ${MK_PIC} != "no"
535 .if ${MK_PICLIB} != "no"
536 ${INSTALL} ${COPY} ${LIB_INSTALL_OWN} -m 644 \
537 lib${LIB}_pic.a ${DESTDIR}${LIBDIR}
538 ${RANLIB} ${DESTDIR}${LIBDIR}/lib${LIB}_pic.a
539 chmod ${LIBMODE} ${DESTDIR}${LIBDIR}/lib${LIB}_pic.a
541 .if !empty(SHLIB_MAJOR)
542 ${INSTALL} ${COPY} ${LIB_INSTALL_OWN} -m ${LIBMODE} \
543 lib${LIB}.${LD_so} ${DESTDIR}${LIBDIR}
544 .if !empty(SHLIB_LINKS)
545 (cd ${DESTDIR}${LIBDIR} && { rm -f ${SHLIB_LINKS}; ${SHLIB_LINKS:O:u:@x@ln -s lib${LIB}.${LD_so} $x;@} })
549 .if ${MK_LINT} != "no" && ${MK_LINKLIB} != "no" && !empty(LOBJS)
550 ${INSTALL} ${COPY} ${LIB_INSTALL_OWN} -m ${LIBMODE} \
551 llib-l${LIB}.ln ${DESTDIR}${LINTLIBDIR}
553 .if defined(LINKS) && !empty(LINKS)
554 @set ${LINKS}; ${_LINKS_SCRIPT}
558 .if ${MK_MAN} != "no"
559 install: maninstall _SUBDIRUSE
560 maninstall: afterinstall
562 afterinstall: realinstall
563 libinstall: beforeinstall
564 realinstall: beforeinstall
567 .if defined(FILES) || defined(FILESGROUPS)
571 .if ${MK_MAN} != "no"
575 .if ${MK_NLS} != "no"
585 # during building we usually need/want to install libs somewhere central
586 # note that we do NOT ch{own,grp} as that would likely fail at this point.
587 # otherwise it is the same as realinstall
588 # Note that we don't need this when using dpadd.mk
589 .libinstall: ${_LIBS}
590 test -d ${DESTDIR}${LIBDIR} || ${INSTALL} -d -m775 ${DESTDIR}${LIBDIR}
591 .for _lib in ${_LIBS:M*.a}
592 ${INSTALL} ${COPY} -m 644 ${_lib} ${DESTDIR}${LIBDIR}
593 ${RANLIB} ${DESTDIR}${LIBDIR}/${_lib}
595 .for _lib in ${_LIBS:M*.${LD_solink}*:O:u}
596 ${INSTALL} ${COPY} -m ${LIBMODE} ${_lib} ${DESTDIR}${LIBDIR}
597 .if !empty(SHLIB_LINKS)
598 (cd ${DESTDIR}${LIBDIR} && { ${SHLIB_LINKS:O:u:@x@ln -sf ${_lib} $x;@}; })
604 STAGE_LIBDIR?= ${STAGE_OBJTOP}${LIBDIR}