1 # $Id: lib.mk,v 1.62 2017/06/11 03:24:04 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
40 # Originally derrived from NetBSD-1.6
42 # Set PICFLAGS to cc flags for producing position-independent code,
43 # if not already set. Includes -DPIC, if required.
45 # Data-driven table using make variables to control how shared libraries
46 # are built for different platforms and object formats.
47 # OBJECT_FMT: currently either "ELF" or "a.out", from <bsd.own.mk>
48 # SHLIB_SOVERSION: version number to be compiled into a shared library
49 # via -soname. Usually ${SHLIB_MAJOR} on ELF.
50 # NetBSD/pmax used to use ${SHLIB_MAJOR}[.${SHLIB_MINOR}
52 # SHLIB_SHFLAGS: Flags to tell ${LD} to emit shared library.
53 # with ELF, also set shared-lib version for ld.so.
54 # SHLIB_LDSTARTFILE: support .o file, call C++ file-level constructors
55 # SHLIB_LDENDFILE: support .o file, call C++ file-level destructors
56 # FPICFLAGS: flags for ${FC} to compile .[fF] files to ${PICO} objects.
57 # CPPICFLAGS: flags for ${CPP} to preprocess .[sS] files for ${AS}
58 # CPICFLAGS: flags for ${CC} to compile .[cC] files to ${PICO} objects.
59 # CAPICFLAGS flags for {$CC} to compiling .[Ss] files
60 # (usually just ${CPPPICFLAGS} ${CPICFLAGS})
61 # APICFLAGS: flags for ${AS} to assemble .[sS] to ${PICO} objects.
63 .if ${TARGET_OSNAME} == "NetBSD"
64 .if ${MACHINE_ARCH} == "alpha"
65 # Alpha-specific shared library flags
67 CPICFLAGS ?= -fPIC -DPIC
69 CAPICFLAGS?= ${CPPPICFLAGS} ${CPICFLAGS}
71 .elif ${MACHINE_ARCH} == "mipsel" || ${MACHINE_ARCH} == "mipseb"
72 # mips-specific shared library flags
74 # On mips, all libs are compiled with ABIcalls, not just sharedlibs.
77 # so turn shlib PIC flags on for ${AS}.
82 .elif ${MACHINE_ARCH} == "vax" && ${OBJECT_FMT} == "ELF"
83 # On the VAX, all object are PIC by default, not just sharedlibs.
86 .elif (${MACHINE_ARCH} == "sparc" || ${MACHINE_ARCH} == "sparc64") && \
87 ${OBJECT_FMT} == "ELF"
88 # If you use -fPIC you need to define BIGPIC to turn on 32-bit
89 # relocations in asm code
91 CPICFLAGS ?= -fPIC -DPIC
92 CPPPICFLAGS?= -DPIC -DBIGPIC
93 CAPICFLAGS?= ${CPPPICFLAGS} ${CPICFLAGS}
98 # Platform-independent flags for NetBSD a.out shared libraries
99 SHLIB_SOVERSION=${SHLIB_FULLVERSION}
102 CPICFLAGS?= -fPIC -DPIC
104 CAPICFLAGS?= ${CPPPICFLAGS} ${CPICFLAGS}
109 # Platform-independent linker flags for ELF shared libraries
110 .if ${OBJECT_FMT} == "ELF"
111 SHLIB_SOVERSION= ${SHLIB_MAJOR}
112 SHLIB_SHFLAGS= -soname lib${LIB}.so.${SHLIB_SOVERSION}
113 SHLIB_LDSTARTFILE?= /usr/lib/crtbeginS.o
114 SHLIB_LDENDFILE?= /usr/lib/crtendS.o
117 # for compatibility with the following
118 CC_PIC?= ${CPICFLAGS}
119 LD_shared=${SHLIB_SHFLAGS}
123 .if ${TARGET_OSNAME} == "FreeBSD"
124 .if ${OBJECT_FMT} == "ELF"
125 SHLIB_SOVERSION= ${SHLIB_MAJOR}
126 SHLIB_SHFLAGS= -soname lib${LIB}.so.${SHLIB_SOVERSION}
128 SHLIB_SHFLAGS= -assert pure-text
133 LD_shared=${SHLIB_SHFLAGS}
139 # sys.mk can override these
144 # Non BSD machines will be using bmake.
145 .if ${TARGET_OSNAME} == "SunOS"
146 LD_shared=-assert pure-text
147 .if ${OBJECT_FMT} == "ELF" || ${MACHINE} == "solaris"
149 LD_shared=-h lib${LIB}.so.${SHLIB_MAJOR} -G
151 .elif ${TARGET_OSNAME} == "HP-UX"
155 # HPsUX lorder does not grok anything but .o
156 LD_sobjs=`${LORDER} ${OBJS} | ${TSORT} | sed 's,\.o,${PICO},'`
157 LD_pobjs=`${LORDER} ${OBJS} | ${TSORT} | sed 's,\.o,.po,'`
158 .elif ${TARGET_OSNAME} == "OSF1"
159 LD_shared= -msym -shared -expect_unresolved '*'
160 LD_solib= -all lib${LIB}_pic.a
162 # lorder does not grok anything but .o
163 LD_sobjs=`${LORDER} ${OBJS} | ${TSORT} | sed 's,\.o,${PICO},'`
164 LD_pobjs=`${LORDER} ${OBJS} | ${TSORT} | sed 's,\.o,.po,'`
166 .elif ${TARGET_OSNAME} == "FreeBSD"
167 LD_solib= lib${LIB}_pic.a
168 .elif ${TARGET_OSNAME} == "Linux"
170 # this is ambiguous of course
171 LD_shared=-shared -Wl,"-h lib${LIB}.so.${SHLIB_MAJOR}"
172 LD_solib= -Wl,--whole-archive lib${LIB}_pic.a -Wl,--no-whole-archive
173 # Linux uses GNU ld, which is a multi-pass linker
174 # so we don't need to use lorder or tsort
178 .elif ${TARGET_OSNAME} == "Darwin"
180 SHLIB_INSTALL_VERSION ?= ${SHLIB_MAJOR}
181 SHLIB_COMPATABILITY_VERSION ?= ${SHLIB_MAJOR}.${SHLIB_MINOR:U0}
182 SHLIB_COMPATABILITY ?= \
183 -compatibility_version ${SHLIB_COMPATABILITY_VERSION} \
184 -current_version ${SHLIB_FULLVERSION}
185 LD_shared = -dynamiclib \
186 -flat_namespace -undefined suppress \
187 -install_name ${LIBDIR}/lib${LIB}.${SHLIB_INSTALL_VERSION}.${LD_solink} \
188 ${SHLIB_COMPATABILITY}
190 .for v in ${SHLIB_COMPATABILITY_VERSION} ${SHLIB_INSTALL_VERSION}
191 .if "$v" != "${SHLIB_FULLVERSION}"
192 SHLIB_LINKS += lib${LIB}.$v.${LD_solink}
195 .if ${MK_LINKLIB} != "no"
196 SHLIB_LINKS += lib${LIB}.${LD_solink}
199 LD_so = ${SHLIB_FULLVERSION}.dylib
200 LD_sobjs = ${SOBJS:O:u}
201 LD_solib = ${LD_sobjs}
204 .if ${MACHINE_ARCH} == "i386"
207 PICFLAG ?= -fPIC -fno-common
214 .if !empty(SHLIB_MAJOR)
215 .if ${NEED_SOLINKS} && empty(SHLIB_LINKS)
216 .if ${MK_LINKLIB} != "no"
217 SHLIB_LINKS = lib${LIB}.${LD_solink}
219 .if "${SHLIB_FULLVERSION}" != "${SHLIB_MAJOR}"
220 SHLIB_LINKS += lib${LIB}.${LD_solink}.${SHLIB_MAJOR}
226 LD_shared ?= -Bshareable -Bforcearchive
227 LD_so ?= so.${SHLIB_FULLVERSION}
234 LD_objs ?= `${LORDER} ${OBJS} | ${TSORT}`
235 LD_sobjs ?= `${LORDER} ${SOBJS} | ${TSORT}`
236 LD_pobjs ?= `${LORDER} ${POBJS} | ${TSORT}`
238 LD_solib ?= ${LD_sobjs}
240 .if exists(/netbsd) && exists(${DESTDIR}/usr/lib/libdl.so)
244 # some libs have lots of objects, and scanning all .o, .po and ${PICO} meta files
245 # is a waste of time, this tells meta.autodep.mk to just pick one
246 # (typically ${PICO})
247 # yes, 42 is a random number.
248 .if ${MK_DIRDEPS_BUILD} == "yes" && ${SRCS:Uno:[\#]} > 42
249 OPTIMIZE_OBJECT_META_FILES ?= yes
253 .if ${MK_LIBTOOL} == "yes"
254 # because libtool is so fascist about naming the object files,
255 # we cannot (yet) build profiled libs
258 .if exists(${.CURDIR}/shlib_version)
259 SHLIB_AGE != . ${.CURDIR}/shlib_version ; echo $$age
262 # for the normal .a we do not want to strip symbols
264 ${COMPILE.c} ${.IMPSRC}
266 # for the normal .a we do not want to strip symbols
267 ${CXX_SUFFIXES:%=%.o}:
268 ${COMPILE.cc} ${.IMPSRC}
271 ${COMPILE.S} ${CFLAGS:M-[ID]*} ${AINC} ${.IMPSRC}
275 ${COMPILE.c} ${CC_PG} ${PROFFLAGS} ${.IMPSRC} -o ${.TARGET}
277 ${CXX_SUFFIXES:%=%.po}:
278 ${COMPILE.cc} -pg ${.IMPSRC} -o ${.TARGET}
281 ${COMPILE.S} ${PICFLAG} ${CC_PIC} ${CFLAGS:M-[ID]*} ${AINC} ${.IMPSRC} -o ${.TARGET}
284 ${COMPILE.c} ${CC_PG} ${PROFFLAGS} ${.IMPSRC} -o ${.TARGET}.o
285 @${LD} ${LD_X} ${LD_r} ${.TARGET}.o -o ${.TARGET}
288 ${CXX_SUFFIXES:%=%.po}:
289 ${COMPILE.cc} ${CXX_PG} ${.IMPSRC} -o ${.TARGET}.o
290 ${LD} ${LD_X} ${LD_r} ${.TARGET}.o -o ${.TARGET}
294 ${COMPILE.S} ${PICFLAG} ${CC_PIC} ${CFLAGS:M-[ID]*} ${AINC} ${.IMPSRC} -o ${.TARGET}.o
295 ${LD} ${LD_x} ${LD_r} ${.TARGET}.o -o ${.TARGET}
301 ${COMPILE.c} ${PICFLAG} ${CC_PIC} ${.IMPSRC} -o ${.TARGET}
303 ${CXX_SUFFIXES:%=%${PICO}}:
304 ${COMPILE.cc} ${PICFLAG} ${CC_PIC} ${.IMPSRC} -o ${.TARGET}
307 ${COMPILE.S} ${PROFFLAGS} ${CFLAGS:M-[ID]*} ${AINC} ${.IMPSRC} -o ${.TARGET}
311 ${COMPILE.c} ${PICFLAG} ${CC_PIC} ${.IMPSRC} -o ${.TARGET}.o
312 ${LD} ${LD_x} ${LD_r} ${.TARGET}.o -o ${.TARGET}
315 ${CXX_SUFFIXES:%=%${PICO}}:
316 ${COMPILE.cc} ${PICFLAG} ${CC_PIC} ${.IMPSRC} -o ${.TARGET}.o
317 ${LD} ${LD_x} ${LD_r} ${.TARGET}.o -o ${.TARGET}
321 ${COMPILE.S} ${PROFFLAGS} ${CFLAGS:M-[ID]*} ${AINC} ${.IMPSRC} -o ${.TARGET}.o
322 ${LD} ${LD_X} ${LD_r} ${.TARGET}.o -o ${.TARGET}
329 ${LINT} ${LINTFLAGS} ${CFLAGS:M-[IDU]*} -i ${.IMPSRC}
331 .if ${MK_LIBTOOL} != "yes"
333 .if !defined(PICFLAG)
339 .if ${MK_ARCHIVE} != "no"
343 .if ${MK_PROFILE} != "no"
345 POBJS+=${OBJS:.o=.po}
348 .if ${MK_PIC} != "no"
349 .if ${MK_PICLIB} == "no"
352 SOLIB=lib${LIB}_pic.a
355 .if !empty(SHLIB_FULLVERSION)
356 _LIBS+=lib${LIB}.${LD_so}
360 .if ${MK_LINT} != "no"
361 _LIBS+=llib-l${LIB}.ln
364 # here is where you can define what LIB* are
365 .-include <libnames.mk>
366 .if ${MK_DPADD_MK} == "yes"
367 # lots of cool magic, but might not suit everyone.
375 .if !defined(_SKIP_BUILD)
381 .for s in ${SRCS:N*.h:M*/*}
382 ${.o ${PICO} .po .lo:L:@o@${s:T:R}$o@}: $s
385 OBJS+= ${SRCS:T:N*.h:R:S/$/.o/g}
388 .if ${MK_LIBTOOL} == "yes"
389 .if ${MK_PIC} == "no"
396 # .lo's are created as a side effect
398 ${LIBTOOL} --mode=compile ${CC} ${LT_STATIC} ${CFLAGS} ${CPPFLAGS} ${IMPFLAGS} -c ${.IMPSRC}
400 # can't really do profiled libs with libtool - its too fascist about
401 # naming the output...
402 lib${LIB}.a:: ${OBJS}
404 ${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}
405 @ln .libs/${.TARGET} .
407 lib${LIB}.${LD_so}:: lib${LIB}.a
408 @[ -s ${.TARGET}.${SHLIB_AGE} ] || { ln -s .libs/lib${LIB}.${LD_so}* . 2>/dev/null; : }
409 @[ -s ${.TARGET} ] || ln -s ${.TARGET}.${SHLIB_AGE} ${.TARGET}
411 .else # MK_LIBTOOL=yes
413 lib${LIB}.a:: ${OBJS}
414 @${META_NOECHO} building standard ${LIB} library
416 @${AR} ${AR_cq} ${.TARGET} ${LD_objs}
419 POBJS+= ${OBJS:.o=.po}
421 lib${LIB}_p.a:: ${POBJS}
422 @${META_NOECHO} building profiled ${LIB} library
424 @${AR} ${AR_cq} ${.TARGET} ${LD_pobjs}
427 SOBJS+= ${OBJS:.o=${PICO}}
429 lib${LIB}_pic.a:: ${SOBJS}
430 @${META_NOECHO} building shared object ${LIB} library
432 @${AR} ${AR_cq} ${.TARGET} ${LD_sobjs}
435 #SHLIB_LDADD?= ${LDADD}
437 # bound to be non-portable...
438 # this is known to work for NetBSD 1.6 and FreeBSD 4.2
439 lib${LIB}.${LD_so}: ${SOLIB} ${DPADD}
440 @${META_NOECHO} building shared ${LIB} library \(version ${SHLIB_FULLVERSION}\)
442 .if ${TARGET_OSNAME} == "NetBSD" || ${TARGET_OSNAME} == "FreeBSD"
443 .if ${OBJECT_FMT} == "ELF"
444 ${SHLIB_LD} -x -shared ${SHLIB_SHFLAGS} -o ${.TARGET} \
445 ${SHLIB_LDSTARTFILE} \
446 --whole-archive ${SOLIB} --no-whole-archive ${SHLIB_LDADD} \
449 ${SHLIB_LD} ${LD_x} ${LD_shared} \
450 -o ${.TARGET} ${SOLIB} ${SHLIB_LDADD}
453 ${SHLIB_LD} -o ${.TARGET} ${LD_shared} ${LD_solib} ${DLLIB} ${SHLIB_LDADD}
456 .if !empty(SHLIB_LINKS)
457 rm -f ${SHLIB_LINKS}; ${SHLIB_LINKS:O:u:@x@ln -s ${.TARGET} $x;@}
460 LOBJS+= ${LSRCS:.c=.ln} ${SRCS:M*.c:.c=.ln}
463 llib-l${LIB}.ln: ${LOBJS}
464 @${META_NOECHO} building llib-l${LIB}.ln
465 @rm -f llib-l${LIB}.ln
466 @${LINT} -C${LIB} ${LOBJS} ${LLIBS}
470 rm -f a.out [Ee]rrs mklog core *.core ${CLEANFILES}
471 rm -f lib${LIB}.a ${OBJS}
472 rm -f lib${LIB}_p.a ${POBJS}
473 rm -f lib${LIB}_pic.a lib${LIB}.so.*.* ${SOBJS}
474 rm -f llib-l${LIB}.ln ${LOBJS}
475 .if !empty(SHLIB_LINKS)
479 clean: _SUBDIRUSE cleanlib
480 cleandir: _SUBDIRUSE cleanlib
482 cleandir: _SUBDIRUSE clean
485 .if defined(SRCS) && (!defined(MKDEP) || ${MKDEP} != autodep)
487 @(TMP=/tmp/_depend$$$$; \
488 sed -e 's/^\([^\.]*\).o[ ]*:/\1.o \1.po \1${PICO} \1.ln:/' \
494 .if !target(beforeinstall)
499 LIB_INSTALL_OWN ?= -o ${LIBOWN} -g ${LIBGRP}
504 .if !target(libinstall) && !empty(LIB)
505 realinstall: libinstall
507 [ -d ${DESTDIR}/${LIBDIR} ] || \
508 ${INSTALL} -d ${LIB_INSTALL_OWN} -m 775 ${DESTDIR}${LIBDIR}
509 .if ${MK_ARCHIVE} != "no"
510 ${INSTALL} ${COPY} ${LIB_INSTALL_OWN} -m 600 lib${LIB}.a \
512 ${RANLIB} ${DESTDIR}${LIBDIR}/lib${LIB}.a
513 chmod ${LIBMODE} ${DESTDIR}${LIBDIR}/lib${LIB}.a
515 .if ${MK_PROFILE} != "no"
516 ${INSTALL} ${COPY} ${LIB_INSTALL_OWN} -m 600 \
517 lib${LIB}_p.a ${DESTDIR}${LIBDIR}
518 ${RANLIB} ${DESTDIR}${LIBDIR}/lib${LIB}_p.a
519 chmod ${LIBMODE} ${DESTDIR}${LIBDIR}/lib${LIB}_p.a
521 .if ${MK_PIC} != "no"
522 .if ${MK_PICLIB} != "no"
523 ${INSTALL} ${COPY} ${LIB_INSTALL_OWN} -m 600 \
524 lib${LIB}_pic.a ${DESTDIR}${LIBDIR}
525 ${RANLIB} ${DESTDIR}${LIBDIR}/lib${LIB}_pic.a
526 chmod ${LIBMODE} ${DESTDIR}${LIBDIR}/lib${LIB}_pic.a
528 .if !empty(SHLIB_MAJOR)
529 ${INSTALL} ${COPY} ${LIB_INSTALL_OWN} -m ${LIBMODE} \
530 lib${LIB}.${LD_so} ${DESTDIR}${LIBDIR}
531 .if !empty(SHLIB_LINKS)
532 (cd ${DESTDIR}${LIBDIR} && { rm -f ${SHLIB_LINKS}; ${SHLIB_LINKS:O:u:@x@ln -s lib${LIB}.${LD_so} $x;@} })
536 .if ${MK_LINT} != "no" && ${MK_LINKLIB} != "no" && !empty(LOBJS)
537 ${INSTALL} ${COPY} ${LIB_INSTALL_OWN} -m ${LIBMODE} \
538 llib-l${LIB}.ln ${DESTDIR}${LINTLIBDIR}
540 .if defined(LINKS) && !empty(LINKS)
541 @set ${LINKS}; ${_LINKS_SCRIPT}
545 .if ${MK_MAN} != "no"
546 install: maninstall _SUBDIRUSE
547 maninstall: afterinstall
549 afterinstall: realinstall
550 libinstall: beforeinstall
551 realinstall: beforeinstall
554 .if defined(FILES) || defined(FILESGROUPS)
558 .if ${MK_MAN} != "no"
562 .if ${MK_NLS} != "no"
572 # during building we usually need/want to install libs somewhere central
573 # note that we do NOT ch{own,grp} as that would likely fail at this point.
574 # otherwise it is the same as realinstall
575 # Note that we don't need this when using dpadd.mk
576 .libinstall: ${_LIBS}
577 test -d ${DESTDIR}${LIBDIR} || ${INSTALL} -d -m775 ${DESTDIR}${LIBDIR}
578 .for _lib in ${_LIBS:M*.a}
579 ${INSTALL} ${COPY} -m 644 ${_lib} ${DESTDIR}${LIBDIR}
580 ${RANLIB} ${DESTDIR}${LIBDIR}/${_lib}
582 .for _lib in ${_LIBS:M*.${LD_solink}*:O:u}
583 ${INSTALL} ${COPY} -m ${LIBMODE} ${_lib} ${DESTDIR}${LIBDIR}
584 .if !empty(SHLIB_LINKS)
585 (cd ${DESTDIR}${LIBDIR} && { ${SHLIB_LINKS:O:u:@x@ln -sf ${_lib} $x;@}; })
591 STAGE_LIBDIR?= ${STAGE_OBJTOP}${LIBDIR}