xref: /netbsd-src/share/mk/bsd.lib.mk (revision 8ac07aec990b9d2e483062509d0a9fa5b4f57cf2)
1#	$NetBSD: bsd.lib.mk,v 1.276 2008/04/26 22:28:13 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
10##### Basic targets
11.PHONY:		checkver libinstall
12realinstall:	checkver libinstall
13clean:		cleanlib
14
15##### LIB specific flags.
16COPTS+=     ${COPTS.lib${LIB}}
17CPPFLAGS+=  ${CPPFLAGS.lib${LIB}}
18CXXFLAGS+=  ${CXXFLAGS.lib${LIB}}
19OBJCOPTS+=  ${OBJCOPTS.lib${LIB}}
20LDADD+=     ${LDADD.lib${LIB}}
21LDFLAGS+=   ${LDFLAGS.lib${LIB}}
22LDSTATIC+=  ${LDSTATIC.lib${LIB}}
23
24##### Libraries that this may depend upon.
25.if defined(LIBDPLIBS) && ${MKPIC} != "no"				# {
26.for _lib _dir in ${LIBDPLIBS}
27.if !defined(LIBDO.${_lib})
28LIBDO.${_lib}!=	cd ${_dir} && ${PRINTOBJDIR}
29.MAKEOVERRIDES+=LIBDO.${_lib}
30.endif
31LDADD+=		-L${LIBDO.${_lib}} -l${_lib}
32DPADD+=		${LIBDO.${_lib}}/lib${_lib}.so
33.endfor
34.endif									# }
35
36##### Build and install rules
37MKDEP_SUFFIXES?=	.o .po .so .ln
38CPPFLAGS+=	${DESTDIR:D-nostdinc ${CPPFLAG_ISYSTEM} ${DESTDIR}/usr/include}
39CXXFLAGS+=	${DESTDIR:D-nostdinc++ ${CPPFLAG_ISYSTEMXX} ${DESTDIR}/usr/include/g++}
40
41.if !defined(SHLIB_MAJOR) && exists(${SHLIB_VERSION_FILE})		# {
42SHLIB_MAJOR != . ${SHLIB_VERSION_FILE} ; echo $$major
43SHLIB_MINOR != . ${SHLIB_VERSION_FILE} ; echo $$minor
44SHLIB_TEENY != . ${SHLIB_VERSION_FILE} ; echo $$teeny
45
46# Check for higher installed library versions.
47.if !defined(NOCHECKVER) && !defined(NOCHECKVER_${LIB}) && \
48	exists(${NETBSDSRCDIR}/lib/checkver)
49checkver:
50	@(cd ${.CURDIR} && \
51	    ${HOST_SH} ${NETBSDSRCDIR}/lib/checkver -v ${SHLIB_VERSION_FILE} \
52		    -d ${DESTDIR}${_LIBSODIR} ${LIB})
53.endif
54.endif									# }
55
56.if !target(checkver)
57checkver:
58.endif
59
60print-shlib-major:
61.if defined(SHLIB_MAJOR) && ${MKPIC} != "no"
62	@echo ${SHLIB_MAJOR}
63.else
64	@false
65.endif
66
67print-shlib-minor:
68.if defined(SHLIB_MINOR) && ${MKPIC} != "no"
69	@echo ${SHLIB_MINOR}
70.else
71	@false
72.endif
73
74print-shlib-teeny:
75.if defined(SHLIB_TEENY) && ${MKPIC} != "no"
76	@echo ${SHLIB_TEENY}
77.else
78	@false
79.endif
80
81.if defined(SHLIB_MAJOR) && !empty(SHLIB_MAJOR)				# {
82.if defined(SHLIB_MINOR) && !empty(SHLIB_MINOR)
83.if defined(SHLIB_TEENY) && !empty(SHLIB_TEENY)
84SHLIB_FULLVERSION=${SHLIB_MAJOR}.${SHLIB_MINOR}.${SHLIB_TEENY}
85.else
86SHLIB_FULLVERSION=${SHLIB_MAJOR}.${SHLIB_MINOR}
87.endif
88.else
89SHLIB_FULLVERSION=${SHLIB_MAJOR}
90.endif
91.endif									# }
92
93# add additional suffixes not exported.
94# .po is used for profiling object files.
95# .so is used for PIC object files.
96.SUFFIXES: .out .a .ln .so .po .go .o .s .S .c .cc .cpp .cxx .C .m .F .f .r .y .l .cl .p .h
97.SUFFIXES: .sh .m4 .m
98
99
100# Set PICFLAGS to cc flags for producing position-independent code,
101# if not already set.  Includes -DPIC, if required.
102
103# Data-driven table using make variables to control how shared libraries
104# are built for different platforms and object formats.
105# OBJECT_FMT:		currently either "ELF" or "a.out", from <bsd.own.mk>
106# SHLIB_SOVERSION:	version number to be compiled into a shared library
107#			via -soname. Usualy ${SHLIB_MAJOR} on ELF.
108#			NetBSD/pmax used to use ${SHLIB_MAJOR}[.${SHLIB_MINOR}
109#			[.${SHLIB_TEENY}]]
110# SHLIB_SHFLAGS:	Flags to tell ${LD} to emit shared library.
111#			with ELF, also set shared-lib version for ld.so.
112# SHLIB_LDSTARTFILE:	support .o file, call C++ file-level constructors
113# SHLIB_LDENDFILE:	support .o file, call C++ file-level destructors
114# FPICFLAGS:		flags for ${FC} to compile .[fF] files to .so objects.
115# CPPPICFLAGS:		flags for ${CPP} to preprocess .[sS] files for ${AS}
116# CPICFLAGS:		flags for ${CC} to compile .[cC] files to pic objects.
117# CSHLIBFLAGS:		flags for ${CC} to compile .[cC] files to .so objects.
118#			(usually includes ${CPICFLAGS})
119# CAPICFLAGS:		flags for ${CC} to compiling .[Ss] files
120#		 	(usually just ${CPPPICFLAGS} ${CPICFLAGS})
121# APICFLAGS:		flags for ${AS} to assemble .[sS] to .so objects.
122
123.if ${MACHINE_ARCH} == "alpha"						# {
124
125FPICFLAGS ?= -fPIC
126CPICFLAGS ?= -fPIC -DPIC
127CPPPICFLAGS?= -DPIC
128CAPICFLAGS?= ${CPPPICFLAGS} ${CPICFLAGS}
129APICFLAGS ?=
130
131.elif (${MACHINE_ARCH} == "sparc" || ${MACHINE_ARCH} == "sparc64") && \
132       ${OBJECT_FMT} == "ELF"						# } {
133
134# If you use -fPIC you need to define BIGPIC to turn on 32-bit
135# relocations in asm code
136FPICFLAGS ?= -fPIC
137CPICFLAGS ?= -fPIC -DPIC
138CPPPICFLAGS?= -DPIC -DBIGPIC
139CAPICFLAGS?= ${CPPPICFLAGS} ${CPICFLAGS}
140APICFLAGS ?= -KPIC
141
142.else									# } {
143
144# Platform-independent flags for NetBSD shared libraries
145SHLIB_SOVERSION=${SHLIB_FULLVERSION}
146SHLIB_SHFLAGS=
147FPICFLAGS ?= -fPIC
148CPICFLAGS?= -fPIC -DPIC
149CPPPICFLAGS?= -DPIC
150CAPICFLAGS?= ${CPPPICFLAGS} ${CPICFLAGS}
151APICFLAGS?= -k
152
153.endif									# }
154
155.if ${MKPICLIB} != "no"
156CSHLIBFLAGS+= ${CPICFLAGS}
157.endif
158
159.if defined(CSHLIBFLAGS) && !empty(CSHLIBFLAGS)
160MKSHLIBOBJS= yes
161.else
162MKSHLIBOBJS= no
163.endif
164
165# Platform-independent linker flags for ELF shared libraries
166.if ${OBJECT_FMT} == "ELF"
167SHLIB_SOVERSION=	${SHLIB_MAJOR}
168SHLIB_SHFLAGS=		-Wl,-soname,lib${LIB}.so.${SHLIB_SOVERSION}
169SHLIB_SHFLAGS+=		-Wl,--warn-shared-textrel
170SHLIB_LDSTARTFILE?=	${DESTDIR}/usr/lib/crti.o ${_GCC_CRTBEGINS}
171SHLIB_LDENDFILE?=	${_GCC_CRTENDS} ${DESTDIR}/usr/lib/crtn.o
172.endif
173
174CFLAGS+=	${COPTS}
175OBJCFLAGS+=	${OBJCOPTS}
176AFLAGS+=	${COPTS}
177FFLAGS+=	${FOPTS}
178
179.c.o:
180	${_MKTARGET_COMPILE}
181	${COMPILE.c} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
182.if !defined(CFLAGS) || empty(CFLAGS:M*-g*)
183	${OBJCOPY} -x ${.TARGET}
184.endif
185
186.c.po:
187	${_MKTARGET_COMPILE}
188	${COMPILE.c} ${PROFFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} -pg ${.IMPSRC} -o ${.TARGET}
189.if !defined(CFLAGS) || empty(CFLAGS:M*-g*)
190	${OBJCOPY} -X ${.TARGET}
191.endif
192
193.c.go:
194	${_MKTARGET_COMPILE}
195	${COMPILE.c} ${DEBUGFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} -g ${.IMPSRC} -o ${.TARGET}
196
197.c.so:
198	${_MKTARGET_COMPILE}
199	${COMPILE.c} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${CSHLIBFLAGS} ${.IMPSRC} -o ${.TARGET}
200.if !defined(CFLAGS) || empty(CFLAGS:M*-g*)
201	${OBJCOPY} -x ${.TARGET}
202.endif
203
204.cc.o .cpp.o .cxx.o .C.o:
205	${_MKTARGET_COMPILE}
206	${COMPILE.cc} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
207.if !defined(CFLAGS) || empty(CFLAGS:M*-g*)
208	${OBJCOPY} -x ${.TARGET}
209.endif
210
211.cc.po .cpp.po .cxx.po .C.po:
212	${_MKTARGET_COMPILE}
213	${COMPILE.cc} ${PROFFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} -pg ${.IMPSRC} -o ${.TARGET}
214.if !defined(CFLAGS) || empty(CFLAGS:M*-g*)
215	${OBJCOPY} -X ${.TARGET}
216.endif
217
218.cc.go .cpp.go .cxx.go .C.go:
219	${_MKTARGET_COMPILE}
220	${COMPILE.cc} ${DEBUGFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} -g ${.IMPSRC} -o ${.TARGET}
221
222.cc.so .cpp.so .cxx.so .C.so:
223	${_MKTARGET_COMPILE}
224	${COMPILE.cc} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${CSHLIBFLAGS} ${.IMPSRC} -o ${.TARGET}
225.if !defined(CFLAGS) || empty(CFLAGS:M*-g*)
226	${OBJCOPY} -x ${.TARGET}
227.endif
228
229.f.o:
230	${_MKTARGET_COMPILE}
231	${COMPILE.f} ${.IMPSRC} -o ${.TARGET}
232.if !defined(FOPTS) || empty(FOPTS:M*-g*)
233	${OBJCOPY} -x ${.TARGET}
234.endif
235
236.f.po:
237	${_MKTARGET_COMPILE}
238	${COMPILE.f} ${PROFFLAGS} -pg ${.IMPSRC} -o ${.TARGET}
239.if !defined(FOPTS) || empty(FOPTS:M*-g*)
240	${OBJCOPY} -X ${.TARGET}
241.endif
242
243.f.go:
244	${_MKTARGET_COMPILE}
245	${COMPILE.f} ${DEBUGFLAGS} -g ${.IMPSRC} -o ${.TARGET}
246
247.f.so:
248	${_MKTARGET_COMPILE}
249	${COMPILE.f} ${FPICFLAGS} ${.IMPSRC} -o ${.TARGET}
250.if !defined(FOPTS) || empty(FOPTS:M*-g*)
251	${OBJCOPY} -x ${.TARGET}
252.endif
253
254.f.ln:
255	${_MKTARGET_COMPILE}
256	@echo Skipping lint for Fortran libraries.
257
258.m.o:
259	${_MKTARGET_COMPILE}
260	${COMPILE.m} ${OBJCOPTS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
261.if !defined(OBJCFLAGS) || empty(OBJCFLAGS:M*-g*)
262	${OBJCOPY} -x ${.TARGET}
263.endif
264
265.m.po:
266	${_MKTARGET_COMPILE}
267	${COMPILE.m} ${PROFFLAGS} -pg ${OBJCOPTS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
268.if !defined(OBJCFLAGS) || empty(OBJCFLAGS:M*-g*)
269	${OBJCOPY} -X ${.TARGET}
270.endif
271
272.m.go:
273	${_MKTARGET_COMPILE}
274	${COMPILE.m} ${DEBUGFLAGS} -g ${OBJCOPTS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
275.if !defined(OBJCFLAGS) || empty(OBJCFLAGS:M*-g*)
276	${OBJCOPY} -X ${.TARGET}
277.endif
278
279.m.so:
280	${_MKTARGET_COMPILE}
281	${COMPILE.m} ${CSHLIBFLAGS} ${OBJCOPTS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
282.if !defined(OBJCFLAGS) || empty(OBJCFLAGS:M*-g*)
283	${OBJCOPY} -x ${.TARGET}
284.endif
285
286.s.o:
287	${_MKTARGET_COMPILE}
288	${COMPILE.s} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
289	${OBJCOPY} -x ${.TARGET}
290
291.S.o:
292	${_MKTARGET_COMPILE}
293	${COMPILE.S} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
294	${OBJCOPY} -x ${.TARGET}
295
296.s.po:
297	${_MKTARGET_COMPILE}
298	${COMPILE.s} ${PROFFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
299	${OBJCOPY} -X ${.TARGET}
300
301.S.po:
302	${_MKTARGET_COMPILE}
303	${COMPILE.S} ${PROFFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
304	${OBJCOPY} -X ${.TARGET}
305
306.s.go:
307	${_MKTARGET_COMPILE}
308	${COMPILE.s} ${DEBUGFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
309
310.S.go:
311	${_MKTARGET_COMPILE}
312	${COMPILE.S} ${DEBUGFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
313
314.s.so:
315	${_MKTARGET_COMPILE}
316	${COMPILE.s} ${CAPICFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
317	${OBJCOPY} -x ${.TARGET}
318
319.S.so:
320	${_MKTARGET_COMPILE}
321	${COMPILE.S} ${CAPICFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}
322	${OBJCOPY} -x ${.TARGET}
323
324.if defined(LIB)							# {
325.if (${MKPIC} == "no" || (defined(LDSTATIC) && ${LDSTATIC} != "") \
326	|| ${MKLINKLIB} != "no") && ${MKSTATICLIB} != "no"
327_LIBS=lib${LIB}.a
328.else
329_LIBS=
330.endif
331
332OBJS+=${SRCS:N*.h:N*.sh:R:S/$/.o/g}
333
334STOBJS+=${OBJS}
335
336.if ${MKPRIVATELIB} != "no"
337# No installation is required
338libinstall::
339.else	# ${MKPRIVATELIB} == "no"					# {
340
341.if ${MKDEBUGLIB} != "no"
342_LIBS+=lib${LIB}_g.a
343GOBJS+=${OBJS:.o=.go}
344DEBUGFLAGS?=-DDEBUG
345.endif
346
347.if ${MKPROFILE} != "no"
348_LIBS+=lib${LIB}_p.a
349POBJS+=${OBJS:.o=.po}
350PROFFLAGS?=-DGPROF -DPROF
351.endif
352
353.if ${MKPIC} != "no"							# {
354.if ${MKPICLIB} == "no"
355.if ${MKSHLIBOBJS} != "no"
356# make _pic.a, which isn't really pic,
357# since it's needed for making shared lib.
358# but don't install it.
359SOLIB=lib${LIB}_pic.a
360SOBJS+=${OBJS:.o=.so}
361.else
362SOLIB=lib${LIB}.a
363.endif
364.else
365SOLIB=lib${LIB}_pic.a
366_LIBS+=${SOLIB}
367SOBJS+=${OBJS:.o=.so}
368.endif
369.if defined(SHLIB_FULLVERSION)
370_LIBS+=lib${LIB}.so.${SHLIB_FULLVERSION}
371.endif
372.endif									# }
373
374LOBJS+=${LSRCS:.c=.ln} ${SRCS:M*.c:.c=.ln}
375.if ${MKLINT} != "no" && ${MKLINKLIB} != "no" && !empty(LOBJS)
376_LIBS+=llib-l${LIB}.ln
377.endif
378
379.endif	# ${MKPRIVATELIB} == "no"					# }
380
381ALLOBJS=
382.if (${MKPIC} == "no" || (defined(LDSTATIC) && ${LDSTATIC} != "") \
383	|| ${MKLINKLIB} != "no") && ${MKSTATICLIB} != "no"
384ALLOBJS+=${STOBJS}
385.endif
386ALLOBJS+=${POBJS} ${SOBJS}
387.if ${MKLINT} != "no" && ${MKLINKLIB} != "no" && !empty(LOBJS)
388ALLOBJS+=${LOBJS}
389.endif
390.else	# !defined(LIB)							# } {
391LOBJS=
392SOBJS=
393.endif	# !defined(LIB)							# }
394
395_YLSRCS=	${SRCS:M*.[ly]:C/\..$/.c/} ${YHEADER:D${SRCS:M*.y:.y=.h}}
396
397.NOPATH: ${ALLOBJS} ${_LIBS} ${_YLSRCS}
398
399realall: ${SRCS} ${ALLOBJS:O} ${_LIBS}
400
401.if !target(__archivebuild)
402__archivebuild: .USE
403	${_MKTARGET_BUILD}
404	rm -f ${.TARGET}
405	${AR} cq ${.TARGET} `NM=${NM} ${LORDER} ${.ALLSRC:M*o} | ${TSORT}`
406	${RANLIB} ${.TARGET}
407.endif
408
409.if !target(__archiveinstall)
410__archiveinstall: .USE
411	${_MKTARGET_INSTALL}
412	${INSTALL_FILE} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
413	    ${empty(PRESERVE):?-a "${RANLIB} -t":} ${.ALLSRC} ${.TARGET}
414.endif
415
416__archivesymlinkpic: .USE
417	${_MKTARGET_INSTALL}
418	${INSTALL_SYMLINK} ${.ALLSRC} ${.TARGET}
419
420DPSRCS+=	${_YLSRCS}
421CLEANFILES+=	${_YLSRCS}
422
423${STOBJS} ${POBJS} ${GOBJS} ${SOBJS} ${LOBJS}: ${DPSRCS}
424
425lib${LIB}.a:: ${STOBJS} __archivebuild
426
427lib${LIB}_p.a:: ${POBJS} __archivebuild
428
429lib${LIB}_pic.a:: ${SOBJS} __archivebuild
430
431lib${LIB}_g.a:: ${GOBJS} __archivebuild
432
433
434_LIBLDOPTS=
435.if ${SHLIBDIR} != "/usr/lib"
436_LIBLDOPTS+=	-Wl,-rpath-link,${DESTDIR}${SHLIBDIR}:${DESTDIR}/usr/lib \
437		-R${SHLIBDIR} \
438		-L${DESTDIR}${SHLIBDIR}
439.elif ${SHLIBINSTALLDIR} != "/usr/lib"
440_LIBLDOPTS+=	-Wl,-rpath-link,${DESTDIR}${SHLIBINSTALLDIR}:${DESTDIR}/usr/lib \
441		-L${DESTDIR}${SHLIBINSTALLDIR}
442.endif
443
444.if !defined(LIB)
445DPLIBC ?= ${DESTDIR}${LIBC_SO}
446LDLIBC ?= -lc
447.else
448.if ${LIB} != "c" && ${LIB:M*gcc*} == ""
449DPLIBC ?= ${DESTDIR}${LIBC_SO}
450LDLIBC ?= -lc
451.endif
452.endif
453
454lib${LIB}.so.${SHLIB_FULLVERSION}: ${SOLIB} ${DPADD} ${DPLIBC} \
455    ${SHLIB_LDSTARTFILE} ${SHLIB_LDENDFILE}
456	${_MKTARGET_BUILD}
457	rm -f lib${LIB}.so.${SHLIB_FULLVERSION}
458.if defined(DESTDIR)
459	${CC} -Wl,-nostdlib -B${_GCC_CRTDIR}/ -B${DESTDIR}/usr/lib/ \
460	    ${_LIBLDOPTS} \
461	    -Wl,-x -shared ${SHLIB_SHFLAGS} ${LDFLAGS} -o ${.TARGET} \
462	    -Wl,--whole-archive ${SOLIB} \
463	    -Wl,--no-whole-archive ${LDADD} \
464	    -L${_GCC_LIBGCCDIR} ${LDLIBC}
465.else
466	${CC} -Wl,-x -shared ${SHLIB_SHFLAGS} ${LDFLAGS} -o ${.TARGET} \
467	    ${_LIBLDOPTS} \
468	    -Wl,--whole-archive ${SOLIB} -Wl,--no-whole-archive ${LDADD} \
469	    ${LDLIBC}
470.endif
471.if ${OBJECT_FMT} == "ELF"
472#  We don't use INSTALL_SYMLINK here because this is just
473#  happening inside the build directory/objdir. XXX Why does
474#  this spend so much effort on libraries that aren't live??? XXX
475	${HOST_LN} -sf lib${LIB}.so.${SHLIB_FULLVERSION} lib${LIB}.so.${SHLIB_MAJOR}.tmp
476	mv -f lib${LIB}.so.${SHLIB_MAJOR}.tmp lib${LIB}.so.${SHLIB_MAJOR}
477	${HOST_LN} -sf lib${LIB}.so.${SHLIB_FULLVERSION} lib${LIB}.so.tmp
478	mv -f lib${LIB}.so.tmp lib${LIB}.so
479.endif
480
481.if !empty(LOBJS)							# {
482LLIBS?=		-lc
483llib-l${LIB}.ln: ${LOBJS}
484	${_MKTARGET_COMPILE}
485	rm -f llib-l${LIB}.ln
486.if defined(DESTDIR)
487	${LINT} -C${LIB} ${.ALLSRC} -L${DESTDIR}/usr/libdata ${LLIBS}
488.else
489	${LINT} -C${LIB} ${.ALLSRC} ${LLIBS}
490.endif
491.endif									# }
492
493cleanlib: .PHONY
494	rm -f a.out [Ee]rrs mklog core *.core ${CLEANFILES}
495	rm -f lib${LIB}.a ${STOBJS}
496	rm -f lib${LIB}_p.a ${POBJS}
497	rm -f lib${LIB}_g.a ${GOBJS}
498	rm -f lib${LIB}_pic.a lib${LIB}.so.* lib${LIB}.so ${SOBJS}
499	rm -f ${STOBJS:=.tmp} ${POBJS:=.tmp} ${SOBJS:=.tmp} ${GOBJS:=.tmp}
500	rm -f llib-l${LIB}.ln ${LOBJS}
501
502
503.if !target(libinstall)							# {
504# Make sure it gets defined, in case MKPIC==no && MKLINKLIB==no
505libinstall::
506
507.if ${MKLINKLIB} != "no" && ${MKSTATICLIB} != "no"
508libinstall:: ${DESTDIR}${LIBDIR}/lib${LIB}.a
509.PRECIOUS: ${DESTDIR}${LIBDIR}/lib${LIB}.a
510
511.if ${MKUPDATE} == "no"
512.if !defined(BUILD) && !make(all) && !make(lib${LIB}.a)
513${DESTDIR}${LIBDIR}/lib${LIB}.a! .MADE
514.endif
515${DESTDIR}${LIBDIR}/lib${LIB}.a! lib${LIB}.a __archiveinstall
516.else
517.if !defined(BUILD) && !make(all) && !make(lib${LIB}.a)
518${DESTDIR}${LIBDIR}/lib${LIB}.a: .MADE
519.endif
520${DESTDIR}${LIBDIR}/lib${LIB}.a: lib${LIB}.a __archiveinstall
521.endif
522.endif
523
524.if ${MKPROFILE} != "no"
525libinstall:: ${DESTDIR}${LIBDIR}/lib${LIB}_p.a
526.PRECIOUS: ${DESTDIR}${LIBDIR}/lib${LIB}_p.a
527
528.if ${MKUPDATE} == "no"
529.if !defined(BUILD) && !make(all) && !make(lib${LIB}_p.a)
530${DESTDIR}${LIBDIR}/lib${LIB}_p.a! .MADE
531.endif
532${DESTDIR}${LIBDIR}/lib${LIB}_p.a! lib${LIB}_p.a __archiveinstall
533.else
534.if !defined(BUILD) && !make(all) && !make(lib${LIB}_p.a)
535${DESTDIR}${LIBDIR}/lib${LIB}_p.a: .MADE
536.endif
537${DESTDIR}${LIBDIR}/lib${LIB}_p.a: lib${LIB}_p.a __archiveinstall
538.endif
539.endif
540
541.if ${MKDEBUGLIB} != "no"
542libinstall:: ${DESTDIR}${LIBDIR}/lib${LIB}_g.a
543.PRECIOUS: ${DESTDIR}${LIBDIR}/lib${LIB}_g.a
544
545.if ${MKUPDATE} == "no"
546.if !defined(BUILD) && !make(all) && !make(lib${LIB}_g.a)
547${DESTDIR}${LIBDIR}/lib${LIB}_g.a! .MADE
548.endif
549${DESTDIR}${LIBDIR}/lib${LIB}_g.a! lib${LIB}_g.a __archiveinstall
550.else
551.if !defined(BUILD) && !make(all) && !make(lib${LIB}_g.a)
552${DESTDIR}${LIBDIR}/lib${LIB}_g.a: .MADE
553.endif
554${DESTDIR}${LIBDIR}/lib${LIB}_g.a: lib${LIB}_g.a __archiveinstall
555.endif
556.endif
557
558.if ${MKPIC} != "no" && ${MKPICINSTALL} != "no"
559libinstall:: ${DESTDIR}${LIBDIR}/lib${LIB}_pic.a
560.PRECIOUS: ${DESTDIR}${LIBDIR}/lib${LIB}_pic.a
561
562.if ${MKUPDATE} == "no"
563.if !defined(BUILD) && !make(all) && !make(lib${LIB}_pic.a)
564${DESTDIR}${LIBDIR}/lib${LIB}_pic.a! .MADE
565.endif
566.if ${MKPICLIB} == "no"
567${DESTDIR}${LIBDIR}/lib${LIB}_pic.a! lib${LIB}.a __archivesymlinkpic
568.else
569${DESTDIR}${LIBDIR}/lib${LIB}_pic.a! lib${LIB}_pic.a __archiveinstall
570.endif
571.else
572.if !defined(BUILD) && !make(all) && !make(lib${LIB}_pic.a)
573${DESTDIR}${LIBDIR}/lib${LIB}_pic.a: .MADE
574.endif
575.if ${MKPICLIB} == "no"
576${DESTDIR}${LIBDIR}/lib${LIB}_pic.a: lib${LIB}.a __archivesymlinkpic
577.else
578${DESTDIR}${LIBDIR}/lib${LIB}_pic.a: lib${LIB}_pic.a __archiveinstall
579.endif
580.endif
581.endif
582
583.if ${MKPIC} != "no" && defined(SHLIB_FULLVERSION)
584libinstall:: ${DESTDIR}${_LIBSODIR}/lib${LIB}.so.${SHLIB_FULLVERSION}
585.PRECIOUS: ${DESTDIR}${_LIBSODIR}/lib${LIB}.so.${SHLIB_FULLVERSION}
586
587.if ${MKUPDATE} == "no"
588.if !defined(BUILD) && !make(all) && !make(lib${LIB}.so.${SHLIB_FULLVERSION})
589${DESTDIR}${_LIBSODIR}/lib${LIB}.so.${SHLIB_FULLVERSION}! .MADE
590.endif
591${DESTDIR}${_LIBSODIR}/lib${LIB}.so.${SHLIB_FULLVERSION}! lib${LIB}.so.${SHLIB_FULLVERSION}
592.else
593.if !defined(BUILD) && !make(all) && !make(lib${LIB}.so.${SHLIB_FULLVERSION})
594${DESTDIR}${_LIBSODIR}/lib${LIB}.so.${SHLIB_FULLVERSION}: .MADE
595.endif
596${DESTDIR}${_LIBSODIR}/lib${LIB}.so.${SHLIB_FULLVERSION}: lib${LIB}.so.${SHLIB_FULLVERSION}
597.endif
598	${_MKTARGET_INSTALL}
599	${INSTALL_FILE} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
600		${.ALLSRC} ${.TARGET}
601.if ${_LIBSODIR} != ${LIBDIR}
602	${INSTALL_SYMLINK} \
603		-l r ${DESTDIR}${_LIBSODIR}/lib${LIB}.so.${SHLIB_FULLVERSION} \
604		${DESTDIR}${LIBDIR}/lib${LIB}.so.${SHLIB_FULLVERSION}
605.endif
606.if ${OBJECT_FMT} == "a.out" && !defined(DESTDIR)
607	/sbin/ldconfig -m ${_LIBSODIR} ${LIBDIR}
608.endif
609.if ${OBJECT_FMT} == "ELF"
610	${INSTALL_SYMLINK} \
611		lib${LIB}.so.${SHLIB_FULLVERSION} \
612		${DESTDIR}${_LIBSODIR}/lib${LIB}.so.${SHLIB_MAJOR}
613.if ${_LIBSODIR} != ${LIBDIR}
614	${INSTALL_SYMLINK} \
615		-l r ${DESTDIR}${_LIBSODIR}/lib${LIB}.so.${SHLIB_FULLVERSION} \
616		${DESTDIR}${LIBDIR}/lib${LIB}.so.${SHLIB_MAJOR}
617.endif
618.if ${MKLINKLIB} != "no"
619	${INSTALL_SYMLINK} \
620		lib${LIB}.so.${SHLIB_FULLVERSION} \
621		${DESTDIR}${_LIBSODIR}/lib${LIB}.so
622.if ${_LIBSODIR} != ${LIBDIR}
623	${INSTALL_SYMLINK} \
624		-l r ${DESTDIR}${_LIBSODIR}/lib${LIB}.so.${SHLIB_FULLVERSION} \
625		${DESTDIR}${LIBDIR}/lib${LIB}.so
626.endif
627.endif
628.endif
629.endif
630
631.if ${MKLINT} != "no" && ${MKLINKLIB} != "no" && !empty(LOBJS)
632libinstall:: ${DESTDIR}${LINTLIBDIR}/llib-l${LIB}.ln
633.PRECIOUS: ${DESTDIR}${LINTLIBDIR}/llib-l${LIB}.ln
634
635.if ${MKUPDATE} == "no"
636.if !defined(BUILD) && !make(all) && !make(llib-l${LIB}.ln)
637${DESTDIR}${LINTLIBDIR}/llib-l${LIB}.ln! .MADE
638.endif
639${DESTDIR}${LINTLIBDIR}/llib-l${LIB}.ln! llib-l${LIB}.ln
640.else
641.if !defined(BUILD) && !make(all) && !make(llib-l${LIB}.ln)
642${DESTDIR}${LINTLIBDIR}/llib-l${LIB}.ln: .MADE
643.endif
644${DESTDIR}${LINTLIBDIR}/llib-l${LIB}.ln: llib-l${LIB}.ln
645.endif
646	${_MKTARGET_INSTALL}
647	${INSTALL_FILE} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
648		${.ALLSRC} ${DESTDIR}${LINTLIBDIR}
649.endif
650.endif	# !target(libinstall)						# }
651
652##### Pull in related .mk logic
653.include <bsd.man.mk>
654.include <bsd.nls.mk>
655.include <bsd.files.mk>
656.include <bsd.inc.mk>
657.include <bsd.links.mk>
658.include <bsd.dep.mk>
659
660${TARGETS}:	# ensure existence
661