xref: /netbsd-src/share/mk/bsd.lib.mk (revision a5847cc334d9a7029f6352b847e9e8d71a0f9e0c)
1#	$NetBSD: bsd.lib.mk,v 1.318 2011/10/07 09:15:22 mrg Exp $
2#	@(#)bsd.lib.mk	8.3 (Berkeley) 4/22/94
3
4.include <bsd.init.mk>
5.include <bsd.shlib.mk>
6.include <bsd.gcc.mk>
7# Pull in <bsd.sys.mk> here so we can override its .c.o rule
8.include <bsd.sys.mk>
9
10LIBISMODULE?=	no
11LIBISPRIVATE?=	no
12LIBISCXX?=	no
13
14_LIB_PREFIX=	lib
15
16.if ${LIBISMODULE} != "no"
17_LIB_PREFIX=	# empty
18MKDEBUGLIB:=	no
19MKLINT:=	no
20MKPICINSTALL:=	no
21MKPROFILE:=	no
22MKSTATICLIB:=	no
23.endif
24
25.if ${LIBISPRIVATE} != "no"
26MKDEBUGLIB:=	no
27MKLINT:=	no
28MKPICINSTALL:=	no
29. if defined(NOSTATICLIB) && ${MKPICLIB} != "no"
30MKSTATICLIB:=	no
31. else
32MKPIC:=		no
33. endif
34MKPROFILE:=	no
35.endif
36
37##### Basic targets
38.PHONY:		checkver libinstall
39realinstall:	checkver libinstall
40
41##### LIB specific flags.
42# XXX: This is needed for programs that link with .a libraries
43# Perhaps a more correct solution is to always generate _pic.a
44# files or always have a shared library.
45.if defined(MKPIE) && (${MKPIE} != "no")
46CFLAGS+=        ${PIE_CFLAGS}
47AFLAGS+=        ${PIE_AFLAGS}
48.endif
49
50##### Libraries that this may depend upon.
51.if defined(LIBDPLIBS) && ${MKPIC} != "no"				# {
52.for _lib _dir in ${LIBDPLIBS}
53.if !defined(LIBDO.${_lib})
54LIBDO.${_lib}!=	cd "${_dir}" && ${PRINTOBJDIR}
55.MAKEOVERRIDES+=LIBDO.${_lib}
56.endif
57LDADD+=		-L${LIBDO.${_lib}} -l${_lib}
58DPADD+=		${LIBDO.${_lib}}/lib${_lib}.so
59.endfor
60.endif									# }
61
62##### Build and install rules
63MKDEP_SUFFIXES?=	.o .po .pico .go .ln
64
65.if !defined(SHLIB_MAJOR) && exists(${SHLIB_VERSION_FILE})		# {
66SHLIB_MAJOR != . ${SHLIB_VERSION_FILE} ; echo $$major
67SHLIB_MINOR != . ${SHLIB_VERSION_FILE} ; echo $$minor
68SHLIB_TEENY != . ${SHLIB_VERSION_FILE} ; echo $$teeny
69
70DPADD+=	${SHLIB_VERSION_FILE}
71
72# Check for higher installed library versions.
73.if !defined(NOCHECKVER) && !defined(NOCHECKVER_${LIB}) && \
74	exists(${NETBSDSRCDIR}/lib/checkver)
75checkver:
76	@(cd "${.CURDIR}" && \
77	    HOST_SH=${HOST_SH:Q} AWK=${TOOL_AWK:Q} \
78	    ${HOST_SH} ${NETBSDSRCDIR}/lib/checkver -v ${SHLIB_VERSION_FILE} \
79		    -d ${DESTDIR}${_LIBSODIR} ${LIB})
80.endif
81.endif									# }
82
83.if !target(checkver)
84checkver:
85.endif
86
87print-shlib-major:
88.if defined(SHLIB_MAJOR) && ${MKPIC} != "no"
89	@echo ${SHLIB_MAJOR}
90.else
91	@false
92.endif
93
94print-shlib-minor:
95.if defined(SHLIB_MINOR) && ${MKPIC} != "no"
96	@echo ${SHLIB_MINOR}
97.else
98	@false
99.endif
100
101print-shlib-teeny:
102.if defined(SHLIB_TEENY) && ${MKPIC} != "no"
103	@echo ${SHLIB_TEENY}
104.else
105	@false
106.endif
107
108.if defined(SHLIB_MAJOR) && !empty(SHLIB_MAJOR)				# {
109.if defined(SHLIB_MINOR) && !empty(SHLIB_MINOR)
110.if defined(SHLIB_TEENY) && !empty(SHLIB_TEENY)
111SHLIB_FULLVERSION=${SHLIB_MAJOR}.${SHLIB_MINOR}.${SHLIB_TEENY}
112.else
113SHLIB_FULLVERSION=${SHLIB_MAJOR}.${SHLIB_MINOR}
114.endif
115.else
116SHLIB_FULLVERSION=${SHLIB_MAJOR}
117.endif
118.endif									# }
119
120# add additional suffixes not exported.
121# .po is used for profiling object files.
122# .pico is used for PIC object files.
123.SUFFIXES: .out .a .ln .pico .po .go .o .s .S .c .cc .cpp .cxx .C .m .F .f .r .y .l .cl .p .h
124.SUFFIXES: .sh .m4 .m
125
126
127# Set PICFLAGS to cc flags for producing position-independent code,
128# if not already set.  Includes -DPIC, if required.
129
130# Data-driven table using make variables to control how shared libraries
131# are built for different platforms and object formats.
132# SHLIB_MAJOR, SHLIB_MINOR, SHLIB_TEENY: Major, minor, and teeny version
133#			numbers of shared library
134# SHLIB_SOVERSION:	version number to be compiled into a shared library
135#			via -soname. Usualy ${SHLIB_MAJOR} on ELF.
136#			NetBSD/pmax used to use ${SHLIB_MAJOR}[.${SHLIB_MINOR}
137#			[.${SHLIB_TEENY}]]
138# SHLIB_SHFLAGS:	Flags to tell ${LD} to emit shared library.
139#			with ELF, also set shared-lib version for ld.so.
140# SHLIB_LDSTARTFILE:	support .o file, call C++ file-level constructors
141# SHLIB_LDENDFILE:	support .o file, call C++ file-level destructors
142# FPICFLAGS:		flags for ${FC} to compile .[fF] files to .pico objects.
143# CPPPICFLAGS:		flags for ${CPP} to preprocess .[sS] files for ${AS}
144# CPICFLAGS:		flags for ${CC} to compile .[cC] files to pic objects.
145# CSHLIBFLAGS:		flags for ${CC} to compile .[cC] files to .pico objects.
146#			(usually includes ${CPICFLAGS})
147# CAPICFLAGS:		flags for ${CC} to compiling .[Ss] files
148#		 	(usually just ${CPPPICFLAGS} ${CPICFLAGS})
149# APICFLAGS:		flags for ${AS} to assemble .[sS] to .pico objects.
150
151.if ${MACHINE_ARCH} == "alpha"						# {
152
153FPICFLAGS ?= -fPIC
154CPICFLAGS ?= -fPIC -DPIC
155CPPPICFLAGS?= -DPIC
156CAPICFLAGS?= ${CPPPICFLAGS} ${CPICFLAGS}
157APICFLAGS ?=
158
159.elif (${MACHINE_ARCH} == "sparc" || ${MACHINE_ARCH} == "sparc64") 	# } {
160
161# If you use -fPIC you need to define BIGPIC to turn on 32-bit
162# relocations in asm code
163FPICFLAGS ?= -fPIC
164CPICFLAGS ?= -fPIC -DPIC
165CPPPICFLAGS?= -DPIC -DBIGPIC
166CAPICFLAGS?= ${CPPPICFLAGS} ${CPICFLAGS}
167APICFLAGS ?= -KPIC
168
169.else									# } {
170
171# Platform-independent flags for NetBSD shared libraries
172SHLIB_SOVERSION=${SHLIB_FULLVERSION}
173SHLIB_SHFLAGS=
174FPICFLAGS ?= -fPIC
175CPICFLAGS?= -fPIC -DPIC
176CPPPICFLAGS?= -DPIC
177CAPICFLAGS?= ${CPPPICFLAGS} ${CPICFLAGS}
178APICFLAGS?= -k
179
180.endif									# }
181
182.if ${MKPICLIB} != "no"
183CSHLIBFLAGS+= ${CPICFLAGS}
184.endif
185
186.if defined(CSHLIBFLAGS) && !empty(CSHLIBFLAGS)
187MKSHLIBOBJS= yes
188.else
189MKSHLIBOBJS= no
190.endif
191
192# Platform-independent linker flags for ELF shared libraries
193SHLIB_SOVERSION=	${SHLIB_MAJOR}
194SHLIB_SHFLAGS=		-Wl,-soname,${_LIB_PREFIX}${LIB}.so.${SHLIB_SOVERSION}
195SHLIB_SHFLAGS+=		-Wl,--warn-shared-textrel
196SHLIB_LDSTARTFILE?=	${_GCC_CRTDIR}/crti.o ${_GCC_CRTBEGINS}
197SHLIB_LDENDFILE?=	${_GCC_CRTENDS} ${_GCC_CRTDIR}/crtn.o
198
199CFLAGS+=	${COPTS}
200OBJCFLAGS+=	${OBJCOPTS}
201AFLAGS+=	${COPTS}
202FFLAGS+=	${FOPTS}
203
204.if defined(CTFCONVERT)
205.if defined(CFLAGS) && !empty(CFLAGS:M*-g*)
206CTFFLAGS+=	-g
207.endif
208.endif
209
210.c.o:
211	${_MKTARGET_COMPILE}
212	${COMPILE.c} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
213.if defined(CTFCONVERT)
214	${CTFCONVERT} ${CTFFLAGS} ${.TARGET}
215.endif
216.if !defined(CFLAGS) || empty(CFLAGS:M*-g*)
217	${OBJCOPY} -x ${.TARGET}
218.endif
219
220.c.po:
221	${_MKTARGET_COMPILE}
222	${COMPILE.c} ${PROFFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} -pg ${.IMPSRC} -o ${.TARGET}
223.if defined(CTFCONVERT)
224	${CTFCONVERT} ${CTFFLAGS} ${.TARGET}
225.endif
226.if !defined(CFLAGS) || empty(CFLAGS:M*-g*)
227	${OBJCOPY} -X ${.TARGET}
228.endif
229
230.c.go:
231	${_MKTARGET_COMPILE}
232	${COMPILE.c} ${DEBUGFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} -g ${.IMPSRC} -o ${.TARGET}
233
234.c.pico:
235	${_MKTARGET_COMPILE}
236	${COMPILE.c} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${CSHLIBFLAGS} ${.IMPSRC} -o ${.TARGET}
237.if !defined(CFLAGS) || empty(CFLAGS:M*-g*)
238	${OBJCOPY} -x ${.TARGET}
239.endif
240
241.cc.o .cpp.o .cxx.o .C.o:
242	${_MKTARGET_COMPILE}
243	${COMPILE.cc} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
244.if !defined(CFLAGS) || empty(CFLAGS:M*-g*)
245	${OBJCOPY} -x ${.TARGET}
246.endif
247
248.cc.po .cpp.po .cxx.po .C.po:
249	${_MKTARGET_COMPILE}
250	${COMPILE.cc} ${PROFFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} -pg ${.IMPSRC} -o ${.TARGET}
251.if !defined(CFLAGS) || empty(CFLAGS:M*-g*)
252	${OBJCOPY} -X ${.TARGET}
253.endif
254
255.cc.go .cpp.go .cxx.go .C.go:
256	${_MKTARGET_COMPILE}
257	${COMPILE.cc} ${DEBUGFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} -g ${.IMPSRC} -o ${.TARGET}
258
259.cc.pico .cpp.pico .cxx.pico .C.pico:
260	${_MKTARGET_COMPILE}
261	${COMPILE.cc} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${CSHLIBFLAGS} ${.IMPSRC} -o ${.TARGET}
262.if !defined(CFLAGS) || empty(CFLAGS:M*-g*)
263	${OBJCOPY} -x ${.TARGET}
264.endif
265
266.f.o:
267	${_MKTARGET_COMPILE}
268	${COMPILE.f} ${.IMPSRC} -o ${.TARGET}
269.if defined(CTFCONVERT)
270	${CTFCONVERT} ${CTFFLAGS} ${.TARGET}
271.endif
272.if !defined(FOPTS) || empty(FOPTS:M*-g*)
273	${OBJCOPY} -x ${.TARGET}
274.endif
275
276.f.po:
277	${_MKTARGET_COMPILE}
278	${COMPILE.f} ${PROFFLAGS} -pg ${.IMPSRC} -o ${.TARGET}
279.if defined(CTFCONVERT)
280	${CTFCONVERT} ${CTFFLAGS} ${.TARGET}
281.endif
282.if !defined(FOPTS) || empty(FOPTS:M*-g*)
283	${OBJCOPY} -X ${.TARGET}
284.endif
285
286.f.go:
287	${_MKTARGET_COMPILE}
288	${COMPILE.f} ${DEBUGFLAGS} -g ${.IMPSRC} -o ${.TARGET}
289
290.f.pico:
291	${_MKTARGET_COMPILE}
292	${COMPILE.f} ${FPICFLAGS} ${.IMPSRC} -o ${.TARGET}
293.if !defined(FOPTS) || empty(FOPTS:M*-g*)
294	${OBJCOPY} -x ${.TARGET}
295.endif
296
297.f.ln:
298	${_MKTARGET_COMPILE}
299	@echo Skipping lint for Fortran libraries.
300
301.m.o:
302	${_MKTARGET_COMPILE}
303	${COMPILE.m} ${OBJCOPTS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
304.if defined(CTFCONVERT)
305	${CTFCONVERT} ${CTFFLAGS} ${.TARGET}
306.endif
307.if !defined(OBJCFLAGS) || empty(OBJCFLAGS:M*-g*)
308	${OBJCOPY} -x ${.TARGET}
309.endif
310
311.m.po:
312	${_MKTARGET_COMPILE}
313	${COMPILE.m} ${PROFFLAGS} -pg ${OBJCOPTS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
314.if defined(CTFCONVERT)
315	${CTFCONVERT} ${CTFFLAGS} ${.TARGET}
316.endif
317.if !defined(OBJCFLAGS) || empty(OBJCFLAGS:M*-g*)
318	${OBJCOPY} -X ${.TARGET}
319.endif
320
321.m.go:
322	${_MKTARGET_COMPILE}
323	${COMPILE.m} ${DEBUGFLAGS} -g ${OBJCOPTS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
324.if !defined(OBJCFLAGS) || empty(OBJCFLAGS:M*-g*)
325	${OBJCOPY} -X ${.TARGET}
326.endif
327
328.m.pico:
329	${_MKTARGET_COMPILE}
330	${COMPILE.m} ${CSHLIBFLAGS} ${OBJCOPTS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
331.if !defined(OBJCFLAGS) || empty(OBJCFLAGS:M*-g*)
332	${OBJCOPY} -x ${.TARGET}
333.endif
334
335.s.o:
336	${_MKTARGET_COMPILE}
337	${COMPILE.s} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
338.if defined(CTFCONVERT)
339	${CTFCONVERT} ${CTFFLAGS} ${.TARGET}
340.endif
341	${OBJCOPY} -x ${.TARGET}
342
343.S.o:
344	${_MKTARGET_COMPILE}
345	${COMPILE.S} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
346.if defined(CTFCONVERT)
347	${CTFCONVERT} ${CTFFLAGS} ${.TARGET}
348.endif
349	${OBJCOPY} -x ${.TARGET}
350
351.s.po:
352	${_MKTARGET_COMPILE}
353	${COMPILE.s} ${PROFFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
354.if defined(CTFCONVERT)
355	${CTFCONVERT} ${CTFFLAGS} ${.TARGET}
356.endif
357	${OBJCOPY} -X ${.TARGET}
358
359.S.po:
360	${_MKTARGET_COMPILE}
361	${COMPILE.S} ${PROFFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
362.if defined(CTFCONVERT)
363	${CTFCONVERT} ${CTFFLAGS} ${.TARGET}
364.endif
365	${OBJCOPY} -X ${.TARGET}
366
367.s.go:
368	${_MKTARGET_COMPILE}
369	${COMPILE.s} ${DEBUGFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
370
371.S.go:
372	${_MKTARGET_COMPILE}
373	${COMPILE.S} ${DEBUGFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
374
375.s.pico:
376	${_MKTARGET_COMPILE}
377	${COMPILE.s} ${CAPICFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
378	${OBJCOPY} -x ${.TARGET}
379
380.S.pico:
381	${_MKTARGET_COMPILE}
382	${COMPILE.S} ${CAPICFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
383	${OBJCOPY} -x ${.TARGET}
384
385.if defined(LIB)							# {
386.if (${MKPIC} == "no" || (defined(LDSTATIC) && ${LDSTATIC} != "") \
387	|| ${MKLINKLIB} != "no") && ${MKSTATICLIB} != "no"
388_LIBS=lib${LIB}.a
389.else
390_LIBS=
391.endif
392
393OBJS+=${SRCS:N*.h:N*.sh:R:S/$/.o/g}
394
395STOBJS+=${OBJS}
396
397LOBJS+=${LSRCS:.c=.ln} ${SRCS:M*.c:.c=.ln}
398
399.if ${LIBISPRIVATE} != "no"
400# No installation is required
401libinstall::
402.endif
403
404.if ${MKDEBUGLIB} != "no"
405_LIBS+=lib${LIB}_g.a
406GOBJS+=${OBJS:.o=.go}
407DEBUGFLAGS?=-DDEBUG
408.endif
409
410.if ${MKPROFILE} != "no"
411_LIBS+=lib${LIB}_p.a
412POBJS+=${OBJS:.o=.po}
413PROFFLAGS?=-DGPROF -DPROF
414.endif
415
416.if ${MKPIC} != "no"							# {
417.if ${MKPICLIB} == "no"
418.if ${MKSHLIBOBJS} != "no"
419# make _pic.a, which isn't really pic,
420# since it's needed for making shared lib.
421# but don't install it.
422SOLIB=lib${LIB}_pic.a
423SOBJS+=${OBJS:.o=.pico}
424.else
425SOLIB=lib${LIB}.a
426.endif
427.else
428SOLIB=lib${LIB}_pic.a
429_LIBS+=${SOLIB}
430SOBJS+=${OBJS:.o=.pico}
431.endif
432.if defined(SHLIB_FULLVERSION)
433_LIB.so:=lib${LIB}.so.${SHLIB_FULLVERSION}
434.if ${MKDEBUG} != "no"
435_LIB.debug:=${_LIB.so}.debug
436.endif
437_LIBS+=lib${LIB}.so.${SHLIB_FULLVERSION}
438.endif
439.endif									# }
440
441.if ${MKLINT} != "no" && !empty(LOBJS)
442_LIBS+=llib-l${LIB}.ln
443.endif
444
445ALLOBJS=
446.if (${MKPIC} == "no" || (defined(LDSTATIC) && ${LDSTATIC} != "") \
447	|| ${MKLINKLIB} != "no") && ${MKSTATICLIB} != "no"
448ALLOBJS+=${STOBJS}
449.endif
450ALLOBJS+=${POBJS} ${SOBJS}
451.if ${MKLINT} != "no" && !empty(LOBJS)
452ALLOBJS+=${LOBJS}
453.endif
454.else	# !defined(LIB)							# } {
455LOBJS=
456SOBJS=
457.endif	# !defined(LIB)							# }
458
459_YLSRCS=	${SRCS:M*.[ly]:C/\..$/.c/} ${YHEADER:D${SRCS:M*.y:.y=.h}}
460
461.NOPATH: ${ALLOBJS} ${_LIBS} ${_YLSRCS}
462
463realall: ${SRCS} ${ALLOBJS:O} ${_LIBS} ${_LIB.debug}
464
465MKARZERO?=no
466
467.if ${MKARZERO} == "yes"
468_ARFL=crsD
469_ARRANFL=sD
470_INSTRANLIB=
471.else
472_ARFL=crs
473_ARRANFL=s
474_INSTRANLIB=${empty(PRESERVE):?-a "${RANLIB} -t":}
475.endif
476
477# If you change this, please consider reflecting the change in
478# the override in sys/rump/Makefile.rump.
479.if !target(__archivebuild)
480__archivebuild: .USE
481	${_MKTARGET_BUILD}
482	rm -f ${.TARGET}
483	${AR} ${_ARFL} ${.TARGET} `NM=${NM} ${LORDER} ${.ALLSRC:M*o} | ${TSORT}`
484.endif
485
486.if !target(__archiveinstall)
487__archiveinstall: .USE
488	${_MKTARGET_INSTALL}
489	${INSTALL_FILE} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
490	    ${_INSTRANLIB} ${.ALLSRC} ${.TARGET}
491.endif
492
493__archivesymlinkpic: .USE
494	${_MKTARGET_INSTALL}
495	${INSTALL_SYMLINK} ${.ALLSRC} ${.TARGET}
496
497DPSRCS+=	${_YLSRCS}
498CLEANFILES+=	${_YLSRCS}
499
500${STOBJS} ${POBJS} ${GOBJS} ${SOBJS} ${LOBJS}: ${DPSRCS}
501
502lib${LIB}.a:: ${STOBJS} __archivebuild
503
504lib${LIB}_p.a:: ${POBJS} __archivebuild
505
506lib${LIB}_pic.a:: ${SOBJS} __archivebuild
507
508lib${LIB}_g.a:: ${GOBJS} __archivebuild
509
510
511_LIBLDOPTS=
512.if ${SHLIBDIR} != "/usr/lib"
513_LIBLDOPTS+=	-Wl,-rpath,${SHLIBDIR} \
514		-L=${SHLIBDIR}
515.elif ${SHLIBINSTALLDIR} != "/usr/lib"
516_LIBLDOPTS+=	-Wl,-rpath-link,${DESTDIR}${SHLIBINSTALLDIR} \
517		-L=${SHLIBINSTALLDIR}
518.endif
519
520# gcc -shared now adds -lc automatically. For libraries other than libc and
521# libgcc* we add as a dependency the installed shared libc. For libc and
522# libgcc* we avoid adding libc as a dependency by using -nostdlib. Note that
523# -Xl,-nostdlib is not enough because we want to tell the compiler-driver not
524# to add standard libraries, not the linker.
525.if !defined(LIB)
526.if !empty(LIBC_SO)
527DPLIBC ?= ${DESTDIR}${LIBC_SO}
528.endif
529.else
530.if ${LIB} != "c" && ${LIB:Mgcc*} == ""
531.if !empty(LIBC_SO)
532DPLIBC ?= ${DESTDIR}${LIBC_SO}
533.endif
534.else
535LDLIBC ?= -nodefaultlibs
536.if ${LIB} == "c"
537LDADD+= -lgcc
538.endif
539.endif
540.endif
541
542.if ${LIBISCXX} != "no"
543LIBCC:=	${CXX}
544.else
545LIBCC:=	${CC}
546.endif
547
548_LDADD.lib${LIB}=	${LDADD} ${LDADD.lib${LIB}}
549_LDFLAGS.lib${LIB}=	${LDFLAGS} ${LDFLAGS.lib${LIB}}
550
551lib${LIB}.so.${SHLIB_FULLVERSION}: ${SOLIB} ${DPADD} ${DPLIBC} \
552    ${SHLIB_LDSTARTFILE} ${SHLIB_LDENDFILE}
553	${_MKTARGET_BUILD}
554	rm -f lib${LIB}.so.${SHLIB_FULLVERSION}
555	${LIBCC} ${LDLIBC} -Wl,-x -shared ${SHLIB_SHFLAGS} ${_LDFLAGS.lib${LIB}} \
556	    -o ${.TARGET} ${_LIBLDOPTS} \
557	    -Wl,--whole-archive ${SOLIB} -Wl,--no-whole-archive ${_LDADD.lib${LIB}}
558#  We don't use INSTALL_SYMLINK here because this is just
559#  happening inside the build directory/objdir. XXX Why does
560#  this spend so much effort on libraries that aren't live??? XXX
561.if defined(SHLIB_FULLVERSION) && defined(SHLIB_MAJOR) && \
562    "${SHLIB_FULLVERSION}" != "${SHLIB_MAJOR}"
563	${HOST_LN} -sf lib${LIB}.so.${SHLIB_FULLVERSION} lib${LIB}.so.${SHLIB_MAJOR}.tmp
564	mv -f lib${LIB}.so.${SHLIB_MAJOR}.tmp lib${LIB}.so.${SHLIB_MAJOR}
565.endif
566	${HOST_LN} -sf lib${LIB}.so.${SHLIB_FULLVERSION} lib${LIB}.so.tmp
567	mv -f lib${LIB}.so.tmp lib${LIB}.so
568.if ${MKSTRIPIDENT} != "no"
569	${OBJCOPY} -R .ident ${.TARGET}
570.endif
571
572.if defined(_LIB.debug)
573${_LIB.debug}: ${_LIB.so}
574	${_MKTARGET_CREATE}
575	(  ${OBJCOPY} --only-keep-debug ${_LIB.so} ${_LIB.debug} \
576	&& ${OBJCOPY} --strip-debug -p -R .gnu_debuglink \
577		--add-gnu-debuglink=${_LIB.debug} ${_LIB.so} \
578	) || (rm -f ${_LIB.debug}; false)
579.endif
580
581.if !empty(LOBJS)							# {
582LLIBS?=		-lc
583llib-l${LIB}.ln: ${LOBJS}
584	${_MKTARGET_COMPILE}
585	rm -f llib-l${LIB}.ln
586.if defined(DESTDIR)
587	${LINT} -C${LIB} ${.ALLSRC} -L${DESTDIR}/usr/libdata ${LLIBS}
588.else
589	${LINT} -C${LIB} ${.ALLSRC} ${LLIBS}
590.endif
591.endif									# }
592
593lint: ${LOBJS}
594.if defined(LOBJS) && !empty(LOBJS)
595	${LINT} ${LINTFLAGS} ${LOBJS}
596.endif
597
598# If the number of entries in CLEANFILES is too large, then the
599# commands in bsd.clean.mk encounter errors like "exec(/bin/sh)
600# failed (Argument list too long)".  Avoid that by splitting the
601# files to clean into several lists using different variable names.
602# __cleanuse is an internal target in bsd.clean.mk; the way we
603# use it here mimics the way it's used by the clean target in
604# bsd.clean.mk.
605#
606clean: libclean1 libclean2 libclean3 libclean4 libclean5
607libclean1: .PHONY .MADE __cleanuse LIBCLEANFILES1
608libclean2: .PHONY .MADE __cleanuse LIBCLEANFILES2
609libclean3: .PHONY .MADE __cleanuse LIBCLEANFILES3
610libclean4: .PHONY .MADE __cleanuse LIBCLEANFILES4
611libclean5: .PHONY .MADE __cleanuse LIBCLEANFILES5
612CLEANFILES+= a.out [Ee]rrs mklog core *.core
613LIBCLEANFILES1+= lib${LIB}.a   ${STOBJS} ${STOBJS:=.tmp}
614LIBCLEANFILES2+= lib${LIB}_p.a ${POBJS}  ${POBJS:=.tmp}
615LIBCLEANFILES3+= lib${LIB}_g.a ${GOBJS}  ${GOBJS:=.tmp}
616LIBCLEANFILES4+= lib${LIB}_pic.a lib${LIB}.so.* lib${LIB}.so ${_LIB.debug}
617LIBCLEANFILES4+= ${SOBJS} ${SOBJS:=.tmp}
618LIBCLEANFILES5+= llib-l${LIB}.ln ${LOBJS}
619
620.if !target(libinstall)							# {
621# Make sure it gets defined, in case MKPIC==no && MKLINKLIB==no
622libinstall::
623
624.if ${MKLINKLIB} != "no" && ${MKSTATICLIB} != "no"
625libinstall:: ${DESTDIR}${LIBDIR}/lib${LIB}.a
626.PRECIOUS: ${DESTDIR}${LIBDIR}/lib${LIB}.a
627
628.if ${MKUPDATE} == "no"
629.if !defined(BUILD) && !make(all) && !make(lib${LIB}.a)
630${DESTDIR}${LIBDIR}/lib${LIB}.a! .MADE
631.endif
632${DESTDIR}${LIBDIR}/lib${LIB}.a! lib${LIB}.a __archiveinstall
633.else
634.if !defined(BUILD) && !make(all) && !make(lib${LIB}.a)
635${DESTDIR}${LIBDIR}/lib${LIB}.a: .MADE
636.endif
637${DESTDIR}${LIBDIR}/lib${LIB}.a: lib${LIB}.a __archiveinstall
638.endif
639.endif
640
641.if ${MKPROFILE} != "no"
642libinstall:: ${DESTDIR}${LIBDIR}/lib${LIB}_p.a
643.PRECIOUS: ${DESTDIR}${LIBDIR}/lib${LIB}_p.a
644
645.if ${MKUPDATE} == "no"
646.if !defined(BUILD) && !make(all) && !make(lib${LIB}_p.a)
647${DESTDIR}${LIBDIR}/lib${LIB}_p.a! .MADE
648.endif
649${DESTDIR}${LIBDIR}/lib${LIB}_p.a! lib${LIB}_p.a __archiveinstall
650.else
651.if !defined(BUILD) && !make(all) && !make(lib${LIB}_p.a)
652${DESTDIR}${LIBDIR}/lib${LIB}_p.a: .MADE
653.endif
654${DESTDIR}${LIBDIR}/lib${LIB}_p.a: lib${LIB}_p.a __archiveinstall
655.endif
656.endif
657
658.if ${MKDEBUGLIB} != "no"
659libinstall:: ${DESTDIR}${LIBDIR}/lib${LIB}_g.a
660.PRECIOUS: ${DESTDIR}${LIBDIR}/lib${LIB}_g.a
661
662.if ${MKUPDATE} == "no"
663.if !defined(BUILD) && !make(all) && !make(lib${LIB}_g.a)
664${DESTDIR}${LIBDIR}/lib${LIB}_g.a! .MADE
665.endif
666${DESTDIR}${LIBDIR}/lib${LIB}_g.a! lib${LIB}_g.a __archiveinstall
667.else
668.if !defined(BUILD) && !make(all) && !make(lib${LIB}_g.a)
669${DESTDIR}${LIBDIR}/lib${LIB}_g.a: .MADE
670.endif
671${DESTDIR}${LIBDIR}/lib${LIB}_g.a: lib${LIB}_g.a __archiveinstall
672.endif
673.endif
674
675.if ${MKPIC} != "no" && ${MKPICINSTALL} != "no"
676libinstall:: ${DESTDIR}${LIBDIR}/lib${LIB}_pic.a
677.PRECIOUS: ${DESTDIR}${LIBDIR}/lib${LIB}_pic.a
678
679.if ${MKUPDATE} == "no"
680.if !defined(BUILD) && !make(all) && !make(lib${LIB}_pic.a)
681${DESTDIR}${LIBDIR}/lib${LIB}_pic.a! .MADE
682.endif
683.if ${MKPICLIB} == "no"
684${DESTDIR}${LIBDIR}/lib${LIB}_pic.a! lib${LIB}.a __archivesymlinkpic
685.else
686${DESTDIR}${LIBDIR}/lib${LIB}_pic.a! lib${LIB}_pic.a __archiveinstall
687.endif
688.else
689.if !defined(BUILD) && !make(all) && !make(lib${LIB}_pic.a)
690${DESTDIR}${LIBDIR}/lib${LIB}_pic.a: .MADE
691.endif
692.if ${MKPICLIB} == "no"
693${DESTDIR}${LIBDIR}/lib${LIB}_pic.a: lib${LIB}.a __archivesymlinkpic
694.else
695${DESTDIR}${LIBDIR}/lib${LIB}_pic.a: lib${LIB}_pic.a __archiveinstall
696.endif
697.endif
698.endif
699
700.if ${MKPIC} != "no" && defined(SHLIB_FULLVERSION)
701_LIB_SO_TGT=		${DESTDIR}${_LIBSODIR}/${_LIB_PREFIX}${LIB}.so
702_LIB_SO_TGTLIBDIR=	   ${DESTDIR}${LIBDIR}/${_LIB_PREFIX}${LIB}.so
703
704libinstall:: ${_LIB_SO_TGT}.${SHLIB_FULLVERSION}
705.PRECIOUS: ${_LIB_SO_TGT}.${SHLIB_FULLVERSION}
706
707.if ${MKUPDATE} == "no"
708.if !defined(BUILD) && !make(all) && !make(lib${LIB}.so.${SHLIB_FULLVERSION})
709${_LIB_SO_TGT}.${SHLIB_FULLVERSION}! .MADE
710.endif
711${_LIB_SO_TGT}.${SHLIB_FULLVERSION}! lib${LIB}.so.${SHLIB_FULLVERSION}
712.else
713.if !defined(BUILD) && !make(all) && !make(lib${LIB}.so.${SHLIB_FULLVERSION})
714${_LIB_SO_TGT}.${SHLIB_FULLVERSION}: .MADE
715.endif
716${_LIB_SO_TGT}.${SHLIB_FULLVERSION}: lib${LIB}.so.${SHLIB_FULLVERSION}
717.endif
718	${_MKTARGET_INSTALL}
719	${INSTALL_FILE} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
720		${.ALLSRC} ${.TARGET}
721.if ${_LIBSODIR} != ${LIBDIR}
722	${INSTALL_SYMLINK} -l r \
723		${_LIB_SO_TGT}.${SHLIB_FULLVERSION} \
724		${_LIB_SO_TGTLIBDIR}.${SHLIB_FULLVERSION}
725.endif
726.if defined(SHLIB_FULLVERSION) && defined(SHLIB_MAJOR) && \
727    "${SHLIB_FULLVERSION}" != "${SHLIB_MAJOR}"
728	${INSTALL_SYMLINK} \
729		${_LIB_PREFIX}${LIB}.so.${SHLIB_FULLVERSION} \
730		${_LIB_SO_TGT}.${SHLIB_MAJOR}
731.if ${_LIBSODIR} != ${LIBDIR}
732	${INSTALL_SYMLINK} -l r \
733		${_LIB_SO_TGT}.${SHLIB_FULLVERSION} \
734		${_LIB_SO_TGTLIBDIR}.${SHLIB_MAJOR}
735.endif
736.endif
737.if ${MKLINKLIB} != "no"
738	${INSTALL_SYMLINK} \
739		${_LIB_PREFIX}${LIB}.so.${SHLIB_FULLVERSION} \
740		${_LIB_SO_TGT}
741.if ${_LIBSODIR} != ${LIBDIR}
742	${INSTALL_SYMLINK} -l r \
743		${_LIB_SO_TGT}.${SHLIB_FULLVERSION} \
744		${_LIB_SO_TGTLIBDIR}
745.endif
746.endif
747.endif
748
749.if defined(_LIB.debug)
750libinstall:: ${DESTDIR}${DEBUGDIR}${LIBDIR}/${_LIB.debug}
751.PRECIOUS: ${DESTDIR}${DEBUGDIR}${LIBDIR}/${_LIB.debug}
752
753${DESTDIR}${DEBUGDIR}${LIBDIR}/${_LIB.debug}: ${_LIB.debug}
754	${_MKTARGET_INSTALL}
755	${INSTALL_FILE} -o ${DEBUGOWN} -g ${DEBUGGRP} -m ${DEBUGMODE} \
756		${.ALLSRC} ${.TARGET}
757.endif
758
759.if ${MKLINT} != "no" && !empty(LOBJS)
760libinstall:: ${DESTDIR}${LINTLIBDIR}/llib-l${LIB}.ln
761.PRECIOUS: ${DESTDIR}${LINTLIBDIR}/llib-l${LIB}.ln
762
763.if ${MKUPDATE} == "no"
764.if !defined(BUILD) && !make(all) && !make(llib-l${LIB}.ln)
765${DESTDIR}${LINTLIBDIR}/llib-l${LIB}.ln! .MADE
766.endif
767${DESTDIR}${LINTLIBDIR}/llib-l${LIB}.ln! llib-l${LIB}.ln
768.else
769.if !defined(BUILD) && !make(all) && !make(llib-l${LIB}.ln)
770${DESTDIR}${LINTLIBDIR}/llib-l${LIB}.ln: .MADE
771.endif
772${DESTDIR}${LINTLIBDIR}/llib-l${LIB}.ln: llib-l${LIB}.ln
773.endif
774	${_MKTARGET_INSTALL}
775	${INSTALL_FILE} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
776		${.ALLSRC} ${DESTDIR}${LINTLIBDIR}
777.endif
778.endif	# !target(libinstall)						# }
779
780##### Pull in related .mk logic
781LINKSOWN?= ${LIBOWN}
782LINKSGRP?= ${LIBGRP}
783LINKSMODE?= ${LIBMODE}
784.include <bsd.man.mk>
785.include <bsd.nls.mk>
786.include <bsd.files.mk>
787.include <bsd.inc.mk>
788.include <bsd.links.mk>
789.include <bsd.dep.mk>
790.include <bsd.clang-analyze.mk>
791.include <bsd.clean.mk>
792
793${TARGETS}:	# ensure existence
794