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