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