1#	$NetBSD: bsd.lib.mk,v 1.367 2016/03/12 23:08:58 mrg 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.if ${LIBISMODULE} != "no"
15_LIB_PREFIX?=	# empty
16MKDEBUGLIB:=	no
17MKLINT:=	no
18MKPICINSTALL:=	no
19MKPROFILE:=	no
20MKSTATICLIB:=	no
21.else
22_LIB_PREFIX?=	lib
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
40
41##### LIB specific flags.
42# XXX: This is needed for programs that link with .a libraries
43# Perhaps a more correct solution is to always generate _pic.a
44# files or always have a shared library.
45# XXX: This breaks profiling (__mcount relocation is wrong)
46.if defined(MKPIE) && (${MKPIE} != "no") && !defined(NOPIE)
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
58.if ${LIBDO.${_lib}} == "_external"
59LDADD+=		-l${_lib}
60.else
61LDADD+=		-L${LIBDO.${_lib}} -l${_lib}
62DPADD+=		${LIBDO.${_lib}}/lib${_lib}.so	# Don't use _LIB_PREFIX
63.endif
64.endfor
65.endif									# }
66
67##### Build and install rules
68MKDEP_SUFFIXES?=	.o .po .pico .go .ln .d
69
70.if !defined(SHLIB_MAJOR) && exists(${SHLIB_VERSION_FILE})		# {
71SHLIB_MAJOR != . ${SHLIB_VERSION_FILE} ; echo $$major
72SHLIB_MINOR != . ${SHLIB_VERSION_FILE} ; echo $$minor
73SHLIB_TEENY != . ${SHLIB_VERSION_FILE} ; echo $$teeny
74
75DPADD+=	${SHLIB_VERSION_FILE}
76
77# Check for higher installed library versions.
78.if !defined(NOCHECKVER) && !defined(NOCHECKVER_${LIB}) && \
79	exists(${NETBSDSRCDIR}/lib/checkver)
80checkver:
81	@(cd "${.CURDIR}" && \
82	    HOST_SH=${HOST_SH:Q} AWK=${TOOL_AWK:Q} \
83	    ${HOST_SH} ${NETBSDSRCDIR}/lib/checkver -v ${SHLIB_VERSION_FILE} \
84		    -d ${_DEST.OBJ} ${LIB})
85.endif
86.endif									# }
87
88.if !target(checkver)
89checkver:
90.endif
91
92print-shlib-major:
93.if defined(SHLIB_MAJOR) && ${MKPIC} != "no"
94	@echo ${SHLIB_MAJOR}
95.else
96	@false
97.endif
98
99print-shlib-minor:
100.if defined(SHLIB_MINOR) && ${MKPIC} != "no"
101	@echo ${SHLIB_MINOR}
102.else
103	@false
104.endif
105
106print-shlib-teeny:
107.if defined(SHLIB_TEENY) && ${MKPIC} != "no"
108	@echo ${SHLIB_TEENY}
109.else
110	@false
111.endif
112
113.if defined(SHLIB_MAJOR) && !empty(SHLIB_MAJOR)				# {
114.if defined(SHLIB_MINOR) && !empty(SHLIB_MINOR)
115.if defined(SHLIB_TEENY) && !empty(SHLIB_TEENY)
116SHLIB_FULLVERSION=${SHLIB_MAJOR}.${SHLIB_MINOR}.${SHLIB_TEENY}
117.else
118SHLIB_FULLVERSION=${SHLIB_MAJOR}.${SHLIB_MINOR}
119.endif
120.else
121SHLIB_FULLVERSION=${SHLIB_MAJOR}
122.endif
123.endif									# }
124
125# add additional suffixes not exported.
126# .po is used for profiling object files.
127# .pico is used for PIC object files.
128.SUFFIXES: .out .a .ln .pico .po .go .o .s .S .c .cc .cpp .cxx .C .m .F .f .r .y .l .cl .p .h
129.SUFFIXES: .sh .m4 .m
130
131
132# Set PICFLAGS to cc flags for producing position-independent code,
133# if not already set.
134
135# Data-driven table using make variables to control how shared libraries
136# are built for different platforms and object formats.
137# SHLIB_MAJOR, SHLIB_MINOR, SHLIB_TEENY: Major, minor, and teeny version
138#			numbers of shared library
139# SHLIB_SOVERSION:	version number to be compiled into a shared library
140#			via -soname. Usualy ${SHLIB_MAJOR} on ELF.
141#			NetBSD/pmax used to use ${SHLIB_MAJOR}[.${SHLIB_MINOR}
142#			[.${SHLIB_TEENY}]]
143# SHLIB_SHFLAGS:	Flags to tell ${LD} to emit shared library.
144#			with ELF, also set shared-lib version for ld.so.
145# SHLIB_LDSTARTFILE:	support .o file, call C++ file-level constructors
146# SHLIB_LDENDFILE:	support .o file, call C++ file-level destructors
147
148PICFLAGS ?= -fPIC
149
150.if ${MKPICLIB} != "no"
151CSHLIBFLAGS+= ${PICFLAGS}
152.endif
153
154.if defined(CSHLIBFLAGS) && !empty(CSHLIBFLAGS)
155MKSHLIBOBJS= yes
156.else
157MKSHLIBOBJS= no
158.endif
159
160.if (${MKDEBUG:Uno} != "no" && !defined(NODEBUG)) || \
161    (defined(CFLAGS) && !empty(CFLAGS:M*-g*))
162# We only add -g to the shared library objects
163# because we don't currently split .a archives.
164CSHLIBFLAGS+=	-g
165.if ${LIBISPRIVATE} == "yes"
166CFLAGS+=	-g
167.endif
168.endif
169
170# Platform-independent linker flags for ELF shared libraries
171SHLIB_SOVERSION=	${SHLIB_MAJOR}
172SHLIB_SHFLAGS=		-Wl,-soname,${_LIB}.so.${SHLIB_SOVERSION}
173.if !defined(SHLIB_WARNTEXTREL) || ${SHLIB_WARNTEXTREL} != "no"
174SHLIB_SHFLAGS+=		-Wl,--warn-shared-textrel
175.endif
176.if !defined(SHLIB_MKMAP) || ${SHLIB_MKMAP} != "no"
177SHLIB_SHFLAGS+=		-Wl,-Map=${_LIB}.so.${SHLIB_SOVERSION}.map
178.endif
179CLEANFILES+=		${_LIB}.so.${SHLIB_SOVERSION}.map
180SHLIB_LDSTARTFILE?=	${_GCC_CRTI} ${_GCC_CRTBEGINS}
181SHLIB_LDENDFILE?=	${_GCC_CRTENDS} ${_GCC_CRTN}
182
183CFLAGS+=	${COPTS}
184OBJCFLAGS+=	${OBJCOPTS}
185AFLAGS+=	${COPTS}
186FFLAGS+=	${FOPTS}
187
188.if defined(CTFCONVERT)
189.if defined(CFLAGS) && !empty(CFLAGS:M*-g*)
190CTFFLAGS+=	-g
191.if defined(HAVE_GCC)
192#CFLAGS+=	-gdwarf-2
193.endif
194.endif
195.endif
196
197LIBSTRIPAOBJS=	yes
198.if !defined(CFLAGS) || empty(CFLAGS:M*-g*)
199LIBSTRIPCOBJS=	yes
200.endif
201.if !defined(OBJCFLAGS) || empty(OBJCFLAGS:M*-g*)
202LIBSTRIPOBJCOBJS=	yes
203.endif
204.if !defined(FFLAGS) || empty(FFLAGS:M*-g*)
205LIBSTRIPFOBJS=	yes
206.endif
207.if !defined(CSHLIBFLAGS) || empty(CSHLIBFLAGS:M*-g*)
208LIBSTRIPSHLIBOBJS=	yes
209.endif
210
211.c.o:
212	${_MKTARGET_COMPILE}
213	${COMPILE.c} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
214.if defined(CTFCONVERT)
215	${CTFCONVERT} ${CTFFLAGS} ${.TARGET}
216.endif
217.if defined(LIBSTRIPCOBJS)
218	${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET}
219.endif
220
221.c.po:
222	${_MKTARGET_COMPILE}
223	${COMPILE.c} ${PROFFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} -pg ${.IMPSRC} -o ${.TARGET}
224.if defined(CTFCONVERT)
225	${CTFCONVERT} ${CTFFLAGS} ${.TARGET}
226.endif
227.if defined(LIBSTRIPCOBJS)
228	${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET}
229.endif
230
231.c.go:
232	${_MKTARGET_COMPILE}
233	${COMPILE.c} ${DEBUGFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} -g ${.IMPSRC} -o ${.TARGET}
234
235.c.pico:
236	${_MKTARGET_COMPILE}
237	${COMPILE.c} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${CSHLIBFLAGS} ${.IMPSRC} -o ${.TARGET}
238.if defined(LIBSTRIPSHLIBOBJS)
239	${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET}
240.endif
241
242.cc.o .cpp.o .cxx.o .C.o:
243	${_MKTARGET_COMPILE}
244	${COMPILE.cc} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
245.if defined(LIBSTRIPCOBJS)
246	${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET}
247.endif
248
249.cc.po .cpp.po .cxx.po .C.po:
250	${_MKTARGET_COMPILE}
251	${COMPILE.cc} ${PROFFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} -pg ${.IMPSRC} -o ${.TARGET}
252.if defined(LIBSTRIPCOBJS)
253	${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET}
254.endif
255
256.cc.go .cpp.go .cxx.go .C.go:
257	${_MKTARGET_COMPILE}
258	${COMPILE.cc} ${DEBUGFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} -g ${.IMPSRC} -o ${.TARGET}
259
260.cc.pico .cpp.pico .cxx.pico .C.pico:
261	${_MKTARGET_COMPILE}
262	${COMPILE.cc} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${CSHLIBFLAGS} ${.IMPSRC} -o ${.TARGET}
263.if defined(LIBSTRIPSHLIBOBJS)
264	${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET}
265.endif
266
267.f.o:
268	${_MKTARGET_COMPILE}
269	${COMPILE.f} ${.IMPSRC} -o ${.TARGET}
270.if defined(CTFCONVERT)
271	${CTFCONVERT} ${CTFFLAGS} ${.TARGET}
272.endif
273.if defined(LIBSTRIPFOBJS)
274	${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET}
275.endif
276
277.f.po:
278	${_MKTARGET_COMPILE}
279	${COMPILE.f} ${PROFFLAGS} -pg ${.IMPSRC} -o ${.TARGET}
280.if defined(CTFCONVERT)
281	${CTFCONVERT} ${CTFFLAGS} ${.TARGET}
282.endif
283.if defined(LIBSTRIPFOBJS)
284	${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET}
285.endif
286
287.f.go:
288	${_MKTARGET_COMPILE}
289	${COMPILE.f} ${DEBUGFLAGS} -g ${.IMPSRC} -o ${.TARGET}
290
291.f.pico:
292	${_MKTARGET_COMPILE}
293	${COMPILE.f} ${PICFLAGS} ${.IMPSRC} -o ${.TARGET}
294.if defined(LIBSTRIPFOBJS)
295	${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET}
296.endif
297
298.f.ln:
299	${_MKTARGET_COMPILE}
300	@echo Skipping lint for Fortran libraries.
301
302.m.o:
303	${_MKTARGET_COMPILE}
304	${COMPILE.m} ${OBJCOPTS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
305.if defined(CTFCONVERT)
306	${CTFCONVERT} ${CTFFLAGS} ${.TARGET}
307.endif
308.if defined(LIBSTRIPOBJCOBJS)
309	${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET}
310.endif
311
312.m.po:
313	${_MKTARGET_COMPILE}
314	${COMPILE.m} ${PROFFLAGS} -pg ${OBJCOPTS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
315.if defined(CTFCONVERT)
316	${CTFCONVERT} ${CTFFLAGS} ${.TARGET}
317.endif
318.if defined(LIBSTRIPOBJCOBJS)
319	${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET}
320.endif
321
322.m.go:
323	${_MKTARGET_COMPILE}
324	${COMPILE.m} ${DEBUGFLAGS} -g ${OBJCOPTS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
325.if defined(LIBSTRIPOBJCOBJS)
326	${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET}
327.endif
328
329.m.pico:
330	${_MKTARGET_COMPILE}
331	${COMPILE.m} ${CSHLIBFLAGS} ${OBJCOPTS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
332.if defined(LIBSTRIPOBJCOBJS)
333	${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET}
334.endif
335
336.s.o:
337	${_MKTARGET_COMPILE}
338	${COMPILE.s} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
339.if defined(CTFCONVERT)
340	${CTFCONVERT} ${CTFFLAGS} ${.TARGET}
341.endif
342.if defined(LIBSTRIPAOBJS)
343	${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.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.if defined(LIBSTRIPAOBJS)
353	${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET}
354.endif
355
356.s.po:
357	${_MKTARGET_COMPILE}
358	${COMPILE.s} ${PROFFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
359.if defined(CTFCONVERT)
360	${CTFCONVERT} ${CTFFLAGS} ${.TARGET}
361.endif
362.if defined(LIBSTRIPAOBJS)
363	${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET}
364.endif
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.if defined(LIBSTRIPAOBJS)
373	${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET}
374.endif
375
376.s.go:
377	${_MKTARGET_COMPILE}
378	${COMPILE.s} ${DEBUGFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
379
380.S.go:
381	${_MKTARGET_COMPILE}
382	${COMPILE.S} ${DEBUGFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
383
384.s.pico:
385	${_MKTARGET_COMPILE}
386	${COMPILE.s} ${PICFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
387.if defined(LIBSTRIPAOBJS)
388	${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET}
389.endif
390
391.S.pico:
392	${_MKTARGET_COMPILE}
393	${COMPILE.S} ${PICFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
394.if defined(LIBSTRIPAOBJS)
395	${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET}
396.endif
397
398# Declare a few variables to make our life easier later.
399_LIB:=${_LIB_PREFIX}${LIB}
400_LIB.a:=${_LIB}.a
401_LIB_p.a:=${_LIB}_p.a
402_LIB_g.a:=${_LIB}_g.a
403_LIB_pic.a:=${_LIB}_pic.a
404_LIB.ln:=llib-l${LIB}.ln
405
406.if ${MKPIC} != "no" && defined(SHLIB_FULLVERSION)
407_LIB.so:=${_LIB}.so
408_LIB.so.major:=${_LIB}.so.${SHLIB_MAJOR}
409_LIB.so.full:=${_LIB}.so.${SHLIB_FULLVERSION}
410_LIB.so.link:=${_LIB}.so.${SHLIB_FULLVERSION}.link
411.if ${MKDEBUG:Uno} != "no" && !defined(NODEBUG)
412_LIB.so.debug:=${_LIB.so.full}.debug
413.endif
414.endif
415
416_DEST.LIB:=${DESTDIR}${LIBDIR}
417_DEST.OBJ:=${DESTDIR}${_LIBSODIR}
418_DEST.LINT:=${DESTDIR}${LINTLIBDIR}
419_DEST.DEBUG:=${DESTDIR}${DEBUGDIR}${LIBDIR}
420_DEST.ODEBUG:=${DESTDIR}${DEBUGDIR}${_LIBSODIR}
421
422.if defined(LIB)							# {
423.if (${MKPIC} == "no" || (defined(LDSTATIC) && ${LDSTATIC} != "") \
424	|| ${MKLINKLIB} != "no") && ${MKSTATICLIB} != "no"
425_LIBS=${_LIB.a}
426.else
427_LIBS=
428.endif
429
430.if ${LIBISPRIVATE} != "no" \
431   && (defined(USE_COMBINE) && ${USE_COMBINE} == "yes" \
432   && !defined(NOCOMBINE))						# {
433.for f in ${SRCS:N*.h:N*.sh:C/\.[yl]$/.c/g}
434COMBINEFLAGS.${LIB}.$f := ${CPPFLAGS.$f:D1} ${CPUFLAGS.$f:D2} ${COPTS.$f:D3} ${OBJCOPTS.$f:D4} ${CXXFLAGS.$f:D5}
435.if empty(COMBINEFLAGS.${LIB}.${f}) && !defined(NOCOMBINE.$f)
436COMBINESRCS+=	${f}
437NODPSRCS+=	${f}
438.else
439OBJS+=  	${f:R:S/$/.o/}
440.endif
441.endfor
442
443.if !empty(COMBINESRCS)
444OBJS+=		${_LIB}_combine.o
445${_LIB}_combine.o: ${COMBINESRCS}
446	${_MKTARGET_COMPILE}
447	${COMPILE.c} -MD --combine ${.ALLSRC} -o ${.TARGET}
448.if defined(LIBSTRIPOBJS)
449	${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET}
450.endif
451
452CLEANFILES+=	${_LIB}_combine.d
453
454.if exists("${_LIB}_combine.d")
455.include "${_LIB}_combine.d"
456.endif
457.endif   # empty(XSRCS.${LIB})
458.else							# } {
459OBJS+=${SRCS:N*.h:N*.sh:R:S/$/.o/g}
460.endif							# }
461
462STOBJS+=${OBJS}
463
464LOBJS+=${LSRCS:.c=.ln} ${SRCS:M*.c:.c=.ln}
465
466.if ${LIBISPRIVATE} != "no"
467# No installation is required
468libinstall::
469.endif
470
471.if ${MKDEBUGLIB} != "no"
472_LIBS+=${_LIB_g.a}
473GOBJS+=${OBJS:.o=.go}
474DEBUGFLAGS?=-DDEBUG
475.endif
476
477.if ${MKPROFILE} != "no"
478_LIBS+=${_LIB_p.a}
479POBJS+=${OBJS:.o=.po}
480PROFFLAGS?=-DGPROF -DPROF
481.endif
482
483.if ${MKPIC} != "no"							# {
484.if ${MKPICLIB} == "no"
485.if ${MKSHLIBOBJS} != "no"
486# make _pic.a, which isn't really pic,
487# since it's needed for making shared lib.
488# but don't install it.
489SOLIB=${_LIB_pic.a}
490SOBJS+=${OBJS:.o=.pico}
491.else
492SOLIB=${_LIB.a}
493.endif
494.else
495SOLIB=${_LIB_pic.a}
496_LIBS+=${SOLIB}
497SOBJS+=${OBJS:.o=.pico}
498.endif
499.if defined(SHLIB_FULLVERSION)
500_LIBS+=${_LIB.so.full}
501.endif
502.endif									# }
503
504.if ${MKLINT} != "no" && !empty(LOBJS)
505_LIBS+=${_LIB.ln}
506.endif
507
508ALLOBJS=
509.if (${MKPIC} == "no" || (defined(LDSTATIC) && ${LDSTATIC} != "") \
510	|| ${MKLINKLIB} != "no") && ${MKSTATICLIB} != "no"
511ALLOBJS+=${STOBJS}
512.endif
513ALLOBJS+=${POBJS} ${SOBJS}
514.if ${MKLINT} != "no" && !empty(LOBJS)
515ALLOBJS+=${LOBJS}
516.endif
517.else	# !defined(LIB)							# } {
518LOBJS=
519SOBJS=
520.endif	# !defined(LIB)							# }
521
522_YLSRCS=	${SRCS:M*.[ly]:C/\..$/.c/} ${YHEADER:D${SRCS:M*.y:.y=.h}}
523
524.NOPATH: ${ALLOBJS} ${_LIBS} ${_YLSRCS}
525
526realall: ${SRCS} ${ALLOBJS:O} ${_LIBS} ${_LIB.so.debug}
527
528MKARZERO?= ${MKREPRO:Uno}
529
530.if ${MKARZERO} == "yes"
531_ARFL=crsD
532_ARRANFL=sD
533_INSTRANLIB=
534.else
535_ARFL=crs
536_ARRANFL=s
537_INSTRANLIB=${empty(PRESERVE):?-a "${RANLIB} -t":}
538.endif
539
540# If you change this, please consider reflecting the change in
541# the override in sys/rump/Makefile.rump.
542.if !target(__archivebuild)
543__archivebuild: .USE
544	${_MKTARGET_BUILD}
545	rm -f ${.TARGET}
546	${AR} ${_ARFL} ${.TARGET} `NM=${NM} ${LORDER} ${.ALLSRC:M*o} | ${TSORT}`
547.endif
548
549.if !target(__archiveinstall)
550__archiveinstall: .USE
551	${_MKTARGET_INSTALL}
552	${INSTALL_FILE} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
553	    ${_INSTRANLIB} ${.ALLSRC} ${.TARGET}
554.endif
555
556__archivesymlinkpic: .USE
557	${_MKTARGET_INSTALL}
558	${INSTALL_SYMLINK} ${.ALLSRC} ${.TARGET}
559
560DPSRCS+=	${_YLSRCS}
561CLEANFILES+=	${_YLSRCS}
562
563${STOBJS} ${POBJS} ${GOBJS} ${SOBJS} ${LOBJS}: ${DPSRCS}
564
565${_LIB.a}:: ${STOBJS} __archivebuild
566
567${_LIB_p.a}:: ${POBJS} __archivebuild
568
569${_LIB_pic.a}:: ${SOBJS} __archivebuild
570
571${_LIB_g.a}:: ${GOBJS} __archivebuild
572
573
574_LIBLDOPTS=
575.if ${SHLIBDIR} != "/usr/lib"
576_LIBLDOPTS+=	-Wl,-rpath,${SHLIBDIR} \
577		-L=${SHLIBDIR}
578.elif ${SHLIBINSTALLDIR} != "/usr/lib"
579_LIBLDOPTS+=	-Wl,-rpath-link,${DESTDIR}${SHLIBINSTALLDIR} \
580		-L=${SHLIBINSTALLDIR}
581.endif
582
583# gcc -shared now adds -lc automatically. For libraries other than libc and
584# libgcc* we add as a dependency the installed shared libc. For libc and
585# libgcc* we avoid adding libc as a dependency by using -nostdlib. Note that
586# -Xl,-nostdlib is not enough because we want to tell the compiler-driver not
587# to add standard libraries, not the linker.
588.if !defined(LIB)
589.if !empty(LIBC_SO)
590DPLIBC ?= ${DESTDIR}${LIBC_SO}
591.endif
592.else
593.if ${LIB} != "c" && ${LIB:Mgcc*} == ""
594.if !empty(LIBC_SO)
595DPLIBC ?= ${DESTDIR}${LIBC_SO}
596.endif
597.else
598LDLIBC ?= -nodefaultlibs
599.if ${HAVE_LIBGCC} == "yes" && ${LIB} == "c"
600LDADD+= -lgcc
601.endif
602.endif
603.endif
604
605.if ${LIBISCXX} != "no"
606LIBCC:=	${CXX}
607. if ${MKLIBCXX} == "yes"
608LIBDPLIBS+=     c++	${.CURDIR}/../../../../../external/bsd/libc++/lib
609. else
610LIBDPLIBS+=     stdc++	${.CURDIR}/../../../../../external/gpl3/${EXTERNAL_GCC_SUBDIR}/lib/libstdc++-v3
611. endif
612.else
613LIBCC:=	${CC}
614.endif
615
616_LDADD.${_LIB}=	${LDADD} ${LDADD.${_LIB}}
617_LDFLAGS.${_LIB}=	${LDFLAGS} ${LDFLAGS.${_LIB}}
618
619_MAINLIBDEPS=	${SOLIB} ${DPADD} ${DPLIBC} \
620		${SHLIB_LDSTARTFILE} ${SHLIB_LDENDFILE}
621
622.if defined(_LIB.so.debug)
623${_LIB.so.debug}: ${_LIB.so.link}
624	${_MKTARGET_CREATE}
625	(  ${OBJCOPY} --only-keep-debug \
626		${_LIB.so.link} ${_LIB.so.debug} \
627	) || (rm -f ${.TARGET}; false)
628${_LIB.so.full}: ${_LIB.so.link} ${_LIB.so.debug}
629	${_MKTARGET_CREATE}
630	(  ${OBJCOPY} --strip-debug -p -R .gnu_debuglink \
631		--add-gnu-debuglink=${_LIB.so.debug} \
632		${_LIB.so.link} ${_LIB.so.full} \
633	) || (rm -f ${.TARGET}; false)
634${_LIB.so.link}: ${_MAINLIBDEPS}
635.else # aka no MKDEBUG
636${_LIB.so.full}: ${_MAINLIBDEPS}
637.endif
638	${_MKTARGET_BUILD}
639	rm -f ${.TARGET}
640	${LIBCC} ${LDLIBC} -Wl,-x -shared ${SHLIB_SHFLAGS} \
641	    ${_LDFLAGS.${_LIB}} -o ${.TARGET} ${_LIBLDOPTS} \
642	    -Wl,--whole-archive ${SOLIB} \
643	    -Wl,--no-whole-archive ${_LDADD.${_LIB}}
644#  We don't use INSTALL_SYMLINK here because this is just
645#  happening inside the build directory/objdir. XXX Why does
646#  this spend so much effort on libraries that aren't live??? XXX
647#  XXX Also creates dead symlinks until the .full rule runs
648#  above and creates the main link
649.if defined(SHLIB_FULLVERSION) && defined(SHLIB_MAJOR) && \
650    "${SHLIB_FULLVERSION}" != "${SHLIB_MAJOR}"
651	${HOST_LN} -sf ${_LIB.so.full} ${_LIB.so.major}.tmp
652	mv -f ${_LIB.so.major}.tmp ${_LIB.so.major}
653.endif
654	${HOST_LN} -sf ${_LIB.so.full} ${_LIB.so}.tmp
655	mv -f ${_LIB.so}.tmp ${_LIB.so}
656.if ${MKSTRIPIDENT} != "no"
657	${OBJCOPY} -R .ident ${.TARGET}
658.endif
659
660.if !empty(LOBJS)							# {
661LLIBS?=		-lc
662${_LIB.ln}: ${LOBJS}
663	${_MKTARGET_COMPILE}
664	rm -f ${.TARGET}
665.if defined(DESTDIR)
666	${LINT} -C${LIB} ${.ALLSRC} -L${DESTDIR}/usr/libdata ${LLIBS}
667.else
668	${LINT} -C${LIB} ${.ALLSRC} ${LLIBS}
669.endif
670.endif									# }
671
672lint: ${LOBJS}
673.if defined(LOBJS) && !empty(LOBJS)
674	${LINT} ${LINTFLAGS} ${LOBJS}
675.endif
676
677
678# If the number of entries in CLEANFILES is too large, then the
679# commands in bsd.clean.mk encounter errors like "exec(/bin/sh)
680# failed (Argument list too long)".  Avoid that by splitting the
681# files to clean into several lists using different variable names.
682# __cleanuse is an internal target in bsd.clean.mk; the way we
683# use it here mimics the way it's used by the clean target in
684# bsd.clean.mk.
685#
686clean: libclean1 libclean2 libclean3 libclean4 libclean5
687libclean1: .PHONY .MADE __cleanuse LIBCLEANFILES1
688libclean2: .PHONY .MADE __cleanuse LIBCLEANFILES2
689libclean3: .PHONY .MADE __cleanuse LIBCLEANFILES3
690libclean4: .PHONY .MADE __cleanuse LIBCLEANFILES4
691libclean5: .PHONY .MADE __cleanuse LIBCLEANFILES5
692CLEANFILES+= a.out [Ee]rrs mklog core *.core
693LIBCLEANFILES1+= ${_LIB.a}   ${STOBJS} ${STOBJS:=.tmp}
694LIBCLEANFILES2+= ${_LIB_p.a} ${POBJS}  ${POBJS:=.tmp}
695LIBCLEANFILES3+= ${_LIB_g.a} ${GOBJS}  ${GOBJS:=.tmp}
696LIBCLEANFILES4+= ${_LIB_pic.a}
697.if ${MKPIC} != "no" && defined(SHLIB_FULLVERSION)
698LIBCLEANFILES4+= ${_LIB.so}.* ${_LIB.so} ${_LIB.so.debug}
699.endif
700LIBCLEANFILES4+= ${SOBJS} ${SOBJS:=.tmp}
701LIBCLEANFILES5+= ${_LIB.ln} ${LOBJS}
702
703.if !target(libinstall)							# {
704# Make sure it gets defined, in case MKPIC==no && MKLINKLIB==no
705libinstall::
706
707.if ${MKLINKLIB} != "no" && ${MKSTATICLIB} != "no"
708libinstall:: ${_DEST.LIB}/${_LIB.a}
709.PRECIOUS: ${_DEST.LIB}/${_LIB.a}
710
711.if ${MKUPDATE} == "no"
712.if !defined(BUILD) && !make(all) && !make(${_LIB.a})
713${_DEST.LIB}/${_LIB.a}! .MADE
714.endif
715${_DEST.LIB}/${_LIB.a}! ${_LIB.a} __archiveinstall
716.else
717.if !defined(BUILD) && !make(all) && !make(${_LIB.a})
718${_DEST.LIB}/${_LIB.a}: .MADE
719.endif
720${_DEST.LIB}/${_LIB.a}: ${_LIB.a} __archiveinstall
721.endif
722.endif
723
724.if ${MKPROFILE} != "no"
725libinstall:: ${_DEST.LIB}/${_LIB_p.a}
726.PRECIOUS: ${_DEST.LIB}/${_LIB_p.a}
727
728.if ${MKUPDATE} == "no"
729.if !defined(BUILD) && !make(all) && !make(${_LIB_p.a})
730${_DEST.LIB}/${_LIB_p.a}! .MADE
731.endif
732${_DEST.LIB}/${_LIB_p.a}! ${_LIB_p.a} __archiveinstall
733.else
734.if !defined(BUILD) && !make(all) && !make(${_LIB_p.a})
735${_DEST.LIB}/${_LIB_p.a}: .MADE
736.endif
737${_DEST.LIB}/${_LIB_p.a}: ${_LIB_p.a} __archiveinstall
738.endif
739.endif
740
741.if ${MKDEBUGLIB} != "no"
742libinstall:: ${_DEST.LIB}/${_LIB_g.a}
743.PRECIOUS: ${_DEST.LIB}/${_LIB_g.a}
744
745.if ${MKUPDATE} == "no"
746.if !defined(BUILD) && !make(all) && !make(${_LIB_g.a})
747${_DEST.LIB}/${_LIB_g.a}! .MADE
748.endif
749${_DEST.LIB}/${_LIB_g.a}! ${_LIB_g.a} __archiveinstall
750.else
751.if !defined(BUILD) && !make(all) && !make(${LIB_g.a})
752${_DEST.LIB}/${_LIB_g.a}: .MADE
753.endif
754${_DEST.LIB}/${_LIB_g.a}: ${_LIB_g.a} __archiveinstall
755.endif
756.endif
757
758.if ${MKPIC} != "no" && ${MKPICINSTALL} != "no"
759libinstall:: ${_DEST.LIB}/${_LIB_pic.a}
760.PRECIOUS: ${_DEST.LIB}/${_LIB_pic.a}
761
762.if ${MKUPDATE} == "no"
763.if !defined(BUILD) && !make(all) && !make(${_LIB_pic.a})
764${_DEST.LIB}/${_LIB_pic.a}! .MADE
765.endif
766.if ${MKPICLIB} == "no"
767${_DEST.LIB}/${_LIB_pic.a}! ${_LIB.a} __archivesymlinkpic
768.else
769${_DEST.LIB}/${_LIB_pic.a}! ${_LIB_pic.a} __archiveinstall
770.endif
771.else
772.if !defined(BUILD) && !make(all) && !make(${_LIB_pic.a})
773${_DEST.LIB}/${_LIB_pic.a}: .MADE
774.endif
775.if ${MKPICLIB} == "no"
776${_DEST.LIB}/${_LIB_pic.a}: ${_LIB.a} __archivesymlinkpic
777.else
778${_DEST.LIB}/${_LIB_pic.a}: ${_LIB_pic.a} __archiveinstall
779.endif
780.endif
781.endif
782
783.if ${MKPIC} != "no" && defined(SHLIB_FULLVERSION)
784
785libinstall:: ${_DEST.OBJ}/${_LIB.so.full}
786.PRECIOUS: ${_DEST.OBJ}/${_LIB.so.full}
787
788.if ${MKUPDATE} == "no"
789.if !defined(BUILD) && !make(all) && !make(${_LIB.so.full})
790${_DEST.OBJ}/${_LIB.so.full}! .MADE
791.endif
792${_DEST.OBJ}/${_LIB.so.full}! ${_LIB.so.full}
793.else
794.if !defined(BUILD) && !make(all) && !make(${_LIB.so.full})
795${_DEST.OBJ}/${_LIB.so.full}: .MADE
796.endif
797${_DEST.OBJ}/${_LIB.so.full}: ${_LIB.so.full}
798.endif
799	${_MKTARGET_INSTALL}
800	${INSTALL_FILE} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
801	    ${.ALLSRC} ${.TARGET}
802.if ${_LIBSODIR} != ${LIBDIR}
803	${INSTALL_SYMLINK} -l r ${_DEST.OBJ}/${_LIB.so.full} \
804	    ${_DEST.LIB}/${_LIB.so.full}
805.endif
806.if defined(SHLIB_FULLVERSION) && defined(SHLIB_MAJOR) && \
807    "${SHLIB_FULLVERSION}" != "${SHLIB_MAJOR}"
808	${INSTALL_SYMLINK} ${_LIB.so.full} ${_DEST.OBJ}/${_LIB.so.major}
809.if ${_LIBSODIR} != ${LIBDIR}
810	${INSTALL_SYMLINK} -l r ${_DEST.OBJ}/${_LIB.so.full} \
811	    ${_DEST.LIB}/${_LIB.so.major}
812.endif
813.endif
814.if ${MKLINKLIB} != "no"
815	${INSTALL_SYMLINK}  ${_LIB.so.full} ${_DEST.OBJ}/${_LIB.so}
816.if ${_LIBSODIR} != ${LIBDIR}
817	${INSTALL_SYMLINK} -l r ${_DEST.OBJ}/${_LIB.so.full} \
818	    ${_DEST.LIB}/${_LIB.so}
819.endif
820.endif
821.endif
822
823.if defined(_LIB.so.debug)
824libinstall:: ${_DEST.DEBUG}/${_LIB.so.debug}
825.PRECIOUS: ${_DEST.DEBUG}/${_LIB.so.debug}
826
827${_DEST.DEBUG}/${_LIB.so.debug}: ${_LIB.so.debug}
828	${_MKTARGET_INSTALL}
829	${INSTALL_FILE} -o ${DEBUGOWN} -g ${DEBUGGRP} -m ${DEBUGMODE} \
830	    ${.ALLSRC} ${.TARGET}
831.if ${_LIBSODIR} != ${LIBDIR}
832	${INSTALL_SYMLINK} -l r ${_DEST.DEBUG}/${_LIB.so.debug} \
833	    ${_DEST.ODEBUG}/${_LIB.so.debug}
834.endif
835.endif
836
837.if ${MKLINT} != "no" && !empty(LOBJS)
838libinstall:: ${_DEST.LINT}/${_LIB.ln}
839.PRECIOUS: ${_DEST.LINT}/${_LIB.ln}
840
841.if ${MKUPDATE} == "no"
842.if !defined(BUILD) && !make(all) && !make(${_LIB.ln})
843${_DEST.LINT}/${_LIB.ln}! .MADE
844.endif
845${_DEST.LINT}/${_LIB.ln}! ${_LIB.ln}
846.else
847.if !defined(BUILD) && !make(all) && !make(${_LIB.ln})
848${_DEST.LINT}/${_LIB.ln}: .MADE
849.endif
850${_DEST.LINT}/${_LIB.ln}: ${_LIB.ln}
851.endif
852	${_MKTARGET_INSTALL}
853	${INSTALL_FILE} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
854		${.ALLSRC} ${_DEST.LINT}
855.endif
856.endif	# !target(libinstall)						# }
857
858##### Pull in related .mk logic
859LINKSOWN?= ${LIBOWN}
860LINKSGRP?= ${LIBGRP}
861LINKSMODE?= ${LIBMODE}
862.include <bsd.man.mk>
863.include <bsd.nls.mk>
864.include <bsd.files.mk>
865.include <bsd.inc.mk>
866.include <bsd.links.mk>
867.include <bsd.dep.mk>
868.include <bsd.clang-analyze.mk>
869.include <bsd.clean.mk>
870
871${TARGETS}:	# ensure existence
872