xref: /dragonfly/share/mk/bsd.lib.mk (revision c1f23d16)
1#	from: @(#)bsd.lib.mk	5.26 (Berkeley) 5/2/91
2# $FreeBSD: src/share/mk/bsd.lib.mk,v 1.91.2.15 2002/08/07 16:31:50 ru Exp $
3#
4
5.include <bsd.init.mk>
6
7# Set up the variables controlling shared libraries.  After this section,
8# SHLIB_NAME will be defined only if we are to create a shared library.
9# SHLIB_LINK will be defined only if we are to create a link to it.
10# INSTALL_PIC_ARCHIVE will be defined only if we are to create a PIC archive.
11.if defined(NOPIC)
12.undef SHLIB_NAME
13.undef INSTALL_PIC_ARCHIVE
14.else
15.if !defined(SHLIB_NAME) && defined(LIB) && defined(SHLIB_MAJOR)
16SHLIB_NAME=	lib${LIB}.so.${SHLIB_MAJOR}
17.endif
18.if defined(SHLIB_NAME) && ${SHLIB_NAME:M*.so.*}
19SHLIB_LINK?=	${SHLIB_NAME:R}
20.endif
21SONAME?=	${SHLIB_NAME}
22.endif
23
24.if defined(DEBUG_FLAGS)
25CFLAGS+= ${DEBUG_FLAGS}
26.else
27STRIP?=	-s
28.endif
29
30.include <bsd.libnames.mk>
31
32.if !defined(PRIVATELIB)
33TARGET_LIBDIR?=		${LIBDIR}
34TARGET_DEBUGLIBDIR?=	${DEBUGLIBDIR}
35TARGET_PROFLIBDIR?=	${PROFLIBDIR}
36TARGET_SHLIBDIR?=	${SHLIBDIR}
37.else
38TARGET_LIBDIR?=		${LIBDIR}/priv
39TARGET_DEBUGLIBDIR?=	${DEBUGLIBDIR:S!/debug$!/priv/debug!}
40TARGET_PROFLIBDIR?=	${PROFLIBDIR:S!/profile$!/priv/profile!}
41TARGET_SHLIBDIR?=	${SHLIBDIR}/priv
42.endif
43
44PRIVATELIB_CFLAGS?=	-I${_SHLIBDIRPREFIX}/usr/include/priv
45PRIVATELIB_LDFLAGS?=	-rpath /lib/priv -L ${_SHLIBDIRPREFIX}/usr/lib/priv
46
47# prefer .s to a .c, add .po, remove stuff not used in the BSD libraries
48# .So used for PIC object files
49.SUFFIXES:
50.SUFFIXES: .out .o .po .So .S .s .c .cc .cpp .cxx .m .C .f .y .l
51
52.if !defined(PICFLAG)
53PICFLAG=-fpic
54.endif
55
56PO_FLAG=-pg
57PO_CFLAGS=${CFLAGS:N-ffunction-sections}
58PO_CXXFLAGS=${CXXFLAGS:N-ffunction-sections}
59
60.c.o:
61	${CC} ${_${.IMPSRC:T}_FLAGS} ${STATIC_CFLAGS} ${CFLAGS} -c ${.IMPSRC} -o ${.TARGET}
62
63.c.po:
64	${CC} ${_${.IMPSRC:T}_FLAGS} ${PO_FLAG} ${STATIC_CFLAGS} ${PO_CFLAGS} -c ${.IMPSRC} -o ${.TARGET}
65
66.c.So:
67	${CC} ${_${.IMPSRC:T}_FLAGS} ${PICFLAG} -DPIC ${SHARED_CFLAGS} ${CFLAGS} -c ${.IMPSRC} -o ${.TARGET}
68
69.cc.o .C.o .cpp.o .cxx.o:
70	${CXX} ${_${.IMPSRC:T}_FLAGS} ${STATIC_CXXFLAGS} ${CXXFLAGS} -c ${.IMPSRC} -o ${.TARGET}
71
72.cc.po .C.po .cpp.po .cxx.po:
73	${CXX} ${_${.IMPSRC:T}_FLAGS} ${PO_FLAG} ${STATIC_CXXFLAGS} ${PO_CXXFLAGS} -c ${.IMPSRC} -o ${.TARGET}
74
75.cc.So .C.So .cpp.So .cxx.So:
76	${CXX} ${_${.IMPSRC:T}_FLAGS} ${PICFLAG} -DPIC ${SHARED_CXXFLAGS} ${CXXFLAGS} -c ${.IMPSRC} -o ${.TARGET}
77
78.f.o:
79	${FC} ${_${.IMPSRC:T}_FLAGS} ${FFLAGS} -o ${.TARGET} -c ${.IMPSRC}
80
81.f.po:
82	${FC} ${_${.IMPSRC:T}_FLAGS} ${PO_FLAG} ${FFLAGS} -o ${.TARGET} -c ${.IMPSRC}
83
84.f.So:
85	${FC} ${_${.IMPSRC:T}_FLAGS} ${PICFLAG} -DPIC ${FFLAGS} -o ${.TARGET} -c ${.IMPSRC}
86
87.m.o:
88	${OBJC} ${_${.IMPSRC:T}_FLAGS} ${OBJCFLAGS} -c ${.IMPSRC} -o ${.TARGET}
89
90.m.po:
91	${OBJC} ${_${.IMPSRC:T}_FLAGS} ${OBJCFLAGS} ${PO_FLAG} -c ${.IMPSRC} -o ${.TARGET}
92
93.m.So:
94	${OBJC} ${_${.IMPSRC:T}_FLAGS} ${PICFLAG} -DPIC ${OBJCFLAGS} -c ${.IMPSRC} -o ${.TARGET}
95
96.s.o:
97	${CC} ${_${.IMPSRC:T}_FLAGS} -x assembler-with-cpp ${CFLAGS} -c \
98	    ${.IMPSRC} -o ${.TARGET}
99
100.s.po:
101	${CC} ${_${.IMPSRC:T}_FLAGS} -x assembler-with-cpp -DPROF ${CFLAGS} -c \
102	    ${.IMPSRC} -o ${.TARGET}
103
104.s.So:
105	${CC} ${_${.IMPSRC:T}_FLAGS} -x assembler-with-cpp ${PICFLAG} -DPIC ${CFLAGS} \
106	    -c ${.IMPSRC} -o ${.TARGET}
107
108.S.o:
109	${CC} ${_${.IMPSRC:T}_FLAGS} ${CFLAGS} -c ${.IMPSRC} -o ${.TARGET}
110
111.S.po:
112	${CC} ${_${.IMPSRC:T}_FLAGS} -DPROF ${CFLAGS} -c ${.IMPSRC} -o ${.TARGET}
113
114.S.So:
115	${CC} ${_${.IMPSRC:T}_FLAGS} ${PICFLAG} -DPIC ${CFLAGS} -c ${.IMPSRC} \
116	    -o ${.TARGET}
117
118all: objwarn
119
120.include <bsd.symver.mk>
121
122# Allow libraries to specify their own version map or have it
123# automatically generated (see bsd.symver.mk above).
124.if !defined(NO_SYMVER) && !empty(VERSION_MAP)
125${SHLIB_NAME}:	${VERSION_MAP}
126LDFLAGS+=	-Wl,--version-script=${VERSION_MAP}
127.endif
128
129.include <bsd.patch.mk>
130
131.if defined(LIB) && !empty(LIB) || defined(SHLIB_NAME)
132. if !empty(SRCS)
133OBJS+=  ${SRCS:N*.h:N*.patch:R:S/$/.o/g}
134. endif
135.endif
136
137.if defined(LIB) && !empty(LIB)
138_LIBS=		lib${LIB}.a
139
140. if ! target(lib${LIB}.a)
141lib${LIB}.a: ${OBJS} ${STATICOBJS}
142	@${ECHO} building static ${LIB} library
143	rm -f ${.TARGET}
144	${AR} cq ${.TARGET} `lorder ${OBJS} ${STATICOBJS} | tsort -q` ${ARADD}
145	${RANLIB} ${.TARGET}
146. endif
147.endif
148
149.if !defined(INTERNALLIB) || defined(INTERNALLIBPROF)
150. if !defined(NOPROFILE) && defined(LIB) && !empty(LIB)
151_LIBS+=		lib${LIB}_p.a
152POBJS+=		${OBJS:.o=.po} ${STATICOBJS:.o=.po}
153
154.  if ! target(lib${LIB}_p.a)
155lib${LIB}_p.a: ${POBJS}
156	@${ECHO} building profiled ${LIB} library
157	rm -f ${.TARGET}
158	${AR} cq ${.TARGET} `lorder ${POBJS} | tsort -q` ${ARADD}
159	${RANLIB} ${.TARGET}
160.  endif
161. endif
162.endif
163
164.if !defined(INTERNALLIB) && defined(SHLIB_NAME) || \
165    defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB)
166SOBJS+=		${OBJS:.o=.So}
167.endif
168
169.if !defined(INTERNALLIB) && defined(SHLIB_NAME)
170_LIBS+=		${SHLIB_NAME}
171
172${SHLIB_NAME}: ${SOBJS}
173	@${ECHO} building shared library ${SHLIB_NAME}
174	rm -f ${.TARGET} ${SHLIB_LINK}
175.if defined(SHLIB_LINK)
176	${LN} -fs ${.TARGET} ${SHLIB_LINK}
177.endif
178	${CC_LINK} ${LDFLAGS} -shared -Wl,-x \
179	    -o ${.TARGET} -Wl,-soname,${SONAME} \
180	    `lorder ${SOBJS} | tsort -q` ${LDADD}
181.endif
182
183.if defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB)
184_LIBS+=		lib${LIB}_pic.a
185
186lib${LIB}_pic.a: ${SOBJS}
187	@${ECHO} building special pic ${LIB} library
188	rm -f ${.TARGET}
189	${AR} cq ${.TARGET} ${SOBJS} ${ARADD}
190	${RANLIB} ${.TARGET}
191.endif
192
193all: ${_LIBS}
194
195.if !defined(NOMAN)
196all: _manpages
197.endif
198
199_EXTRADEPEND:
200.if !defined(NOIMPLICITDEPEND)
201	@TMP=_depend$$$$; \
202	sed -e 's/^\([^\.]*\).o[ ]*:/\1.o \1.po \1.So:/' < ${DEPENDFILE} \
203	    > $$TMP; \
204	mv $$TMP ${DEPENDFILE}
205.endif
206.if !defined(NOEXTRADEPEND) && defined(SHLIB_NAME)
207.if defined(DPADD) && !empty(DPADD)
208	echo ${SHLIB_NAME}: ${DPADD} >> ${DEPENDFILE}
209.endif
210.endif
211
212.if !target(install)
213
214.if defined(PRECIOUSLIB) && !defined(NOFSCHG)
215SHLINSTALLFLAGS+= -fschg
216.endif
217
218_INSTALLFLAGS:=	${INSTALLFLAGS}
219.for ie in ${INSTALLFLAGS_EDIT}
220_INSTALLFLAGS:=	${_INSTALLFLAGS${ie}}
221.endfor
222_SHLINSTALLFLAGS:=	${SHLINSTALLFLAGS}
223.for ie in ${INSTALLFLAGS_EDIT}
224_SHLINSTALLFLAGS:=	${_SHLINSTALLFLAGS${ie}}
225.endfor
226
227.if !defined(INTERNALLIB)
228realinstall: _libinstall
229.ORDER: beforeinstall _libinstall
230_libinstall:
231.if defined(LIB) && !empty(LIB) && !defined(NOINSTALLLIB)
232	${INSTALL} -C -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
233	    ${_INSTALLFLAGS} lib${LIB}.a ${DESTDIR}${TARGET_LIBDIR}
234.endif
235.if !defined(NOPROFILE) && defined(LIB) && !empty(LIB)
236	${INSTALL} -C -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
237	    ${_INSTALLFLAGS} lib${LIB}_p.a ${DESTDIR}${TARGET_PROFLIBDIR}/lib${LIB}.a
238.endif
239.if defined(SHLIB_NAME)
240	${INSTALL} ${STRIP} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
241	    ${_INSTALLFLAGS} ${_SHLINSTALLFLAGS} \
242	    ${SHLIB_NAME} ${DESTDIR}${TARGET_SHLIBDIR}
243.if defined(SHLIB_LINK)
244.if ${SHLIBDIR} == ${LIBDIR}
245	${LN} -fs ${SHLIB_NAME} ${DESTDIR}${TARGET_SHLIBDIR}/${SHLIB_LINK}
246.else
247	${LN} -fs ${_SHLIBDIRPREFIX}${TARGET_SHLIBDIR}/${SHLIB_NAME} \
248	    ${DESTDIR}${TARGET_LIBDIR}/${SHLIB_LINK}
249.endif
250.endif
251.endif
252.if defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB)
253	${INSTALL} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
254	    ${_INSTALLFLAGS} lib${LIB}_pic.a ${DESTDIR}${TARGET_LIBDIR}
255.endif
256.endif # !defined(INTERNALLIB)
257
258.include <bsd.nls.mk>
259.include <bsd.files.mk>
260.include <bsd.incs.mk>
261.include <bsd.links.mk>
262
263.if !defined(NOMAN)
264realinstall: _maninstall
265.ORDER: beforeinstall _maninstall
266.endif
267
268.endif
269
270.if !defined(NOMAN)
271.include <bsd.man.mk>
272.endif
273
274.include <bsd.dep.mk>
275
276.if !exists(${.OBJDIR}/${DEPENDFILE})
277.if defined(LIB) && !empty(LIB)
278${OBJS} ${STATICOBJS} ${POBJS}: ${SRCS:M*.h}
279.endif
280.if defined(SHLIB_NAME) || \
281    defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB)
282${SOBJS}: ${SRCS:M*.h}
283.endif
284.endif
285
286.if !target(clean)
287clean:
288.if defined(CLEANFILES) && !empty(CLEANFILES)
289	rm -f ${CLEANFILES}
290.endif
291.if defined(LIB) && !empty(LIB)
292	rm -f a.out ${OBJS} ${OBJS:S/$/.tmp/} ${STATICOBJS}
293.endif
294.if defined(SHLIB_NAME) || \
295    defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB)
296	rm -f ${SOBJS} ${SOBJS:.So=.so} ${SOBJS:S/$/.tmp/}
297.endif
298.if !defined(INTERNALLIB) || defined(INTERNALLIBPROF)
299.if !defined(NOPROFILE) && defined(LIB) && !empty(LIB)
300	rm -f ${POBJS} ${POBJS:S/$/.tmp/}
301.endif
302.endif # !defined(INTERNALLIB) || defined(INTERNALLIBPROF)
303.if !defined(INTERNALLIB)
304.if defined(SHLIB_NAME)
305.if defined(SHLIB_LINK)
306	rm -f ${SHLIB_LINK}
307.endif
308.if defined(LIB) && !empty(LIB)
309	rm -f lib${LIB}.so.* lib${LIB}.so
310.endif
311.endif
312.endif # !defined(INTERNALLIB)
313.if defined(_LIBS) && !empty(_LIBS)
314	rm -f ${_LIBS}
315.endif
316.if defined(CLEANDIRS) && !empty(CLEANDIRS)
317	rm -rf ${CLEANDIRS}
318.endif
319.endif
320
321.include <bsd.obj.mk>
322
323.include <bsd.sys.mk>
324
325