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