xref: /freebsd/share/mk/bsd.lib.mk (revision 2b15cb3d0922bd70ea592f0da9b4a5b167f4d53f)
1#	from: @(#)bsd.lib.mk	5.26 (Berkeley) 5/2/91
2# $FreeBSD$
3#
4
5.include <bsd.init.mk>
6
7.if defined(LIB_CXX)
8LIB=	${LIB_CXX}
9_LD=	${CXX}
10.else
11_LD=	${CC}
12.endif
13
14# Set up the variables controlling shared libraries.  After this section,
15# SHLIB_NAME will be defined only if we are to create a shared library.
16# SHLIB_LINK will be defined only if we are to create a link to it.
17# INSTALL_PIC_ARCHIVE will be defined only if we are to create a PIC archive.
18.if defined(NO_PIC)
19.undef SHLIB_NAME
20.undef INSTALL_PIC_ARCHIVE
21.else
22.if !defined(SHLIB) && defined(LIB)
23SHLIB=		${LIB}
24.endif
25.if !defined(SHLIB_NAME) && defined(SHLIB) && defined(SHLIB_MAJOR)
26SHLIB_NAME=	lib${SHLIB}.so.${SHLIB_MAJOR}
27.endif
28.if defined(SHLIB_NAME) && !empty(SHLIB_NAME:M*.so.*)
29SHLIB_LINK?=	${SHLIB_NAME:R}
30.endif
31SONAME?=	${SHLIB_NAME}
32.endif
33
34.if defined(CRUNCH_CFLAGS)
35CFLAGS+=	${CRUNCH_CFLAGS}
36.endif
37
38.if ${MK_ASSERT_DEBUG} == "no"
39CFLAGS+= -DNDEBUG
40NO_WERROR=
41.endif
42
43.if defined(DEBUG_FLAGS)
44CFLAGS+= ${DEBUG_FLAGS}
45
46.if ${MK_CTF} != "no" && ${DEBUG_FLAGS:M-g} != ""
47CTFFLAGS+= -g
48.endif
49.else
50STRIP?=	-s
51.endif
52
53.if ${MK_DEBUG_FILES} != "no" && empty(DEBUG_FLAGS:M-g) && \
54    empty(DEBUG_FLAGS:M-gdwarf*)
55SHARED_CFLAGS+= -g
56SHARED_CXXFLAGS+= -g
57CTFFLAGS+= -g
58.endif
59
60.include <bsd.libnames.mk>
61
62# prefer .s to a .c, add .po, remove stuff not used in the BSD libraries
63# .So used for PIC object files
64.SUFFIXES:
65.SUFFIXES: .out .o .po .So .S .asm .s .c .cc .cpp .cxx .C .f .y .l .ln
66
67.if !defined(PICFLAG)
68.if ${MACHINE_CPUARCH} == "sparc64"
69PICFLAG=-fPIC
70.else
71PICFLAG=-fpic
72.endif
73.endif
74
75PO_FLAG=-pg
76
77.c.o:
78	${CC} ${STATIC_CFLAGS} ${CFLAGS} -c ${.IMPSRC} -o ${.TARGET}
79	${CTFCONVERT_CMD}
80
81.c.po:
82	${CC} ${PO_FLAG} ${STATIC_CFLAGS} ${PO_CFLAGS} -c ${.IMPSRC} -o ${.TARGET}
83	${CTFCONVERT_CMD}
84
85.c.So:
86	${CC} ${PICFLAG} -DPIC ${SHARED_CFLAGS} ${CFLAGS} -c ${.IMPSRC} -o ${.TARGET}
87	${CTFCONVERT_CMD}
88
89.cc.o .C.o .cpp.o .cxx.o:
90	${CXX} ${STATIC_CXXFLAGS} ${CXXFLAGS} -c ${.IMPSRC} -o ${.TARGET}
91
92.cc.po .C.po .cpp.po .cxx.po:
93	${CXX} ${PO_FLAG} ${STATIC_CXXFLAGS} ${PO_CXXFLAGS} -c ${.IMPSRC} -o ${.TARGET}
94
95.cc.So .C.So .cpp.So .cxx.So:
96	${CXX} ${PICFLAG} -DPIC ${SHARED_CXXFLAGS} ${CXXFLAGS} -c ${.IMPSRC} -o ${.TARGET}
97
98.f.po:
99	${FC} -pg ${FFLAGS} -o ${.TARGET} -c ${.IMPSRC}
100	${CTFCONVERT_CMD}
101
102.f.So:
103	${FC} ${PICFLAG} -DPIC ${FFLAGS} -o ${.TARGET} -c ${.IMPSRC}
104	${CTFCONVERT_CMD}
105
106.s.po .s.So:
107	${AS} ${AFLAGS} -o ${.TARGET} ${.IMPSRC}
108	${CTFCONVERT_CMD}
109
110.asm.po:
111	${CC} -x assembler-with-cpp -DPROF ${PO_CFLAGS} ${ACFLAGS} \
112		-c ${.IMPSRC} -o ${.TARGET}
113	${CTFCONVERT_CMD}
114
115.asm.So:
116	${CC} -x assembler-with-cpp ${PICFLAG} -DPIC ${CFLAGS} ${ACFLAGS} \
117	    -c ${.IMPSRC} -o ${.TARGET}
118	${CTFCONVERT_CMD}
119
120.S.po:
121	${CC} -DPROF ${PO_CFLAGS} ${ACFLAGS} -c ${.IMPSRC} -o ${.TARGET}
122	${CTFCONVERT_CMD}
123
124.S.So:
125	${CC} ${PICFLAG} -DPIC ${CFLAGS} ${ACFLAGS} -c ${.IMPSRC} -o ${.TARGET}
126	${CTFCONVERT_CMD}
127
128all: beforebuild .WAIT
129beforebuild: objwarn
130
131.if defined(PRIVATELIB)
132_LIBDIR:=${LIBPRIVATEDIR}
133_SHLIBDIR:=${LIBPRIVATEDIR}
134.else
135_LIBDIR:=${LIBDIR}
136_SHLIBDIR:=${SHLIBDIR}
137.endif
138
139.if defined(SHLIB_NAME)
140.if ${MK_DEBUG_FILES} != "no"
141SHLIB_NAME_FULL=${SHLIB_NAME}.full
142# Use ${DEBUGDIR} for base system debug files, else .debug subdirectory
143.if ${_SHLIBDIR} == "/boot" ||\
144    ${SHLIBDIR:C%/lib(/.*)?$%/lib%} == "/lib" ||\
145    ${SHLIBDIR:C%/usr/lib(32)?(/.*)?%/usr/lib%} == "/usr/lib"
146DEBUGFILEDIR=${DEBUGDIR}${_SHLIBDIR}
147.else
148DEBUGFILEDIR=${_SHLIBDIR}/.debug
149DEBUGMKDIR=
150.endif
151.else
152SHLIB_NAME_FULL=${SHLIB_NAME}
153.endif
154.endif
155
156.include <bsd.symver.mk>
157
158# Allow libraries to specify their own version map or have it
159# automatically generated (see bsd.symver.mk above).
160.if ${MK_SYMVER} == "yes" && !empty(VERSION_MAP)
161${SHLIB_NAME_FULL}:	${VERSION_MAP}
162LDFLAGS+=	-Wl,--version-script=${VERSION_MAP}
163.endif
164
165.if defined(USEPRIVATELIB)
166LDFLAGS+= -rpath ${LIBPRIVATEDIR}
167.endif
168
169.if defined(LIB) && !empty(LIB) || defined(SHLIB_NAME)
170OBJS+=		${SRCS:N*.h:R:S/$/.o/}
171NOPATH_FILES+=	${OBJS}
172.endif
173
174.if defined(LIB) && !empty(LIB)
175_LIBS=		lib${LIB}.a
176
177lib${LIB}.a: ${OBJS} ${STATICOBJS}
178	@${ECHO} building static ${LIB} library
179	@rm -f ${.TARGET}
180	@${AR} ${ARFLAGS} ${.TARGET} `NM='${NM}' lorder ${OBJS} ${STATICOBJS} | tsort -q` ${ARADD}
181	${RANLIB} ${RANLIBFLAGS} ${.TARGET}
182.endif
183
184.if !defined(INTERNALLIB)
185
186.if ${MK_PROFILE} != "no" && defined(LIB) && !empty(LIB)
187_LIBS+=		lib${LIB}_p.a
188POBJS+=		${OBJS:.o=.po} ${STATICOBJS:.o=.po}
189NOPATH_FILES+=	${POBJS}
190
191lib${LIB}_p.a: ${POBJS}
192	@${ECHO} building profiled ${LIB} library
193	@rm -f ${.TARGET}
194	@${AR} ${ARFLAGS} ${.TARGET} `NM='${NM}' lorder ${POBJS} | tsort -q` ${ARADD}
195	${RANLIB} ${RANLIBFLAGS} ${.TARGET}
196.endif
197
198.if defined(SHLIB_NAME) || \
199    defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB)
200SOBJS+=		${OBJS:.o=.So}
201NOPATH_FILES+=	${SOBJS}
202.endif
203
204.if defined(SHLIB_NAME)
205_LIBS+=		${SHLIB_NAME}
206
207SOLINKOPTS=	-shared -Wl,-x
208.if !defined(ALLOW_SHARED_TEXTREL)
209.if defined(LD_FATAL_WARNINGS) && ${LD_FATAL_WARNINGS} == "no"
210SOLINKOPTS+=	-Wl,--no-fatal-warnings
211.else
212SOLINKOPTS+=	-Wl,--fatal-warnings
213.endif
214SOLINKOPTS+=	-Wl,--warn-shared-textrel
215.endif
216
217.if target(beforelinking)
218beforelinking: ${SOBJS}
219${SHLIB_NAME_FULL}: beforelinking
220.endif
221${SHLIB_NAME_FULL}: ${SOBJS}
222	@${ECHO} building shared library ${SHLIB_NAME}
223	@rm -f ${SHLIB_NAME} ${SHLIB_LINK}
224.if defined(SHLIB_LINK)
225	@${INSTALL_SYMLINK} ${SHLIB_NAME} ${SHLIB_LINK}
226.endif
227	${_LD} ${LDFLAGS} ${SSP_CFLAGS} ${SOLINKOPTS} \
228	    -o ${.TARGET} -Wl,-soname,${SONAME} \
229	    `NM='${NM}' lorder ${SOBJS} | tsort -q` ${LDADD}
230.if ${MK_CTF} != "no"
231	${CTFMERGE} ${CTFFLAGS} -o ${.TARGET} ${SOBJS}
232.endif
233
234.if ${MK_DEBUG_FILES} != "no"
235CLEANFILES+=	${SHLIB_NAME_FULL} ${SHLIB_NAME}.debug
236${SHLIB_NAME}: ${SHLIB_NAME_FULL} ${SHLIB_NAME}.debug
237	${OBJCOPY} --strip-debug --add-gnu-debuglink=${SHLIB_NAME}.debug \
238	    ${SHLIB_NAME_FULL} ${.TARGET}
239
240${SHLIB_NAME}.debug: ${SHLIB_NAME_FULL}
241	${OBJCOPY} --only-keep-debug ${SHLIB_NAME_FULL} ${.TARGET}
242.endif
243.endif #defined(SHLIB_NAME)
244
245.if defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB) && ${MK_TOOLCHAIN} != "no"
246_LIBS+=		lib${LIB}_pic.a
247
248lib${LIB}_pic.a: ${SOBJS}
249	@${ECHO} building special pic ${LIB} library
250	@rm -f ${.TARGET}
251	@${AR} ${ARFLAGS} ${.TARGET} ${SOBJS} ${ARADD}
252	${RANLIB} ${RANLIBFLAGS} ${.TARGET}
253.endif
254
255.if defined(WANT_LINT) && !defined(NO_LINT) && defined(LIB) && !empty(LIB)
256LINTLIB=	llib-l${LIB}.ln
257_LIBS+=		${LINTLIB}
258LINTOBJS+=	${SRCS:M*.c:.c=.ln}
259NOPATH_FILES+=	${LINTOBJS}
260
261${LINTLIB}: ${LINTOBJS}
262	@${ECHO} building lint library ${.TARGET}
263	@rm -f ${.TARGET}
264	${LINT} ${LINTLIBFLAGS} ${CFLAGS:M-[DIU]*} ${.ALLSRC}
265.endif
266
267.endif # !defined(INTERNALLIB)
268
269all: ${_LIBS}
270
271.if ${MK_MAN} != "no"
272all: _manpages
273.endif
274
275_EXTRADEPEND:
276	@TMP=_depend$$$$; \
277	sed -e 's/^\([^\.]*\).o[ ]*:/\1.o \1.po \1.So:/' < ${DEPENDFILE} \
278	    > $$TMP; \
279	mv $$TMP ${DEPENDFILE}
280.if !defined(NO_EXTRADEPEND) && defined(SHLIB_NAME)
281.if defined(DPADD) && !empty(DPADD)
282	echo ${SHLIB_NAME_FULL}: ${DPADD} >> ${DEPENDFILE}
283.endif
284.endif
285
286.if !target(install)
287
288.if defined(PRECIOUSLIB)
289.if !defined(NO_FSCHG)
290SHLINSTALLFLAGS+= -fschg
291.endif
292SHLINSTALLFLAGS+= -S
293.endif
294
295_INSTALLFLAGS:=	${INSTALLFLAGS}
296.for ie in ${INSTALLFLAGS_EDIT}
297_INSTALLFLAGS:=	${_INSTALLFLAGS${ie}}
298.endfor
299_SHLINSTALLFLAGS:=	${SHLINSTALLFLAGS}
300.for ie in ${INSTALLFLAGS_EDIT}
301_SHLINSTALLFLAGS:=	${_SHLINSTALLFLAGS${ie}}
302.endfor
303
304.if !defined(INTERNALLIB)
305realinstall: _libinstall
306.ORDER: beforeinstall _libinstall
307_libinstall:
308.if defined(LIB) && !empty(LIB) && ${MK_INSTALLLIB} != "no" && !defined(PRIVATELIB)
309	${INSTALL} -C -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
310	    ${_INSTALLFLAGS} lib${LIB}.a ${DESTDIR}${_LIBDIR}
311.endif
312.if ${MK_PROFILE} != "no" && defined(LIB) && !empty(LIB) && !defined(PRIVATELIB)
313	${INSTALL} -C -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
314	    ${_INSTALLFLAGS} lib${LIB}_p.a ${DESTDIR}${_LIBDIR}
315.endif
316.if defined(SHLIB_NAME)
317	${INSTALL} ${STRIP} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
318	    ${_INSTALLFLAGS} ${_SHLINSTALLFLAGS} \
319	    ${SHLIB_NAME} ${DESTDIR}${_SHLIBDIR}
320.if ${MK_DEBUG_FILES} != "no"
321.if defined(DEBUGMKDIR)
322	${INSTALL} -T debug -d ${DESTDIR}${DEBUGFILEDIR}
323.endif
324	${INSTALL} -T debug -o ${LIBOWN} -g ${LIBGRP} -m ${DEBUGMODE} \
325	    ${_INSTALLFLAGS} \
326	    ${SHLIB_NAME}.debug ${DESTDIR}${DEBUGFILEDIR}
327.endif
328.if defined(SHLIB_LINK) && !defined(PRIVATELIB)
329# ${_SHLIBDIRPREFIX} and ${_LDSCRIPTROOT} are both needed when cross-building
330# and when building 32 bits library shims.  ${_SHLIBDIRPREFIX} is the directory
331# prefix where shared objects will be installed by the install target.
332#
333# ${_LDSCRIPTROOT} is the directory prefix that will be used when generating
334# ld(1) scripts.  The crosstools' ld is configured to lookup libraries in an
335# alternative directory which is called "sysroot", so during buildworld binaries
336# won't be linked against the running system libraries but against the ones of
337# the current source tree.  ${_LDSCRIPTROOT} behavior is twisted because of
338# the location where we store them:
339# - 64 bits libs are located under sysroot, so ${_LDSCRIPTROOT} must be empty
340#   because ld(1) will manage to find them from sysroot;
341# - 32 bits shims are not, so ${_LDSCRIPTROOT} is used to specify their full
342#   path, outside of sysroot.
343# Note that ld(1) scripts are generated both during buildworld and
344# installworld; in the later case ${_LDSCRIPTROOT} must be obviously empty
345# because on the target system, libraries are meant to be looked up from /.
346.if defined(SHLIB_LDSCRIPT) && !empty(SHLIB_LDSCRIPT) && exists(${.CURDIR}/${SHLIB_LDSCRIPT})
347	sed -e 's,@@SHLIB@@,${_LDSCRIPTROOT}${_SHLIBDIR}/${SHLIB_NAME},g' \
348	    -e 's,@@LIBDIR@@,${_LDSCRIPTROOT}${_LIBDIR},g' \
349	    ${.CURDIR}/${SHLIB_LDSCRIPT} > ${DESTDIR}${_LIBDIR}/${SHLIB_LINK:R}.ld
350	${INSTALL} -S -C -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
351	    ${_INSTALLFLAGS} ${DESTDIR}${_LIBDIR}/${SHLIB_LINK:R}.ld \
352	    ${DESTDIR}${_LIBDIR}/${SHLIB_LINK}
353	rm -f ${DESTDIR}${_LIBDIR}/${SHLIB_LINK:R}.ld
354
355.else
356.if ${_SHLIBDIR} == ${_LIBDIR}
357	${INSTALL_SYMLINK} ${SHLIB_NAME} ${DESTDIR}${_LIBDIR}/${SHLIB_LINK}
358.else
359	${INSTALL_SYMLINK} ${_SHLIBDIRPREFIX}${_SHLIBDIR}/${SHLIB_NAME} \
360	    ${DESTDIR}${_LIBDIR}/${SHLIB_LINK}
361.if exists(${DESTDIR}${_LIBDIR}/${SHLIB_NAME})
362	-chflags noschg ${DESTDIR}${_LIBDIR}/${SHLIB_NAME}
363	rm -f ${DESTDIR}${_LIBDIR}/${SHLIB_NAME}
364.endif
365.endif
366.endif # SHLIB_LDSCRIPT
367.endif # SHLIB_LINK
368.endif # SHIB_NAME
369.if defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB) && ${MK_TOOLCHAIN} != "no" && !defined(PRIVATELIB)
370	${INSTALL} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
371	    ${_INSTALLFLAGS} lib${LIB}_pic.a ${DESTDIR}${_LIBDIR}
372.endif
373.if defined(WANT_LINT) && !defined(NO_LINT) && defined(LIB) && !empty(LIB)
374	${INSTALL} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
375	    ${_INSTALLFLAGS} ${LINTLIB} ${DESTDIR}${LINTLIBDIR}
376.endif
377.endif # !defined(INTERNALLIB)
378
379.if !defined(LIBRARIES_ONLY)
380.include <bsd.nls.mk>
381.include <bsd.files.mk>
382.include <bsd.incs.mk>
383.endif
384
385.include <bsd.links.mk>
386
387.if ${MK_MAN} != "no" && !defined(LIBRARIES_ONLY)
388realinstall: _maninstall
389.ORDER: beforeinstall _maninstall
390.endif
391
392.endif
393
394.if !target(lint)
395lint: ${SRCS:M*.c}
396	${LINT} ${LINTFLAGS} ${CFLAGS:M-[DIU]*} ${.ALLSRC}
397.endif
398
399.if ${MK_MAN} != "no" && !defined(LIBRARIES_ONLY)
400.include <bsd.man.mk>
401.endif
402
403.include <bsd.dep.mk>
404
405.if !exists(${.OBJDIR}/${DEPENDFILE})
406.if defined(LIB) && !empty(LIB)
407${OBJS} ${STATICOBJS} ${POBJS}: ${SRCS:M*.h}
408.for _S in ${SRCS:N*.[hly]}
409${_S:R}.po: ${_S}
410.endfor
411.endif
412.if defined(SHLIB_NAME) || \
413    defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB)
414${SOBJS}: ${SRCS:M*.h}
415.for _S in ${SRCS:N*.[hly]}
416${_S:R}.So: ${_S}
417.endfor
418.endif
419.endif
420
421.if !target(clean)
422clean:
423.if defined(CLEANFILES) && !empty(CLEANFILES)
424	rm -f ${CLEANFILES}
425.endif
426.if defined(LIB) && !empty(LIB)
427	rm -f a.out ${OBJS} ${OBJS:S/$/.tmp/} ${STATICOBJS}
428.endif
429.if !defined(INTERNALLIB)
430.if ${MK_PROFILE} != "no" && defined(LIB) && !empty(LIB)
431	rm -f ${POBJS} ${POBJS:S/$/.tmp/}
432.endif
433.if defined(SHLIB_NAME) || \
434    defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB)
435	rm -f ${SOBJS} ${SOBJS:.So=.so} ${SOBJS:S/$/.tmp/}
436.endif
437.if defined(SHLIB_NAME)
438.if defined(SHLIB_LINK)
439.if defined(SHLIB_LDSCRIPT) && exists(${.CURDIR}/${SHLIB_LDSCRIPT})
440	rm -f lib${LIB}.ld
441.endif
442	rm -f ${SHLIB_LINK}
443.endif
444.endif # defined(SHLIB_NAME)
445.if defined(WANT_LINT) && defined(LIB) && !empty(LIB)
446	rm -f ${LINTOBJS}
447.endif
448.endif # !defined(INTERNALLIB)
449.if defined(_LIBS) && !empty(_LIBS)
450	rm -f ${_LIBS}
451.endif
452.if defined(CLEANDIRS) && !empty(CLEANDIRS)
453	rm -rf ${CLEANDIRS}
454.endif
455.if !empty(VERSION_DEF) && !empty(SYMBOL_MAPS)
456	rm -f ${VERSION_MAP}
457.endif
458.endif
459
460.if !empty(_LIBS)
461NOPATH_FILES+=	${_LIBS}
462.endif
463
464.include <bsd.obj.mk>
465
466.include <bsd.sys.mk>
467