xref: /netbsd-src/share/mk/bsd.lib.mk (revision 7f21db1c0118155e0dd40b75182e30c589d9f63e)
1#	$NetBSD: bsd.lib.mk,v 1.303 2010/01/25 00:43:00 christos 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 .so .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# .so is used for PIC object files.
134.SUFFIXES: .out .a .ln .so .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 .so 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 .so 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 .so 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.c.o:
220	${_MKTARGET_COMPILE}
221	${COMPILE.c} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
222.if !defined(CFLAGS) || empty(CFLAGS:M*-g*)
223	${OBJCOPY} -x ${.TARGET}
224.endif
225
226.c.po:
227	${_MKTARGET_COMPILE}
228	${COMPILE.c} ${PROFFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} -pg ${.IMPSRC} -o ${.TARGET}
229.if !defined(CFLAGS) || empty(CFLAGS:M*-g*)
230	${OBJCOPY} -X ${.TARGET}
231.endif
232
233.c.go:
234	${_MKTARGET_COMPILE}
235	${COMPILE.c} ${DEBUGFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} -g ${.IMPSRC} -o ${.TARGET}
236
237.c.so:
238	${_MKTARGET_COMPILE}
239	${COMPILE.c} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${CSHLIBFLAGS} ${.IMPSRC} -o ${.TARGET}
240.if !defined(CFLAGS) || empty(CFLAGS:M*-g*)
241	${OBJCOPY} -x ${.TARGET}
242.endif
243
244.cc.o .cpp.o .cxx.o .C.o:
245	${_MKTARGET_COMPILE}
246	${COMPILE.cc} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
247.if !defined(CFLAGS) || empty(CFLAGS:M*-g*)
248	${OBJCOPY} -x ${.TARGET}
249.endif
250
251.cc.po .cpp.po .cxx.po .C.po:
252	${_MKTARGET_COMPILE}
253	${COMPILE.cc} ${PROFFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} -pg ${.IMPSRC} -o ${.TARGET}
254.if !defined(CFLAGS) || empty(CFLAGS:M*-g*)
255	${OBJCOPY} -X ${.TARGET}
256.endif
257
258.cc.go .cpp.go .cxx.go .C.go:
259	${_MKTARGET_COMPILE}
260	${COMPILE.cc} ${DEBUGFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} -g ${.IMPSRC} -o ${.TARGET}
261
262.cc.so .cpp.so .cxx.so .C.so:
263	${_MKTARGET_COMPILE}
264	${COMPILE.cc} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${CSHLIBFLAGS} ${.IMPSRC} -o ${.TARGET}
265.if !defined(CFLAGS) || empty(CFLAGS:M*-g*)
266	${OBJCOPY} -x ${.TARGET}
267.endif
268
269.f.o:
270	${_MKTARGET_COMPILE}
271	${COMPILE.f} ${.IMPSRC} -o ${.TARGET}
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(FOPTS) || empty(FOPTS:M*-g*)
280	${OBJCOPY} -X ${.TARGET}
281.endif
282
283.f.go:
284	${_MKTARGET_COMPILE}
285	${COMPILE.f} ${DEBUGFLAGS} -g ${.IMPSRC} -o ${.TARGET}
286
287.f.so:
288	${_MKTARGET_COMPILE}
289	${COMPILE.f} ${FPICFLAGS} ${.IMPSRC} -o ${.TARGET}
290.if !defined(FOPTS) || empty(FOPTS:M*-g*)
291	${OBJCOPY} -x ${.TARGET}
292.endif
293
294.f.ln:
295	${_MKTARGET_COMPILE}
296	@echo Skipping lint for Fortran libraries.
297
298.m.o:
299	${_MKTARGET_COMPILE}
300	${COMPILE.m} ${OBJCOPTS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
301.if !defined(OBJCFLAGS) || empty(OBJCFLAGS:M*-g*)
302	${OBJCOPY} -x ${.TARGET}
303.endif
304
305.m.po:
306	${_MKTARGET_COMPILE}
307	${COMPILE.m} ${PROFFLAGS} -pg ${OBJCOPTS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
308.if !defined(OBJCFLAGS) || empty(OBJCFLAGS:M*-g*)
309	${OBJCOPY} -X ${.TARGET}
310.endif
311
312.m.go:
313	${_MKTARGET_COMPILE}
314	${COMPILE.m} ${DEBUGFLAGS} -g ${OBJCOPTS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
315.if !defined(OBJCFLAGS) || empty(OBJCFLAGS:M*-g*)
316	${OBJCOPY} -X ${.TARGET}
317.endif
318
319.m.so:
320	${_MKTARGET_COMPILE}
321	${COMPILE.m} ${CSHLIBFLAGS} ${OBJCOPTS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
322.if !defined(OBJCFLAGS) || empty(OBJCFLAGS:M*-g*)
323	${OBJCOPY} -x ${.TARGET}
324.endif
325
326.s.o:
327	${_MKTARGET_COMPILE}
328	${COMPILE.s} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
329	${OBJCOPY} -x ${.TARGET}
330
331.S.o:
332	${_MKTARGET_COMPILE}
333	${COMPILE.S} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
334	${OBJCOPY} -x ${.TARGET}
335
336.s.po:
337	${_MKTARGET_COMPILE}
338	${COMPILE.s} ${PROFFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
339	${OBJCOPY} -X ${.TARGET}
340
341.S.po:
342	${_MKTARGET_COMPILE}
343	${COMPILE.S} ${PROFFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
344	${OBJCOPY} -X ${.TARGET}
345
346.s.go:
347	${_MKTARGET_COMPILE}
348	${COMPILE.s} ${DEBUGFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
349
350.S.go:
351	${_MKTARGET_COMPILE}
352	${COMPILE.S} ${DEBUGFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
353
354.s.so:
355	${_MKTARGET_COMPILE}
356	${COMPILE.s} ${CAPICFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
357	${OBJCOPY} -x ${.TARGET}
358
359.S.so:
360	${_MKTARGET_COMPILE}
361	${COMPILE.S} ${CAPICFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
362	${OBJCOPY} -x ${.TARGET}
363
364.if defined(LIB)							# {
365.if (${MKPIC} == "no" || (defined(LDSTATIC) && ${LDSTATIC} != "") \
366	|| ${MKLINKLIB} != "no") && ${MKSTATICLIB} != "no"
367_LIBS=lib${LIB}.a
368.else
369_LIBS=
370.endif
371
372OBJS+=${SRCS:N*.h:N*.sh:R:S/$/.o/g}
373
374STOBJS+=${OBJS}
375
376LOBJS+=${LSRCS:.c=.ln} ${SRCS:M*.c:.c=.ln}
377
378.if ${LIBISPRIVATE} != "no"
379# No installation is required
380libinstall::
381.endif	# ${LIBISPRIVATE} == "no"					# {
382
383.if ${MKDEBUGLIB} != "no"
384_LIBS+=lib${LIB}_g.a
385GOBJS+=${OBJS:.o=.go}
386DEBUGFLAGS?=-DDEBUG
387.endif
388
389.if ${MKPROFILE} != "no"
390_LIBS+=lib${LIB}_p.a
391POBJS+=${OBJS:.o=.po}
392PROFFLAGS?=-DGPROF -DPROF
393.endif
394
395.if ${MKPIC} != "no"							# {
396.if ${MKPICLIB} == "no"
397.if ${MKSHLIBOBJS} != "no"
398# make _pic.a, which isn't really pic,
399# since it's needed for making shared lib.
400# but don't install it.
401SOLIB=lib${LIB}_pic.a
402SOBJS+=${OBJS:.o=.so}
403.else
404SOLIB=lib${LIB}.a
405.endif
406.else
407SOLIB=lib${LIB}_pic.a
408_LIBS+=${SOLIB}
409SOBJS+=${OBJS:.o=.so}
410.endif
411.if defined(SHLIB_FULLVERSION)
412_LIBS+=lib${LIB}.so.${SHLIB_FULLVERSION}
413.endif
414.endif									# }
415
416.if ${MKLINT} != "no" && !empty(LOBJS)
417_LIBS+=llib-l${LIB}.ln
418.endif
419
420ALLOBJS=
421.if (${MKPIC} == "no" || (defined(LDSTATIC) && ${LDSTATIC} != "") \
422	|| ${MKLINKLIB} != "no") && ${MKSTATICLIB} != "no"
423ALLOBJS+=${STOBJS}
424.endif
425ALLOBJS+=${POBJS} ${SOBJS}
426.if ${MKLINT} != "no" && !empty(LOBJS)
427ALLOBJS+=${LOBJS}
428.endif
429.else	# !defined(LIB)							# } {
430LOBJS=
431SOBJS=
432.endif	# !defined(LIB)							# }
433
434_YLSRCS=	${SRCS:M*.[ly]:C/\..$/.c/} ${YHEADER:D${SRCS:M*.y:.y=.h}}
435
436.NOPATH: ${ALLOBJS} ${_LIBS} ${_YLSRCS}
437
438realall: ${SRCS} ${ALLOBJS:O} ${_LIBS}
439
440MKARZERO?=no
441
442.if ${MKARZERO} == "yes"
443_ARFL=crsD
444_ARRANFL=sD
445_INSTRANLIB=
446.else
447_ARFL=crs
448_ARRANFL=s
449_INSTRANLIB=${empty(PRESERVE):?-a "${RANLIB} -t":}
450.endif
451
452# If you change this, please consider reflecting the change in
453# the override in sys/rump/Makefile.rump.
454.if !target(__archivebuild)
455__archivebuild: .USE
456	${_MKTARGET_BUILD}
457	rm -f ${.TARGET}
458	${AR} ${_ARFL} ${.TARGET} `NM=${NM} ${LORDER} ${.ALLSRC:M*o} | ${TSORT}`
459.endif
460
461.if !target(__archiveinstall)
462__archiveinstall: .USE
463	${_MKTARGET_INSTALL}
464	${INSTALL_FILE} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
465	    ${_INSTRANLIB} ${.ALLSRC} ${.TARGET}
466.endif
467
468__archivesymlinkpic: .USE
469	${_MKTARGET_INSTALL}
470	${INSTALL_SYMLINK} ${.ALLSRC} ${.TARGET}
471
472DPSRCS+=	${_YLSRCS}
473CLEANFILES+=	${_YLSRCS}
474
475${STOBJS} ${POBJS} ${GOBJS} ${SOBJS} ${LOBJS}: ${DPSRCS}
476
477lib${LIB}.a:: ${STOBJS} __archivebuild
478
479lib${LIB}_p.a:: ${POBJS} __archivebuild
480
481lib${LIB}_pic.a:: ${SOBJS} __archivebuild
482
483lib${LIB}_g.a:: ${GOBJS} __archivebuild
484
485
486_LIBLDOPTS=
487.if ${SHLIBDIR} != "/usr/lib"
488_LIBLDOPTS+=	-Wl,-rpath-link,${DESTDIR}${SHLIBDIR}:${DESTDIR}/usr/lib \
489		-R${SHLIBDIR} \
490		-L${DESTDIR}${SHLIBDIR}
491.elif ${SHLIBINSTALLDIR} != "/usr/lib"
492_LIBLDOPTS+=	-Wl,-rpath-link,${DESTDIR}${SHLIBINSTALLDIR}:${DESTDIR}/usr/lib \
493		-L${DESTDIR}${SHLIBINSTALLDIR}
494.endif
495
496# gcc -shared now adds -lc automatically. For libraries other than libc and
497# libgcc* we add as a dependency the installed shared libc. For libc and
498# libgcc* we avoid adding libc as a dependency by using -nostdlib. Note that
499# -Xl,-nostdlib is not enough because we want to tell the compiler-driver not
500# to add standard libraries, not the linker.
501.if !defined(LIB)
502DPLIBC ?= ${DESTDIR}${LIBC_SO}
503.else
504.if ${LIB} != "c" && ${LIB:Mgcc*} == ""
505DPLIBC ?= ${DESTDIR}${LIBC_SO}
506.else
507LDLIBC ?= -nodefaultlibs
508.if ${LIB} == "c"
509LDADD+= -lgcc_pic
510.endif
511.endif
512.endif
513
514.if ${LIBISCXX} != "no"
515LIBCC:=	${CXX}
516.else
517LIBCC:=	${CC}
518.endif
519
520_LDADD.lib${LIB}=	${LDADD} ${LDADD.lib${LIB}}
521_LDFLAGS.lib${LIB}=	${LDFLAGS} ${LDFLAGS.lib${LIB}}
522
523lib${LIB}.so.${SHLIB_FULLVERSION}: ${SOLIB} ${DPADD} ${DPLIBC} \
524    ${SHLIB_LDSTARTFILE} ${SHLIB_LDENDFILE}
525	${_MKTARGET_BUILD}
526	rm -f lib${LIB}.so.${SHLIB_FULLVERSION}
527.if defined(DESTDIR)
528	${LIBCC} ${LDLIBC} -Wl,-nostdlib -B${_GCC_CRTDIR}/ -B${DESTDIR}${SHLIBDIR}/ \
529	    -Wl,-x -shared ${SHLIB_SHFLAGS} -o ${.TARGET} \
530	    -Wl,--whole-archive ${SOLIB} \
531	    -Wl,--no-whole-archive ${_LDADD.lib${LIB}} \
532	    ${_LIBLDOPTS} ${_LDFLAGS.lib${LIB}} \
533	    -L${_GCC_LIBGCCDIR}
534.else
535	${LIBCC} ${LDLIBC} -Wl,-x -shared ${SHLIB_SHFLAGS} ${_LDFLAGS.lib${LIB}} \
536	    -o ${.TARGET} ${_LIBLDOPTS} \
537	    -Wl,--whole-archive ${SOLIB} -Wl,--no-whole-archive ${_LDADD.lib${LIB}}
538.endif
539.if ${OBJECT_FMT} == "ELF"
540#  We don't use INSTALL_SYMLINK here because this is just
541#  happening inside the build directory/objdir. XXX Why does
542#  this spend so much effort on libraries that aren't live??? XXX
543.if defined(SHLIB_FULLVERSION) && defined(SHLIB_MAJOR) && \
544    "${SHLIB_FULLVERSION}" != "${SHLIB_MAJOR}"
545	${HOST_LN} -sf lib${LIB}.so.${SHLIB_FULLVERSION} lib${LIB}.so.${SHLIB_MAJOR}.tmp
546	mv -f lib${LIB}.so.${SHLIB_MAJOR}.tmp lib${LIB}.so.${SHLIB_MAJOR}
547.endif
548	${HOST_LN} -sf lib${LIB}.so.${SHLIB_FULLVERSION} lib${LIB}.so.tmp
549	mv -f lib${LIB}.so.tmp lib${LIB}.so
550.endif
551.if ${MKSTRIPIDENT} != "no"
552	${OBJCOPY} -R .ident ${.TARGET}
553.endif
554
555.if !empty(LOBJS)							# {
556LLIBS?=		-lc
557llib-l${LIB}.ln: ${LOBJS}
558	${_MKTARGET_COMPILE}
559	rm -f llib-l${LIB}.ln
560.if defined(DESTDIR)
561	${LINT} -C${LIB} ${.ALLSRC} -L${DESTDIR}/usr/libdata ${LLIBS}
562.else
563	${LINT} -C${LIB} ${.ALLSRC} ${LLIBS}
564.endif
565.endif									# }
566
567lint: ${LOBJS}
568.if defined(LOBJS) && !empty(LOBJS)
569	${LINT} ${LINTFLAGS} ${LOBJS}
570.endif
571
572cleanlib: .PHONY
573	rm -f a.out [Ee]rrs mklog core *.core ${CLEANFILES}
574	rm -f lib${LIB}.a ${STOBJS}
575	rm -f lib${LIB}_p.a ${POBJS}
576	rm -f lib${LIB}_g.a ${GOBJS}
577	rm -f lib${LIB}_pic.a lib${LIB}.so.* lib${LIB}.so ${SOBJS}
578	rm -f ${STOBJS:=.tmp} ${POBJS:=.tmp} ${SOBJS:=.tmp} ${GOBJS:=.tmp}
579	rm -f llib-l${LIB}.ln ${LOBJS}
580
581
582.if !target(libinstall)							# {
583# Make sure it gets defined, in case MKPIC==no && MKLINKLIB==no
584libinstall::
585
586.if ${MKLINKLIB} != "no" && ${MKSTATICLIB} != "no"
587libinstall:: ${DESTDIR}${LIBDIR}/lib${LIB}.a
588.PRECIOUS: ${DESTDIR}${LIBDIR}/lib${LIB}.a
589
590.if ${MKUPDATE} == "no"
591.if !defined(BUILD) && !make(all) && !make(lib${LIB}.a)
592${DESTDIR}${LIBDIR}/lib${LIB}.a! .MADE
593.endif
594${DESTDIR}${LIBDIR}/lib${LIB}.a! lib${LIB}.a __archiveinstall
595.else
596.if !defined(BUILD) && !make(all) && !make(lib${LIB}.a)
597${DESTDIR}${LIBDIR}/lib${LIB}.a: .MADE
598.endif
599${DESTDIR}${LIBDIR}/lib${LIB}.a: lib${LIB}.a __archiveinstall
600.endif
601.endif
602
603.if ${MKPROFILE} != "no"
604libinstall:: ${DESTDIR}${LIBDIR}/lib${LIB}_p.a
605.PRECIOUS: ${DESTDIR}${LIBDIR}/lib${LIB}_p.a
606
607.if ${MKUPDATE} == "no"
608.if !defined(BUILD) && !make(all) && !make(lib${LIB}_p.a)
609${DESTDIR}${LIBDIR}/lib${LIB}_p.a! .MADE
610.endif
611${DESTDIR}${LIBDIR}/lib${LIB}_p.a! lib${LIB}_p.a __archiveinstall
612.else
613.if !defined(BUILD) && !make(all) && !make(lib${LIB}_p.a)
614${DESTDIR}${LIBDIR}/lib${LIB}_p.a: .MADE
615.endif
616${DESTDIR}${LIBDIR}/lib${LIB}_p.a: lib${LIB}_p.a __archiveinstall
617.endif
618.endif
619
620.if ${MKDEBUGLIB} != "no"
621libinstall:: ${DESTDIR}${LIBDIR}/lib${LIB}_g.a
622.PRECIOUS: ${DESTDIR}${LIBDIR}/lib${LIB}_g.a
623
624.if ${MKUPDATE} == "no"
625.if !defined(BUILD) && !make(all) && !make(lib${LIB}_g.a)
626${DESTDIR}${LIBDIR}/lib${LIB}_g.a! .MADE
627.endif
628${DESTDIR}${LIBDIR}/lib${LIB}_g.a! lib${LIB}_g.a __archiveinstall
629.else
630.if !defined(BUILD) && !make(all) && !make(lib${LIB}_g.a)
631${DESTDIR}${LIBDIR}/lib${LIB}_g.a: .MADE
632.endif
633${DESTDIR}${LIBDIR}/lib${LIB}_g.a: lib${LIB}_g.a __archiveinstall
634.endif
635.endif
636
637.if ${MKPIC} != "no" && ${MKPICINSTALL} != "no"
638libinstall:: ${DESTDIR}${LIBDIR}/lib${LIB}_pic.a
639.PRECIOUS: ${DESTDIR}${LIBDIR}/lib${LIB}_pic.a
640
641.if ${MKUPDATE} == "no"
642.if !defined(BUILD) && !make(all) && !make(lib${LIB}_pic.a)
643${DESTDIR}${LIBDIR}/lib${LIB}_pic.a! .MADE
644.endif
645.if ${MKPICLIB} == "no"
646${DESTDIR}${LIBDIR}/lib${LIB}_pic.a! lib${LIB}.a __archivesymlinkpic
647.else
648${DESTDIR}${LIBDIR}/lib${LIB}_pic.a! lib${LIB}_pic.a __archiveinstall
649.endif
650.else
651.if !defined(BUILD) && !make(all) && !make(lib${LIB}_pic.a)
652${DESTDIR}${LIBDIR}/lib${LIB}_pic.a: .MADE
653.endif
654.if ${MKPICLIB} == "no"
655${DESTDIR}${LIBDIR}/lib${LIB}_pic.a: lib${LIB}.a __archivesymlinkpic
656.else
657${DESTDIR}${LIBDIR}/lib${LIB}_pic.a: lib${LIB}_pic.a __archiveinstall
658.endif
659.endif
660.endif
661
662.if ${MKPIC} != "no" && defined(SHLIB_FULLVERSION)
663_LIB_SO_TGT=		${DESTDIR}${_LIBSODIR}/${_LIB_PREFIX}${LIB}.so
664_LIB_SO_TGTLIBDIR=	   ${DESTDIR}${LIBDIR}/${_LIB_PREFIX}${LIB}.so
665
666libinstall:: ${_LIB_SO_TGT}.${SHLIB_FULLVERSION}
667.PRECIOUS: ${_LIB_SO_TGT}.${SHLIB_FULLVERSION}
668
669.if ${MKUPDATE} == "no"
670.if !defined(BUILD) && !make(all) && !make(lib${LIB}.so.${SHLIB_FULLVERSION})
671${_LIB_SO_TGT}.${SHLIB_FULLVERSION}! .MADE
672.endif
673${_LIB_SO_TGT}.${SHLIB_FULLVERSION}! lib${LIB}.so.${SHLIB_FULLVERSION}
674.else
675.if !defined(BUILD) && !make(all) && !make(lib${LIB}.so.${SHLIB_FULLVERSION})
676${_LIB_SO_TGT}.${SHLIB_FULLVERSION}: .MADE
677.endif
678${_LIB_SO_TGT}.${SHLIB_FULLVERSION}: lib${LIB}.so.${SHLIB_FULLVERSION}
679.endif
680	${_MKTARGET_INSTALL}
681	${INSTALL_FILE} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
682		${.ALLSRC} ${.TARGET}
683.if ${_LIBSODIR} != ${LIBDIR}
684	${INSTALL_SYMLINK} -l r \
685		${_LIB_SO_TGT}.${SHLIB_FULLVERSION} \
686		${_LIB_SO_TGTLIBDIR}.${SHLIB_FULLVERSION}
687.endif
688.if ${OBJECT_FMT} == "a.out" && !defined(DESTDIR)
689	/sbin/ldconfig -m ${_LIBSODIR} ${LIBDIR}
690.endif
691.if ${OBJECT_FMT} == "ELF"
692.if defined(SHLIB_FULLVERSION) && defined(SHLIB_MAJOR) && \
693    "${SHLIB_FULLVERSION}" != "${SHLIB_MAJOR}"
694	${INSTALL_SYMLINK} \
695		${_LIB_PREFIX}${LIB}.so.${SHLIB_FULLVERSION} \
696		${_LIB_SO_TGT}.${SHLIB_MAJOR}
697.if ${_LIBSODIR} != ${LIBDIR}
698	${INSTALL_SYMLINK} -l r \
699		${_LIB_SO_TGT}.${SHLIB_FULLVERSION} \
700		${_LIB_SO_TGTLIBDIR}.${SHLIB_MAJOR}
701.endif
702.endif
703.if ${MKLINKLIB} != "no"
704	${INSTALL_SYMLINK} \
705		${_LIB_PREFIX}${LIB}.so.${SHLIB_FULLVERSION} \
706		${_LIB_SO_TGT}
707.if ${_LIBSODIR} != ${LIBDIR}
708	${INSTALL_SYMLINK} -l r \
709		${_LIB_SO_TGT}.${SHLIB_FULLVERSION} \
710		${_LIB_SO_TGTLIBDIR}
711.endif
712.endif
713.endif
714.endif
715
716.if ${MKLINT} != "no" && !empty(LOBJS)
717libinstall:: ${DESTDIR}${LINTLIBDIR}/llib-l${LIB}.ln
718.PRECIOUS: ${DESTDIR}${LINTLIBDIR}/llib-l${LIB}.ln
719
720.if ${MKUPDATE} == "no"
721.if !defined(BUILD) && !make(all) && !make(llib-l${LIB}.ln)
722${DESTDIR}${LINTLIBDIR}/llib-l${LIB}.ln! .MADE
723.endif
724${DESTDIR}${LINTLIBDIR}/llib-l${LIB}.ln! llib-l${LIB}.ln
725.else
726.if !defined(BUILD) && !make(all) && !make(llib-l${LIB}.ln)
727${DESTDIR}${LINTLIBDIR}/llib-l${LIB}.ln: .MADE
728.endif
729${DESTDIR}${LINTLIBDIR}/llib-l${LIB}.ln: llib-l${LIB}.ln
730.endif
731	${_MKTARGET_INSTALL}
732	${INSTALL_FILE} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
733		${.ALLSRC} ${DESTDIR}${LINTLIBDIR}
734.endif
735.endif	# !target(libinstall)						# }
736
737##### Pull in related .mk logic
738LINKSOWN?= ${LIBOWN}
739LINKSGRP?= ${LIBGRP}
740LINKSMODE?= ${LIBMODE}
741.include <bsd.man.mk>
742.include <bsd.nls.mk>
743.include <bsd.files.mk>
744.include <bsd.inc.mk>
745.include <bsd.links.mk>
746.include <bsd.dep.mk>
747
748${TARGETS}:	# ensure existence
749