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