bsd.lib.mk revision 156854
1238384Sjkim#	from: @(#)bsd.lib.mk	5.26 (Berkeley) 5/2/91
2238384Sjkim# $FreeBSD: head/share/mk/bsd.lib.mk 156854 2006-03-18 21:37:05Z ru $
3238384Sjkim#
4238384Sjkim
5238384Sjkim.include <bsd.init.mk>
6238384Sjkim
7238384Sjkim# Set up the variables controlling shared libraries.  After this section,
8238384Sjkim# SHLIB_NAME will be defined only if we are to create a shared library.
9280297Sjkim# SHLIB_LINK will be defined only if we are to create a link to it.
10238384Sjkim# INSTALL_PIC_ARCHIVE will be defined only if we are to create a PIC archive.
11238384Sjkim.if defined(NO_PIC)
12238384Sjkim.undef SHLIB_NAME
13238384Sjkim.undef INSTALL_PIC_ARCHIVE
14238384Sjkim.else
15238384Sjkim.if !defined(SHLIB) && defined(LIB)
16238384SjkimSHLIB=		${LIB}
17238384Sjkim.endif
18238384Sjkim.if !defined(SHLIB_NAME) && defined(SHLIB) && defined(SHLIB_MAJOR)
19238384SjkimSHLIB_NAME=	lib${SHLIB}.so.${SHLIB_MAJOR}
20238384Sjkim.endif
21238384Sjkim.if defined(SHLIB_NAME) && !empty(SHLIB_NAME:M*.so.*)
22238384SjkimSHLIB_LINK?=	${SHLIB_NAME:R}
23238384Sjkim.endif
24238384SjkimSONAME?=	${SHLIB_NAME}
25238384Sjkim.endif
26238384Sjkim
27238384Sjkim.if defined(CRUNCH_CFLAGS)
28238384SjkimCFLAGS+=	${CRUNCH_CFLAGS}
29238384Sjkim.endif
30238384Sjkim
31238384Sjkim.if defined(DEBUG_FLAGS)
32238384SjkimCFLAGS+= ${DEBUG_FLAGS}
33238384Sjkim.endif
34238384Sjkim
35238384Sjkim.if !defined(DEBUG_FLAGS)
36238384SjkimSTRIP?=	-s
37238384Sjkim.endif
38238384Sjkim
39238384Sjkim.include <bsd.libnames.mk>
40238384Sjkim
41238384Sjkim# prefer .s to a .c, add .po, remove stuff not used in the BSD libraries
42238384Sjkim# .So used for PIC object files
43238384Sjkim.SUFFIXES:
44238384Sjkim.SUFFIXES: .out .o .po .So .S .asm .s .c .cc .cpp .cxx .m .C .f .y .l .ln
45238384Sjkim
46238384Sjkim.if !defined(PICFLAG)
47238384Sjkim.if ${MACHINE_ARCH} == "sparc64"
48238384SjkimPICFLAG=-fPIC
49238384Sjkim.else
50238384SjkimPICFLAG=-fpic
51238384Sjkim.endif
52238384Sjkim.endif
53238384Sjkim
54238384Sjkim.if ${CC} == "icc"
55238384SjkimPO_FLAG=-p
56238384Sjkim.else
57238384SjkimPO_FLAG=-pg
58238384Sjkim.endif
59238384Sjkim
60238384Sjkim.c.po:
61238384Sjkim	${CC} ${PO_FLAG} ${CFLAGS} -c ${.IMPSRC} -o ${.TARGET}
62280297Sjkim
63280297Sjkim.c.So:
64280297Sjkim	${CC} ${PICFLAG} -DPIC ${CFLAGS} -c ${.IMPSRC} -o ${.TARGET}
65280297Sjkim
66238384Sjkim.cc.po .C.po .cpp.po .cxx.po:
67238384Sjkim	${CXX} ${PO_FLAG} ${CXXFLAGS} -c ${.IMPSRC} -o ${.TARGET}
68280297Sjkim
69280297Sjkim.cc.So .C.So .cpp.So .cxx.So:
70280297Sjkim	${CXX} ${PICFLAG} -DPIC ${CXXFLAGS} -c ${.IMPSRC} -o ${.TARGET}
71238384Sjkim
72238384Sjkim.f.po:
73238384Sjkim	${FC} -pg ${FFLAGS} -o ${.TARGET} -c ${.IMPSRC}
74238384Sjkim
75238384Sjkim.f.So:
76238384Sjkim	${FC} ${PICFLAG} -DPIC ${FFLAGS} -o ${.TARGET} -c ${.IMPSRC}
77238384Sjkim
78238384Sjkim.m.po:
79238384Sjkim	${OBJC} ${OBJCFLAGS} -pg -c ${.IMPSRC} -o ${.TARGET}
80238384Sjkim
81280297Sjkim.m.So:
82280297Sjkim	${OBJC} ${PICFLAG} -DPIC ${OBJCFLAGS} -c ${.IMPSRC} -o ${.TARGET}
83280297Sjkim
84280297Sjkim.s.po .s.So:
85280297Sjkim	${AS} ${AFLAGS} -o ${.TARGET} ${.IMPSRC}
86280297Sjkim
87280297Sjkim.asm.po:
88280297Sjkim	${CC} -x assembler-with-cpp -DPROF ${CFLAGS} -c ${.IMPSRC} -o ${.TARGET}
89280297Sjkim
90280297Sjkim.asm.So:
91280297Sjkim	${CC} -x assembler-with-cpp ${PICFLAG} -DPIC ${CFLAGS} \
92280297Sjkim	    -c ${.IMPSRC} -o ${.TARGET}
93280297Sjkim
94280297Sjkim.S.po:
95280297Sjkim	${CC} -DPROF ${CFLAGS} -c ${.IMPSRC} -o ${.TARGET}
96280297Sjkim
97280297Sjkim.S.So:
98280297Sjkim	${CC} ${PICFLAG} -DPIC ${CFLAGS} -c ${.IMPSRC} -o ${.TARGET}
99280297Sjkim
100280297Sjkimall: objwarn
101280297Sjkim
102280297Sjkim# Generate the version map given the version definitions
103280297Sjkim# and symbol maps.
104280297Sjkim.if !empty(VERSION_DEF) && !empty(SYMBOL_MAPS)
105280297Sjkim# Find the awk script that generates the version map.
106280297SjkimVERSION_GEN?=	version_gen.awk
107280297SjkimVERSION_MAP?=	Version.map
108280297Sjkim
109280297Sjkim# Compute the make's -m path.
110280297Sjkim_mpath=
111280297Sjkim_oarg=
112280297Sjkim.for _arg in ${.MAKEFLAGS}
113280297Sjkim.if ${_oarg} == "-m"
114280297Sjkim_mpath+= ${_arg}
115280297Sjkim.endif
116238384Sjkim_oarg=  ${_arg}
117280297Sjkim.endfor
118280297Sjkim_mpath+= /usr/share/mk
119280297Sjkim
120280297Sjkim# Look up ${VERSION_GEN} in ${_mpath}.
121280297Sjkim_vgen=
122280297Sjkim.for path in ${_mpath}
123280297Sjkim.if empty(_vgen)
124280297Sjkim.if exists(${path}/${VERSION_GEN})
125280297Sjkim_vgen=  ${path}/${VERSION_GEN}
126238384Sjkim.endif
127238384Sjkim.endif
128280297Sjkim.endfor
129280297Sjkim
130280297Sjkim${VERSION_MAP}:
131280297Sjkim	awk -v vfile=${VERSION_DEF} -f ${_vgen} ${SYMBOL_MAPS} \
132280297Sjkim	    > ${.TARGET}
133280297Sjkim.endif	# !empty(VERSION_DEF) && !empty(SYMBOL_MAPS)
134280297Sjkim
135280297Sjkim# Allow librararies to specify their own version map or have it
136280297Sjkim# automatically generated (see above).
137280297Sjkim.if !empty(VERSION_MAP)
138280297Sjkim${SHLIB_NAME}:	${VERSION_MAP}
139280297SjkimLDFLAGS+=	-Wl,--version-script=${VERSION_MAP}
140280297Sjkim.endif
141280297Sjkim
142280297Sjkim.if defined(LIB) && !empty(LIB) || defined(SHLIB_NAME)
143280297SjkimOBJS+=		${SRCS:N*.h:R:S/$/.o/}
144280297Sjkim.endif
145280297Sjkim
146280297Sjkim.if defined(LIB) && !empty(LIB)
147280297Sjkim_LIBS=		lib${LIB}.a
148280297Sjkim
149280297Sjkimlib${LIB}.a: ${OBJS} ${STATICOBJS}
150280297Sjkim	@${ECHO} building static ${LIB} library
151280297Sjkim	@rm -f ${.TARGET}
152280297Sjkim	@${AR} cq ${.TARGET} `lorder ${OBJS} ${STATICOBJS} | tsort -q` ${ARADD}
153280297Sjkim	${RANLIB} ${.TARGET}
154280297Sjkim.endif
155280297Sjkim
156280297Sjkim.if !defined(INTERNALLIB)
157280297Sjkim
158280297Sjkim.if ${MK_PROFILE} != "no" && defined(LIB) && !empty(LIB)
159280297Sjkim_LIBS+=		lib${LIB}_p.a
160280297SjkimPOBJS+=		${OBJS:.o=.po} ${STATICOBJS:.o=.po}
161280297Sjkim
162280297Sjkimlib${LIB}_p.a: ${POBJS}
163280297Sjkim	@${ECHO} building profiled ${LIB} library
164280297Sjkim	@rm -f ${.TARGET}
165280297Sjkim	@${AR} cq ${.TARGET} `lorder ${POBJS} | tsort -q` ${ARADD}
166280297Sjkim	${RANLIB} ${.TARGET}
167280297Sjkim.endif
168238384Sjkim
169280297Sjkim.if defined(SHLIB_NAME) || \
170280297Sjkim    defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB)
171280297SjkimSOBJS+=		${OBJS:.o=.So}
172280297Sjkim.endif
173280297Sjkim
174280297Sjkim.if defined(SHLIB_NAME)
175280297Sjkim_LIBS+=		${SHLIB_NAME}
176280297Sjkim
177280297Sjkim${SHLIB_NAME}: ${SOBJS}
178280297Sjkim	@${ECHO} building shared library ${SHLIB_NAME}
179280297Sjkim	@rm -f ${.TARGET} ${SHLIB_LINK}
180238384Sjkim.if defined(SHLIB_LINK)
181238384Sjkim	@ln -fs ${.TARGET} ${SHLIB_LINK}
182238384Sjkim.endif
183280297Sjkim	@${CC} ${LDFLAGS} -shared -Wl,-x \
184280297Sjkim	    -o ${.TARGET} -Wl,-soname,${SONAME} \
185280297Sjkim	    `lorder ${SOBJS} | tsort -q` ${LDADD}
186280297Sjkim.endif
187280297Sjkim
188280297Sjkim.if defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB) && ${MK_TOOLCHAIN} != "no"
189280297Sjkim_LIBS+=		lib${LIB}_pic.a
190280297Sjkim
191238384Sjkimlib${LIB}_pic.a: ${SOBJS}
192280297Sjkim	@${ECHO} building special pic ${LIB} library
193280297Sjkim	@rm -f ${.TARGET}
194280297Sjkim	@${AR} cq ${.TARGET} ${SOBJS} ${ARADD}
195238384Sjkim	${RANLIB} ${.TARGET}
196280297Sjkim.endif
197280297Sjkim
198238384Sjkim.if defined(WANT_LINT) && !defined(NO_LINT) && defined(LIB) && !empty(LIB)
199280297SjkimLINTLIB=	llib-l${LIB}.ln
200280297Sjkim_LIBS+=		${LINTLIB}
201280297SjkimLINTOBJS+=	${SRCS:M*.c:.c=.ln}
202280297Sjkim
203280297Sjkim${LINTLIB}: ${LINTOBJS}
204280297Sjkim	@${ECHO} building lint library ${.TARGET}
205280297Sjkim	@rm -f ${.TARGET}
206280297Sjkim	${LINT} ${LINTLIBFLAGS} ${CFLAGS:M-[DIU]*} ${.ALLSRC}
207280297Sjkim.endif
208280297Sjkim
209280297Sjkim.endif # !defined(INTERNALLIB)
210280297Sjkim
211280297Sjkimall: ${_LIBS}
212280297Sjkim
213280297Sjkim.if ${MK_MAN} != "no"
214280297Sjkimall: _manpages
215280297Sjkim.endif
216280297Sjkim
217280297Sjkim_EXTRADEPEND:
218238384Sjkim	@TMP=_depend$$$$; \
219238384Sjkim	sed -e 's/^\([^\.]*\).o[ ]*:/\1.o \1.po \1.So:/' < ${DEPENDFILE} \
220238384Sjkim	    > $$TMP; \
221238384Sjkim	mv $$TMP ${DEPENDFILE}
222238384Sjkim.if !defined(NO_EXTRADEPEND) && defined(SHLIB_NAME)
223238384Sjkim.if defined(DPADD) && !empty(DPADD)
224280297Sjkim	echo ${SHLIB_NAME}: ${DPADD} >> ${DEPENDFILE}
225280297Sjkim.endif
226280297Sjkim.endif
227238384Sjkim
228238384Sjkim.if !target(install)
229280297Sjkim
230238384Sjkim.if defined(PRECIOUSLIB)
231238384Sjkim.if !defined(NO_FSCHG)
232238384SjkimSHLINSTALLFLAGS+= -fschg
233238384Sjkim.endif
234280297SjkimSHLINSTALLFLAGS+= -S
235280297Sjkim.endif
236280297Sjkim
237280297Sjkim_INSTALLFLAGS:=	${INSTALLFLAGS}
238280297Sjkim.for ie in ${INSTALLFLAGS_EDIT}
239280297Sjkim_INSTALLFLAGS:=	${_INSTALLFLAGS${ie}}
240238384Sjkim.endfor
241238384Sjkim_SHLINSTALLFLAGS:=	${SHLINSTALLFLAGS}
242238384Sjkim.for ie in ${INSTALLFLAGS_EDIT}
243280297Sjkim_SHLINSTALLFLAGS:=	${_SHLINSTALLFLAGS${ie}}
244280297Sjkim.endfor
245280297Sjkim
246238384Sjkim.if !defined(INTERNALLIB)
247238384Sjkimrealinstall: _libinstall
248238384Sjkim.ORDER: beforeinstall _libinstall
249238384Sjkim_libinstall:
250238384Sjkim.if defined(LIB) && !empty(LIB) && !defined(NO_INSTALLLIB)
251238384Sjkim	${INSTALL} -C -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
252280297Sjkim	    ${_INSTALLFLAGS} lib${LIB}.a ${DESTDIR}${LIBDIR}
253280297Sjkim.endif
254238384Sjkim.if ${MK_PROFILE} != "no" && defined(LIB) && !empty(LIB)
255	${INSTALL} -C -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
256	    ${_INSTALLFLAGS} lib${LIB}_p.a ${DESTDIR}${LIBDIR}
257.endif
258.if defined(SHLIB_NAME)
259	${INSTALL} ${STRIP} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
260	    ${_INSTALLFLAGS} ${_SHLINSTALLFLAGS} \
261	    ${SHLIB_NAME} ${DESTDIR}${SHLIBDIR}
262.if defined(SHLIB_LINK)
263.if ${SHLIBDIR} == ${LIBDIR}
264	ln -fs ${SHLIB_NAME} ${DESTDIR}${LIBDIR}/${SHLIB_LINK}
265.else
266	ln -fs ${_SHLIBDIRPREFIX}${SHLIBDIR}/${SHLIB_NAME} \
267	    ${DESTDIR}${LIBDIR}/${SHLIB_LINK}
268.if exists(${DESTDIR}${LIBDIR}/${SHLIB_NAME})
269	-chflags noschg ${DESTDIR}${LIBDIR}/${SHLIB_NAME}
270	rm -f ${DESTDIR}${LIBDIR}/${SHLIB_NAME}
271.endif
272.endif
273.endif
274.endif
275.if defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB) && ${MK_TOOLCHAIN} != "no"
276	${INSTALL} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
277	    ${_INSTALLFLAGS} lib${LIB}_pic.a ${DESTDIR}${LIBDIR}
278.endif
279.if defined(WANT_LINT) && !defined(NO_LINT) && defined(LIB) && !empty(LIB)
280	${INSTALL} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
281	    ${_INSTALLFLAGS} ${LINTLIB} ${DESTDIR}${LINTLIBDIR}
282.endif
283.endif # !defined(INTERNALLIB)
284
285.include <bsd.nls.mk>
286.include <bsd.files.mk>
287.include <bsd.incs.mk>
288.include <bsd.links.mk>
289
290.if ${MK_MAN} != "no"
291realinstall: _maninstall
292.ORDER: beforeinstall _maninstall
293.endif
294
295.endif
296
297.if !target(lint)
298lint: ${SRCS:M*.c}
299	${LINT} ${LINTFLAGS} ${CFLAGS:M-[DIU]*} ${.ALLSRC}
300.endif
301
302.if ${MK_MAN} != "no"
303.include <bsd.man.mk>
304.endif
305
306.include <bsd.dep.mk>
307
308.if !exists(${.OBJDIR}/${DEPENDFILE})
309.if defined(LIB) && !empty(LIB)
310${OBJS} ${STATICOBJS} ${POBJS}: ${SRCS:M*.h}
311.for _S in ${SRCS:N*.[hly]}
312${_S:R}.po: ${_S}
313.endfor
314.endif
315.if defined(SHLIB_NAME) || \
316    defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB)
317${SOBJS}: ${SRCS:M*.h}
318.for _S in ${SRCS:N*.[hly]}
319${_S:R}.So: ${_S}
320.endfor
321.endif
322.endif
323
324.if !target(clean)
325clean:
326.if defined(CLEANFILES) && !empty(CLEANFILES)
327	rm -f ${CLEANFILES}
328.endif
329.if defined(LIB) && !empty(LIB)
330	rm -f a.out ${OBJS} ${OBJS:S/$/.tmp/} ${STATICOBJS}
331.endif
332.if !defined(INTERNALLIB)
333.if ${MK_PROFILE} != "no" && defined(LIB) && !empty(LIB)
334	rm -f ${POBJS} ${POBJS:S/$/.tmp/}
335.endif
336.if defined(SHLIB_NAME) || \
337    defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB)
338	rm -f ${SOBJS} ${SOBJS:.So=.so} ${SOBJS:S/$/.tmp/}
339.endif
340.if defined(SHLIB_NAME)
341.if defined(SHLIB_LINK)
342	rm -f ${SHLIB_LINK}
343.endif
344.if defined(LIB) && !empty(LIB)
345	rm -f lib${LIB}.so.* lib${LIB}.so
346.endif
347.endif
348.if defined(WANT_LINT) && defined(LIB) && !empty(LIB)
349	rm -f ${LINTOBJS}
350.endif
351.endif # !defined(INTERNALLIB)
352.if defined(_LIBS) && !empty(_LIBS)
353	rm -f ${_LIBS}
354.endif
355.if defined(CLEANDIRS) && !empty(CLEANDIRS)
356	rm -rf ${CLEANDIRS}
357.endif
358.endif
359
360.include <bsd.obj.mk>
361
362.include <bsd.sys.mk>
363