xref: /netbsd-src/share/mk/bsd.lib.mk (revision b62fc9e20372b08e1785ff6d769312d209fa2005)
1#	$NetBSD: bsd.lib.mk,v 1.305 2010/03/02 20:49:18 darran 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# OBJECT_FMT:		currently either "ELF" or "a.out", from <bsd.own.mk>
144# SHLIB_MAJOR, SHLIB_MINOR, SHLIB_TEENY: Major, minor, and teeny version
145#			numbers of shared library
146# SHLIB_SOVERSION:	version number to be compiled into a shared library
147#			via -soname. Usualy ${SHLIB_MAJOR} on ELF.
148#			NetBSD/pmax used to use ${SHLIB_MAJOR}[.${SHLIB_MINOR}
149#			[.${SHLIB_TEENY}]]
150# SHLIB_SHFLAGS:	Flags to tell ${LD} to emit shared library.
151#			with ELF, also set shared-lib version for ld.so.
152# SHLIB_LDSTARTFILE:	support .o file, call C++ file-level constructors
153# SHLIB_LDENDFILE:	support .o file, call C++ file-level destructors
154# FPICFLAGS:		flags for ${FC} to compile .[fF] files to .pico objects.
155# CPPPICFLAGS:		flags for ${CPP} to preprocess .[sS] files for ${AS}
156# CPICFLAGS:		flags for ${CC} to compile .[cC] files to pic objects.
157# CSHLIBFLAGS:		flags for ${CC} to compile .[cC] files to .pico objects.
158#			(usually includes ${CPICFLAGS})
159# CAPICFLAGS:		flags for ${CC} to compiling .[Ss] files
160#		 	(usually just ${CPPPICFLAGS} ${CPICFLAGS})
161# APICFLAGS:		flags for ${AS} to assemble .[sS] to .pico objects.
162
163.if ${MACHINE_ARCH} == "alpha"						# {
164
165FPICFLAGS ?= -fPIC
166CPICFLAGS ?= -fPIC -DPIC
167CPPPICFLAGS?= -DPIC
168CAPICFLAGS?= ${CPPPICFLAGS} ${CPICFLAGS}
169APICFLAGS ?=
170
171.elif (${MACHINE_ARCH} == "sparc" || ${MACHINE_ARCH} == "sparc64") && \
172       ${OBJECT_FMT} == "ELF"						# } {
173
174# If you use -fPIC you need to define BIGPIC to turn on 32-bit
175# relocations in asm code
176FPICFLAGS ?= -fPIC
177CPICFLAGS ?= -fPIC -DPIC
178CPPPICFLAGS?= -DPIC -DBIGPIC
179CAPICFLAGS?= ${CPPPICFLAGS} ${CPICFLAGS}
180APICFLAGS ?= -KPIC
181
182.else									# } {
183
184# Platform-independent flags for NetBSD shared libraries
185SHLIB_SOVERSION=${SHLIB_FULLVERSION}
186SHLIB_SHFLAGS=
187FPICFLAGS ?= -fPIC
188CPICFLAGS?= -fPIC -DPIC
189CPPPICFLAGS?= -DPIC
190CAPICFLAGS?= ${CPPPICFLAGS} ${CPICFLAGS}
191APICFLAGS?= -k
192
193.endif									# }
194
195.if ${MKPICLIB} != "no"
196CSHLIBFLAGS+= ${CPICFLAGS}
197.endif
198
199.if defined(CSHLIBFLAGS) && !empty(CSHLIBFLAGS)
200MKSHLIBOBJS= yes
201.else
202MKSHLIBOBJS= no
203.endif
204
205# Platform-independent linker flags for ELF shared libraries
206.if ${OBJECT_FMT} == "ELF"
207SHLIB_SOVERSION=	${SHLIB_MAJOR}
208SHLIB_SHFLAGS=		-Wl,-soname,${_LIB_PREFIX}${LIB}.so.${SHLIB_SOVERSION}
209SHLIB_SHFLAGS+=		-Wl,--warn-shared-textrel
210SHLIB_LDSTARTFILE?=	${_GCC_CRTDIR}/crti.o ${_GCC_CRTBEGINS}
211SHLIB_LDENDFILE?=	${_GCC_CRTENDS} ${_GCC_CRTDIR}/crtn.o
212.endif
213
214CFLAGS+=	${COPTS}
215OBJCFLAGS+=	${OBJCOPTS}
216AFLAGS+=	${COPTS}
217FFLAGS+=	${FOPTS}
218
219.if defined(CTFCONVERT)
220.if defined(CFLAGS) && !empty(CFLAGS:M*-g*)
221CTFFLAGS+=	-g
222.endif
223.endif
224
225.c.o:
226	${_MKTARGET_COMPILE}
227	${COMPILE.c} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
228.if defined(CTFCONVERT)
229	${CTFCONVERT} ${CTFFLAGS} ${.TARGET}
230.endif
231.if !defined(CFLAGS) || empty(CFLAGS:M*-g*)
232	${OBJCOPY} -x ${.TARGET}
233.endif
234
235.c.po:
236	${_MKTARGET_COMPILE}
237	${COMPILE.c} ${PROFFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} -pg ${.IMPSRC} -o ${.TARGET}
238.if defined(CTFCONVERT)
239	${CTFCONVERT} ${CTFFLAGS} ${.TARGET}
240.endif
241.if !defined(CFLAGS) || empty(CFLAGS:M*-g*)
242	${OBJCOPY} -X ${.TARGET}
243.endif
244
245.c.go:
246	${_MKTARGET_COMPILE}
247	${COMPILE.c} ${DEBUGFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} -g ${.IMPSRC} -o ${.TARGET}
248
249.c.pico:
250	${_MKTARGET_COMPILE}
251	${COMPILE.c} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${CSHLIBFLAGS} ${.IMPSRC} -o ${.TARGET}
252.if !defined(CFLAGS) || empty(CFLAGS:M*-g*)
253	${OBJCOPY} -x ${.TARGET}
254.endif
255
256.cc.o .cpp.o .cxx.o .C.o:
257	${_MKTARGET_COMPILE}
258	${COMPILE.cc} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
259.if !defined(CFLAGS) || empty(CFLAGS:M*-g*)
260	${OBJCOPY} -x ${.TARGET}
261.endif
262
263.cc.po .cpp.po .cxx.po .C.po:
264	${_MKTARGET_COMPILE}
265	${COMPILE.cc} ${PROFFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} -pg ${.IMPSRC} -o ${.TARGET}
266.if !defined(CFLAGS) || empty(CFLAGS:M*-g*)
267	${OBJCOPY} -X ${.TARGET}
268.endif
269
270.cc.go .cpp.go .cxx.go .C.go:
271	${_MKTARGET_COMPILE}
272	${COMPILE.cc} ${DEBUGFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} -g ${.IMPSRC} -o ${.TARGET}
273
274.cc.pico .cpp.pico .cxx.pico .C.pico:
275	${_MKTARGET_COMPILE}
276	${COMPILE.cc} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${CSHLIBFLAGS} ${.IMPSRC} -o ${.TARGET}
277.if !defined(CFLAGS) || empty(CFLAGS:M*-g*)
278	${OBJCOPY} -x ${.TARGET}
279.endif
280
281.f.o:
282	${_MKTARGET_COMPILE}
283	${COMPILE.f} ${.IMPSRC} -o ${.TARGET}
284.if defined(CTFCONVERT)
285	${CTFCONVERT} ${CTFFLAGS} ${.TARGET}
286.endif
287.if !defined(FOPTS) || empty(FOPTS:M*-g*)
288	${OBJCOPY} -x ${.TARGET}
289.endif
290
291.f.po:
292	${_MKTARGET_COMPILE}
293	${COMPILE.f} ${PROFFLAGS} -pg ${.IMPSRC} -o ${.TARGET}
294.if defined(CTFCONVERT)
295	${CTFCONVERT} ${CTFFLAGS} ${.TARGET}
296.endif
297.if !defined(FOPTS) || empty(FOPTS:M*-g*)
298	${OBJCOPY} -X ${.TARGET}
299.endif
300
301.f.go:
302	${_MKTARGET_COMPILE}
303	${COMPILE.f} ${DEBUGFLAGS} -g ${.IMPSRC} -o ${.TARGET}
304
305.f.pico:
306	${_MKTARGET_COMPILE}
307	${COMPILE.f} ${FPICFLAGS} ${.IMPSRC} -o ${.TARGET}
308.if !defined(FOPTS) || empty(FOPTS:M*-g*)
309	${OBJCOPY} -x ${.TARGET}
310.endif
311
312.f.ln:
313	${_MKTARGET_COMPILE}
314	@echo Skipping lint for Fortran libraries.
315
316.m.o:
317	${_MKTARGET_COMPILE}
318	${COMPILE.m} ${OBJCOPTS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
319.if defined(CTFCONVERT)
320	${CTFCONVERT} ${CTFFLAGS} ${.TARGET}
321.endif
322.if !defined(OBJCFLAGS) || empty(OBJCFLAGS:M*-g*)
323	${OBJCOPY} -x ${.TARGET}
324.endif
325
326.m.po:
327	${_MKTARGET_COMPILE}
328	${COMPILE.m} ${PROFFLAGS} -pg ${OBJCOPTS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
329.if defined(CTFCONVERT)
330	${CTFCONVERT} ${CTFFLAGS} ${.TARGET}
331.endif
332.if !defined(OBJCFLAGS) || empty(OBJCFLAGS:M*-g*)
333	${OBJCOPY} -X ${.TARGET}
334.endif
335
336.m.go:
337	${_MKTARGET_COMPILE}
338	${COMPILE.m} ${DEBUGFLAGS} -g ${OBJCOPTS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
339.if !defined(OBJCFLAGS) || empty(OBJCFLAGS:M*-g*)
340	${OBJCOPY} -X ${.TARGET}
341.endif
342
343.m.pico:
344	${_MKTARGET_COMPILE}
345	${COMPILE.m} ${CSHLIBFLAGS} ${OBJCOPTS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
346.if !defined(OBJCFLAGS) || empty(OBJCFLAGS:M*-g*)
347	${OBJCOPY} -x ${.TARGET}
348.endif
349
350.s.o:
351	${_MKTARGET_COMPILE}
352	${COMPILE.s} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
353.if defined(CTFCONVERT)
354	${CTFCONVERT} ${CTFFLAGS} ${.TARGET}
355.endif
356	${OBJCOPY} -x ${.TARGET}
357
358.S.o:
359	${_MKTARGET_COMPILE}
360	${COMPILE.S} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
361.if defined(CTFCONVERT)
362	${CTFCONVERT} ${CTFFLAGS} ${.TARGET}
363.endif
364	${OBJCOPY} -x ${.TARGET}
365
366.s.po:
367	${_MKTARGET_COMPILE}
368	${COMPILE.s} ${PROFFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
369.if defined(CTFCONVERT)
370	${CTFCONVERT} ${CTFFLAGS} ${.TARGET}
371.endif
372	${OBJCOPY} -X ${.TARGET}
373
374.S.po:
375	${_MKTARGET_COMPILE}
376	${COMPILE.S} ${PROFFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
377.if defined(CTFCONVERT)
378	${CTFCONVERT} ${CTFFLAGS} ${.TARGET}
379.endif
380	${OBJCOPY} -X ${.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.go:
387	${_MKTARGET_COMPILE}
388	${COMPILE.S} ${DEBUGFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
389
390.s.pico:
391	${_MKTARGET_COMPILE}
392	${COMPILE.s} ${CAPICFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
393	${OBJCOPY} -x ${.TARGET}
394
395.S.pico:
396	${_MKTARGET_COMPILE}
397	${COMPILE.S} ${CAPICFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
398	${OBJCOPY} -x ${.TARGET}
399
400.if defined(LIB)							# {
401.if (${MKPIC} == "no" || (defined(LDSTATIC) && ${LDSTATIC} != "") \
402	|| ${MKLINKLIB} != "no") && ${MKSTATICLIB} != "no"
403_LIBS=lib${LIB}.a
404.else
405_LIBS=
406.endif
407
408OBJS+=${SRCS:N*.h:N*.sh:R:S/$/.o/g}
409
410STOBJS+=${OBJS}
411
412LOBJS+=${LSRCS:.c=.ln} ${SRCS:M*.c:.c=.ln}
413
414.if ${LIBISPRIVATE} != "no"
415# No installation is required
416libinstall::
417.endif	# ${LIBISPRIVATE} == "no"					# {
418
419.if ${MKDEBUGLIB} != "no"
420_LIBS+=lib${LIB}_g.a
421GOBJS+=${OBJS:.o=.go}
422DEBUGFLAGS?=-DDEBUG
423.endif
424
425.if ${MKPROFILE} != "no"
426_LIBS+=lib${LIB}_p.a
427POBJS+=${OBJS:.o=.po}
428PROFFLAGS?=-DGPROF -DPROF
429.endif
430
431.if ${MKPIC} != "no"							# {
432.if ${MKPICLIB} == "no"
433.if ${MKSHLIBOBJS} != "no"
434# make _pic.a, which isn't really pic,
435# since it's needed for making shared lib.
436# but don't install it.
437SOLIB=lib${LIB}_pic.a
438SOBJS+=${OBJS:.o=.pico}
439.else
440SOLIB=lib${LIB}.a
441.endif
442.else
443SOLIB=lib${LIB}_pic.a
444_LIBS+=${SOLIB}
445SOBJS+=${OBJS:.o=.pico}
446.endif
447.if defined(SHLIB_FULLVERSION)
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}
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		-R${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.if ${OBJECT_FMT} == "ELF"
576#  We don't use INSTALL_SYMLINK here because this is just
577#  happening inside the build directory/objdir. XXX Why does
578#  this spend so much effort on libraries that aren't live??? XXX
579.if defined(SHLIB_FULLVERSION) && defined(SHLIB_MAJOR) && \
580    "${SHLIB_FULLVERSION}" != "${SHLIB_MAJOR}"
581	${HOST_LN} -sf lib${LIB}.so.${SHLIB_FULLVERSION} lib${LIB}.so.${SHLIB_MAJOR}.tmp
582	mv -f lib${LIB}.so.${SHLIB_MAJOR}.tmp lib${LIB}.so.${SHLIB_MAJOR}
583.endif
584	${HOST_LN} -sf lib${LIB}.so.${SHLIB_FULLVERSION} lib${LIB}.so.tmp
585	mv -f lib${LIB}.so.tmp lib${LIB}.so
586.endif
587.if ${MKSTRIPIDENT} != "no"
588	${OBJCOPY} -R .ident ${.TARGET}
589.endif
590
591.if !empty(LOBJS)							# {
592LLIBS?=		-lc
593llib-l${LIB}.ln: ${LOBJS}
594	${_MKTARGET_COMPILE}
595	rm -f llib-l${LIB}.ln
596.if defined(DESTDIR)
597	${LINT} -C${LIB} ${.ALLSRC} -L${DESTDIR}/usr/libdata ${LLIBS}
598.else
599	${LINT} -C${LIB} ${.ALLSRC} ${LLIBS}
600.endif
601.endif									# }
602
603lint: ${LOBJS}
604.if defined(LOBJS) && !empty(LOBJS)
605	${LINT} ${LINTFLAGS} ${LOBJS}
606.endif
607
608cleanlib: .PHONY
609	rm -f a.out [Ee]rrs mklog core *.core ${CLEANFILES}
610	rm -f lib${LIB}.a ${STOBJS}
611	rm -f lib${LIB}_p.a ${POBJS}
612	rm -f lib${LIB}_g.a ${GOBJS}
613	rm -f lib${LIB}_pic.a lib${LIB}.so.* lib${LIB}.so ${SOBJS}
614	rm -f ${STOBJS:=.tmp} ${POBJS:=.tmp} ${SOBJS:=.tmp} ${GOBJS:=.tmp}
615	rm -f llib-l${LIB}.ln ${LOBJS}
616
617
618.if !target(libinstall)							# {
619# Make sure it gets defined, in case MKPIC==no && MKLINKLIB==no
620libinstall::
621
622.if ${MKLINKLIB} != "no" && ${MKSTATICLIB} != "no"
623libinstall:: ${DESTDIR}${LIBDIR}/lib${LIB}.a
624.PRECIOUS: ${DESTDIR}${LIBDIR}/lib${LIB}.a
625
626.if ${MKUPDATE} == "no"
627.if !defined(BUILD) && !make(all) && !make(lib${LIB}.a)
628${DESTDIR}${LIBDIR}/lib${LIB}.a! .MADE
629.endif
630${DESTDIR}${LIBDIR}/lib${LIB}.a! lib${LIB}.a __archiveinstall
631.else
632.if !defined(BUILD) && !make(all) && !make(lib${LIB}.a)
633${DESTDIR}${LIBDIR}/lib${LIB}.a: .MADE
634.endif
635${DESTDIR}${LIBDIR}/lib${LIB}.a: lib${LIB}.a __archiveinstall
636.endif
637.endif
638
639.if ${MKPROFILE} != "no"
640libinstall:: ${DESTDIR}${LIBDIR}/lib${LIB}_p.a
641.PRECIOUS: ${DESTDIR}${LIBDIR}/lib${LIB}_p.a
642
643.if ${MKUPDATE} == "no"
644.if !defined(BUILD) && !make(all) && !make(lib${LIB}_p.a)
645${DESTDIR}${LIBDIR}/lib${LIB}_p.a! .MADE
646.endif
647${DESTDIR}${LIBDIR}/lib${LIB}_p.a! lib${LIB}_p.a __archiveinstall
648.else
649.if !defined(BUILD) && !make(all) && !make(lib${LIB}_p.a)
650${DESTDIR}${LIBDIR}/lib${LIB}_p.a: .MADE
651.endif
652${DESTDIR}${LIBDIR}/lib${LIB}_p.a: lib${LIB}_p.a __archiveinstall
653.endif
654.endif
655
656.if ${MKDEBUGLIB} != "no"
657libinstall:: ${DESTDIR}${LIBDIR}/lib${LIB}_g.a
658.PRECIOUS: ${DESTDIR}${LIBDIR}/lib${LIB}_g.a
659
660.if ${MKUPDATE} == "no"
661.if !defined(BUILD) && !make(all) && !make(lib${LIB}_g.a)
662${DESTDIR}${LIBDIR}/lib${LIB}_g.a! .MADE
663.endif
664${DESTDIR}${LIBDIR}/lib${LIB}_g.a! lib${LIB}_g.a __archiveinstall
665.else
666.if !defined(BUILD) && !make(all) && !make(lib${LIB}_g.a)
667${DESTDIR}${LIBDIR}/lib${LIB}_g.a: .MADE
668.endif
669${DESTDIR}${LIBDIR}/lib${LIB}_g.a: lib${LIB}_g.a __archiveinstall
670.endif
671.endif
672
673.if ${MKPIC} != "no" && ${MKPICINSTALL} != "no"
674libinstall:: ${DESTDIR}${LIBDIR}/lib${LIB}_pic.a
675.PRECIOUS: ${DESTDIR}${LIBDIR}/lib${LIB}_pic.a
676
677.if ${MKUPDATE} == "no"
678.if !defined(BUILD) && !make(all) && !make(lib${LIB}_pic.a)
679${DESTDIR}${LIBDIR}/lib${LIB}_pic.a! .MADE
680.endif
681.if ${MKPICLIB} == "no"
682${DESTDIR}${LIBDIR}/lib${LIB}_pic.a! lib${LIB}.a __archivesymlinkpic
683.else
684${DESTDIR}${LIBDIR}/lib${LIB}_pic.a! lib${LIB}_pic.a __archiveinstall
685.endif
686.else
687.if !defined(BUILD) && !make(all) && !make(lib${LIB}_pic.a)
688${DESTDIR}${LIBDIR}/lib${LIB}_pic.a: .MADE
689.endif
690.if ${MKPICLIB} == "no"
691${DESTDIR}${LIBDIR}/lib${LIB}_pic.a: lib${LIB}.a __archivesymlinkpic
692.else
693${DESTDIR}${LIBDIR}/lib${LIB}_pic.a: lib${LIB}_pic.a __archiveinstall
694.endif
695.endif
696.endif
697
698.if ${MKPIC} != "no" && defined(SHLIB_FULLVERSION)
699_LIB_SO_TGT=		${DESTDIR}${_LIBSODIR}/${_LIB_PREFIX}${LIB}.so
700_LIB_SO_TGTLIBDIR=	   ${DESTDIR}${LIBDIR}/${_LIB_PREFIX}${LIB}.so
701
702libinstall:: ${_LIB_SO_TGT}.${SHLIB_FULLVERSION}
703.PRECIOUS: ${_LIB_SO_TGT}.${SHLIB_FULLVERSION}
704
705.if ${MKUPDATE} == "no"
706.if !defined(BUILD) && !make(all) && !make(lib${LIB}.so.${SHLIB_FULLVERSION})
707${_LIB_SO_TGT}.${SHLIB_FULLVERSION}! .MADE
708.endif
709${_LIB_SO_TGT}.${SHLIB_FULLVERSION}! lib${LIB}.so.${SHLIB_FULLVERSION}
710.else
711.if !defined(BUILD) && !make(all) && !make(lib${LIB}.so.${SHLIB_FULLVERSION})
712${_LIB_SO_TGT}.${SHLIB_FULLVERSION}: .MADE
713.endif
714${_LIB_SO_TGT}.${SHLIB_FULLVERSION}: lib${LIB}.so.${SHLIB_FULLVERSION}
715.endif
716	${_MKTARGET_INSTALL}
717	${INSTALL_FILE} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
718		${.ALLSRC} ${.TARGET}
719.if ${_LIBSODIR} != ${LIBDIR}
720	${INSTALL_SYMLINK} -l r \
721		${_LIB_SO_TGT}.${SHLIB_FULLVERSION} \
722		${_LIB_SO_TGTLIBDIR}.${SHLIB_FULLVERSION}
723.endif
724.if ${OBJECT_FMT} == "a.out" && !defined(DESTDIR)
725	/sbin/ldconfig -m ${_LIBSODIR} ${LIBDIR}
726.endif
727.if ${OBJECT_FMT} == "ELF"
728.if defined(SHLIB_FULLVERSION) && defined(SHLIB_MAJOR) && \
729    "${SHLIB_FULLVERSION}" != "${SHLIB_MAJOR}"
730	${INSTALL_SYMLINK} \
731		${_LIB_PREFIX}${LIB}.so.${SHLIB_FULLVERSION} \
732		${_LIB_SO_TGT}.${SHLIB_MAJOR}
733.if ${_LIBSODIR} != ${LIBDIR}
734	${INSTALL_SYMLINK} -l r \
735		${_LIB_SO_TGT}.${SHLIB_FULLVERSION} \
736		${_LIB_SO_TGTLIBDIR}.${SHLIB_MAJOR}
737.endif
738.endif
739.if ${MKLINKLIB} != "no"
740	${INSTALL_SYMLINK} \
741		${_LIB_PREFIX}${LIB}.so.${SHLIB_FULLVERSION} \
742		${_LIB_SO_TGT}
743.if ${_LIBSODIR} != ${LIBDIR}
744	${INSTALL_SYMLINK} -l r \
745		${_LIB_SO_TGT}.${SHLIB_FULLVERSION} \
746		${_LIB_SO_TGTLIBDIR}
747.endif
748.endif
749.endif
750.endif
751
752.if ${MKLINT} != "no" && !empty(LOBJS)
753libinstall:: ${DESTDIR}${LINTLIBDIR}/llib-l${LIB}.ln
754.PRECIOUS: ${DESTDIR}${LINTLIBDIR}/llib-l${LIB}.ln
755
756.if ${MKUPDATE} == "no"
757.if !defined(BUILD) && !make(all) && !make(llib-l${LIB}.ln)
758${DESTDIR}${LINTLIBDIR}/llib-l${LIB}.ln! .MADE
759.endif
760${DESTDIR}${LINTLIBDIR}/llib-l${LIB}.ln! llib-l${LIB}.ln
761.else
762.if !defined(BUILD) && !make(all) && !make(llib-l${LIB}.ln)
763${DESTDIR}${LINTLIBDIR}/llib-l${LIB}.ln: .MADE
764.endif
765${DESTDIR}${LINTLIBDIR}/llib-l${LIB}.ln: llib-l${LIB}.ln
766.endif
767	${_MKTARGET_INSTALL}
768	${INSTALL_FILE} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
769		${.ALLSRC} ${DESTDIR}${LINTLIBDIR}
770.endif
771.endif	# !target(libinstall)						# }
772
773##### Pull in related .mk logic
774LINKSOWN?= ${LIBOWN}
775LINKSGRP?= ${LIBGRP}
776LINKSMODE?= ${LIBMODE}
777.include <bsd.man.mk>
778.include <bsd.nls.mk>
779.include <bsd.files.mk>
780.include <bsd.inc.mk>
781.include <bsd.links.mk>
782.include <bsd.dep.mk>
783
784${TARGETS}:	# ensure existence
785