1 # $Id: lib.mk,v 1.68 2018/01/26 20:08:16 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,"-h lib${LIB}.so.${SHLIB_MAJOR}"
174 LD_solib= -Wl,--whole-archive lib${LIB}_pic.a -Wl,--no-whole-archive
175 # Linux uses GNU ld, which is a multi-pass linker
176 # so we don't need to use lorder or tsort
180 .elif ${TARGET_OSNAME} == "Darwin"
182 SHLIB_INSTALL_VERSION ?= ${SHLIB_MAJOR}
183 SHLIB_COMPATABILITY_VERSION ?= ${SHLIB_MAJOR}.${SHLIB_MINOR:U0}
184 SHLIB_COMPATABILITY ?= \
185 -compatibility_version ${SHLIB_COMPATABILITY_VERSION} \
186 -current_version ${SHLIB_FULLVERSION}
187 LD_shared = -dynamiclib \
188 -flat_namespace -undefined suppress \
189 -install_name ${LIBDIR}/lib${LIB}.${SHLIB_INSTALL_VERSION}.${LD_solink} \
190 ${SHLIB_COMPATABILITY}
192 .for v in ${SHLIB_COMPATABILITY_VERSION} ${SHLIB_INSTALL_VERSION}
193 .if "$v" != "${SHLIB_FULLVERSION}"
194 SHLIB_LINKS += lib${LIB}.$v.${LD_solink}
197 .if ${MK_LINKLIB} != "no"
198 SHLIB_LINKS += lib${LIB}.${LD_solink}
201 LD_so = ${SHLIB_FULLVERSION}.dylib
202 LD_sobjs = ${SOBJS:O:u}
203 LD_solib = ${LD_sobjs}
206 .if ${MACHINE_ARCH} == "i386"
209 PICFLAG ?= -fPIC -fno-common
216 .if !empty(SHLIB_MAJOR)
217 .if ${NEED_SOLINKS} && empty(SHLIB_LINKS)
218 .if ${MK_LINKLIB} != "no"
219 SHLIB_LINKS = lib${LIB}.${LD_solink}
221 .if "${SHLIB_FULLVERSION}" != "${SHLIB_MAJOR}"
222 SHLIB_LINKS += lib${LIB}.${LD_solink}.${SHLIB_MAJOR}
228 LD_shared ?= -Bshareable -Bforcearchive
229 LD_so ?= so.${SHLIB_FULLVERSION}
236 LD_objs ?= `${LORDER} ${OBJS} | ${TSORT}`
237 LD_sobjs ?= `${LORDER} ${SOBJS} | ${TSORT}`
238 LD_pobjs ?= `${LORDER} ${POBJS} | ${TSORT}`
240 LD_solib ?= ${LD_sobjs}
242 .if exists(/netbsd) && exists(${DESTDIR}/usr/lib/libdl.so)
246 # some libs have lots of objects, and scanning all .o, .po and ${PICO} meta files
247 # is a waste of time, this tells meta.autodep.mk to just pick one
248 # (typically ${PICO})
249 # yes, 42 is a random number.
250 .if ${MK_DIRDEPS_BUILD} == "yes" && ${SRCS:Uno:[\#]} > 42
251 OPTIMIZE_OBJECT_META_FILES ?= yes
255 .if ${MK_LIBTOOL} == "yes"
256 # because libtool is so fascist about naming the object files,
257 # we cannot (yet) build profiled libs
260 .if exists(${.CURDIR}/shlib_version)
261 SHLIB_AGE != . ${.CURDIR}/shlib_version ; echo $$age
264 # for the normal .a we do not want to strip symbols
266 ${COMPILE.c} ${.IMPSRC}
268 # for the normal .a we do not want to strip symbols
269 ${CXX_SUFFIXES:%=%.o}:
270 ${COMPILE.cc} ${.IMPSRC}
273 ${COMPILE.S} ${CFLAGS:M-[ID]*} ${AINC} ${.IMPSRC}
277 ${COMPILE.c} ${CC_PG} ${PROFFLAGS} ${.IMPSRC} -o ${.TARGET}
279 ${CXX_SUFFIXES:%=%.po}:
280 ${COMPILE.cc} -pg ${.IMPSRC} -o ${.TARGET}
283 ${COMPILE.S} ${PICFLAG} ${CC_PIC} ${CFLAGS:M-[ID]*} ${AINC} ${.IMPSRC} -o ${.TARGET}
286 ${COMPILE.c} ${CC_PG} ${PROFFLAGS} ${.IMPSRC} -o ${.TARGET}.o
287 @${LD} ${LD_X} ${LD_r} ${.TARGET}.o -o ${.TARGET}
290 ${CXX_SUFFIXES:%=%.po}:
291 ${COMPILE.cc} ${CXX_PG} ${.IMPSRC} -o ${.TARGET}.o
292 ${LD} ${LD_X} ${LD_r} ${.TARGET}.o -o ${.TARGET}
296 ${COMPILE.S} ${PICFLAG} ${CC_PIC} ${CFLAGS:M-[ID]*} ${AINC} ${.IMPSRC} -o ${.TARGET}.o
297 ${LD} ${LD_x} ${LD_r} ${.TARGET}.o -o ${.TARGET}
303 ${COMPILE.c} ${PICFLAG} ${CC_PIC} ${.IMPSRC} -o ${.TARGET}
305 ${CXX_SUFFIXES:%=%${PICO}}:
306 ${COMPILE.cc} ${PICFLAG} ${CC_PIC} ${.IMPSRC} -o ${.TARGET}
309 ${COMPILE.S} ${PROFFLAGS} ${CFLAGS:M-[ID]*} ${AINC} ${.IMPSRC} -o ${.TARGET}
313 ${COMPILE.c} ${PICFLAG} ${CC_PIC} ${.IMPSRC} -o ${.TARGET}.o
314 ${LD} ${LD_x} ${LD_r} ${.TARGET}.o -o ${.TARGET}
317 ${CXX_SUFFIXES:%=%${PICO}}:
318 ${COMPILE.cc} ${PICFLAG} ${CC_PIC} ${.IMPSRC} -o ${.TARGET}.o
319 ${LD} ${LD_x} ${LD_r} ${.TARGET}.o -o ${.TARGET}
323 ${COMPILE.S} ${PROFFLAGS} ${CFLAGS:M-[ID]*} ${AINC} ${.IMPSRC} -o ${.TARGET}.o
324 ${LD} ${LD_X} ${LD_r} ${.TARGET}.o -o ${.TARGET}
331 ${LINT} ${LINTFLAGS} ${CFLAGS:M-[IDU]*} -i ${.IMPSRC}
333 .if ${MK_LIBTOOL} != "yes"
335 .if !defined(PICFLAG)
341 .if ${MK_ARCHIVE} != "no"
345 .if ${MK_PROFILE} != "no"
347 POBJS+=${OBJS:.o=.po}
350 .if ${MK_PIC} != "no"
351 .if ${MK_PICLIB} == "no"
354 SOLIB=lib${LIB}_pic.a
357 .if !empty(SHLIB_FULLVERSION)
358 _LIBS+=lib${LIB}.${LD_so}
362 .if ${MK_LINT} != "no"
363 _LIBS+=llib-l${LIB}.ln
366 # here is where you can define what LIB* are
367 .-include <libnames.mk>
368 .if ${MK_DPADD_MK} == "yes"
369 # lots of cool magic, but might not suit everyone.
375 .elif ${MK_LDORDER_MK} != "no"
376 # Record any libs that we need to be linked with
377 _LIBS+= ${libLDORDER_INC}
379 .include <ldorder.mk>
382 .if !defined(_SKIP_BUILD)
388 .for s in ${SRCS:N*.h:M*/*}
389 ${.o ${PICO} .po .lo:L:@o@${s:T:R}$o@}: $s
392 OBJS+= ${SRCS:T:N*.h:R:S/$/.o/g}
395 .if ${MK_LIBTOOL} == "yes"
396 .if ${MK_PIC} == "no"
403 # .lo's are created as a side effect
405 ${LIBTOOL} --mode=compile ${CC} ${LT_STATIC} ${CFLAGS} ${CPPFLAGS} ${IMPFLAGS} -c ${.IMPSRC}
407 # can't really do profiled libs with libtool - its too fascist about
408 # naming the output...
409 lib${LIB}.a:: ${OBJS}
411 ${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}
412 @ln .libs/${.TARGET} .
414 lib${LIB}.${LD_so}:: lib${LIB}.a
415 @[ -s ${.TARGET}.${SHLIB_AGE} ] || { ln -s .libs/lib${LIB}.${LD_so}* . 2>/dev/null; : }
416 @[ -s ${.TARGET} ] || ln -s ${.TARGET}.${SHLIB_AGE} ${.TARGET}
418 .else # MK_LIBTOOL=yes
420 lib${LIB}.a:: ${OBJS}
421 @${META_NOECHO} building standard ${LIB} library
423 @${AR} ${AR_cq} ${.TARGET} ${LD_objs}
426 POBJS+= ${OBJS:.o=.po}
428 lib${LIB}_p.a:: ${POBJS}
429 @${META_NOECHO} building profiled ${LIB} library
431 @${AR} ${AR_cq} ${.TARGET} ${LD_pobjs}
434 SOBJS+= ${OBJS:.o=${PICO}}
436 lib${LIB}_pic.a:: ${SOBJS}
437 @${META_NOECHO} building shared object ${LIB} library
439 @${AR} ${AR_cq} ${.TARGET} ${LD_sobjs}
442 #SHLIB_LDADD?= ${LDADD}
444 # bound to be non-portable...
445 # this is known to work for NetBSD 1.6 and FreeBSD 4.2
446 lib${LIB}.${LD_so}: ${SOLIB} ${DPADD}
447 @${META_NOECHO} building shared ${LIB} library \(version ${SHLIB_FULLVERSION}\)
449 .if ${TARGET_OSNAME} == "NetBSD" || ${TARGET_OSNAME} == "FreeBSD"
450 .if ${OBJECT_FMT} == "ELF"
451 ${SHLIB_LD} -x -shared ${SHLIB_SHFLAGS} -o ${.TARGET} \
452 ${SHLIB_LDSTARTFILE} \
453 --whole-archive ${SOLIB} --no-whole-archive ${SHLIB_LDADD} \
456 ${SHLIB_LD} ${LD_x} ${LD_shared} \
457 -o ${.TARGET} ${SOLIB} ${SHLIB_LDADD}
460 ${SHLIB_LD} -o ${.TARGET} ${LD_shared} ${LD_solib} ${DLLIB} ${SHLIB_LDADD}
463 .if !empty(SHLIB_LINKS)
464 rm -f ${SHLIB_LINKS}; ${SHLIB_LINKS:O:u:@x@ln -s ${.TARGET} $x;@}
467 LOBJS+= ${LSRCS:.c=.ln} ${SRCS:M*.c:.c=.ln}
470 llib-l${LIB}.ln: ${LOBJS}
471 @${META_NOECHO} building llib-l${LIB}.ln
472 @rm -f llib-l${LIB}.ln
473 @${LINT} -C${LIB} ${LOBJS} ${LLIBS}
477 rm -f a.out [Ee]rrs mklog core *.core ${CLEANFILES}
478 rm -f lib${LIB}.a ${OBJS}
479 rm -f lib${LIB}_p.a ${POBJS}
480 rm -f lib${LIB}_pic.a lib${LIB}.so.*.* ${SOBJS}
481 rm -f llib-l${LIB}.ln ${LOBJS}
482 .if !empty(SHLIB_LINKS)
486 clean: _SUBDIRUSE cleanlib
487 cleandir: _SUBDIRUSE cleanlib
489 cleandir: _SUBDIRUSE clean
492 .if defined(SRCS) && (!defined(MKDEP) || ${MKDEP} != autodep)
494 @(TMP=/tmp/_depend$$$$; \
495 sed -e 's/^\([^\.]*\).o[ ]*:/\1.o \1.po \1${PICO} \1.ln:/' \
501 .if !target(beforeinstall)
506 LIB_INSTALL_OWN ?= -o ${LIBOWN} -g ${LIBGRP}
511 .if !target(libinstall) && !empty(LIB)
512 realinstall: libinstall
514 [ -d ${DESTDIR}/${LIBDIR} ] || \
515 ${INSTALL} -d ${LIB_INSTALL_OWN} -m 775 ${DESTDIR}${LIBDIR}
516 .if ${MK_ARCHIVE} != "no"
517 ${INSTALL} ${COPY} ${LIB_INSTALL_OWN} -m 644 lib${LIB}.a \
519 ${RANLIB} ${DESTDIR}${LIBDIR}/lib${LIB}.a
520 chmod ${LIBMODE} ${DESTDIR}${LIBDIR}/lib${LIB}.a
522 .if ${MK_PROFILE} != "no"
523 ${INSTALL} ${COPY} ${LIB_INSTALL_OWN} -m 644 \
524 lib${LIB}_p.a ${DESTDIR}${LIBDIR}
525 ${RANLIB} ${DESTDIR}${LIBDIR}/lib${LIB}_p.a
526 chmod ${LIBMODE} ${DESTDIR}${LIBDIR}/lib${LIB}_p.a
528 .if ${MK_LDORDER_MK} != "no"
529 ${INSTALL} ${COPY} ${LIB_INSTALL_OWN} -m 644 \
530 lib${LIB}.ldorder.inc ${DESTDIR}${LIBDIR}
532 .if ${MK_PIC} != "no"
533 .if ${MK_PICLIB} != "no"
534 ${INSTALL} ${COPY} ${LIB_INSTALL_OWN} -m 644 \
535 lib${LIB}_pic.a ${DESTDIR}${LIBDIR}
536 ${RANLIB} ${DESTDIR}${LIBDIR}/lib${LIB}_pic.a
537 chmod ${LIBMODE} ${DESTDIR}${LIBDIR}/lib${LIB}_pic.a
539 .if !empty(SHLIB_MAJOR)
540 ${INSTALL} ${COPY} ${LIB_INSTALL_OWN} -m ${LIBMODE} \
541 lib${LIB}.${LD_so} ${DESTDIR}${LIBDIR}
542 .if !empty(SHLIB_LINKS)
543 (cd ${DESTDIR}${LIBDIR} && { rm -f ${SHLIB_LINKS}; ${SHLIB_LINKS:O:u:@x@ln -s lib${LIB}.${LD_so} $x;@} })
547 .if ${MK_LINT} != "no" && ${MK_LINKLIB} != "no" && !empty(LOBJS)
548 ${INSTALL} ${COPY} ${LIB_INSTALL_OWN} -m ${LIBMODE} \
549 llib-l${LIB}.ln ${DESTDIR}${LINTLIBDIR}
551 .if defined(LINKS) && !empty(LINKS)
552 @set ${LINKS}; ${_LINKS_SCRIPT}
556 .if ${MK_MAN} != "no"
557 install: maninstall _SUBDIRUSE
558 maninstall: afterinstall
560 afterinstall: realinstall
561 libinstall: beforeinstall
562 realinstall: beforeinstall
565 .if defined(FILES) || defined(FILESGROUPS)
569 .if ${MK_MAN} != "no"
573 .if ${MK_NLS} != "no"
583 # during building we usually need/want to install libs somewhere central
584 # note that we do NOT ch{own,grp} as that would likely fail at this point.
585 # otherwise it is the same as realinstall
586 # Note that we don't need this when using dpadd.mk
587 .libinstall: ${_LIBS}
588 test -d ${DESTDIR}${LIBDIR} || ${INSTALL} -d -m775 ${DESTDIR}${LIBDIR}
589 .for _lib in ${_LIBS:M*.a}
590 ${INSTALL} ${COPY} -m 644 ${_lib} ${DESTDIR}${LIBDIR}
591 ${RANLIB} ${DESTDIR}${LIBDIR}/${_lib}
593 .for _lib in ${_LIBS:M*.${LD_solink}*:O:u}
594 ${INSTALL} ${COPY} -m ${LIBMODE} ${_lib} ${DESTDIR}${LIBDIR}
595 .if !empty(SHLIB_LINKS)
596 (cd ${DESTDIR}${LIBDIR} && { ${SHLIB_LINKS:O:u:@x@ln -sf ${_lib} $x;@}; })
602 STAGE_LIBDIR?= ${STAGE_OBJTOP}${LIBDIR}