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