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