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