bsd.lib.mk revision 95251
1#	from: @(#)bsd.lib.mk	5.26 (Berkeley) 5/2/91
2# $FreeBSD: head/share/mk/bsd.lib.mk 95251 2002-04-22 08:56:34Z ru $
3#
4
5.include <bsd.init.mk>
6
7.if exists(${.CURDIR}/shlib_version)
8SHLIB_MAJOR != . ${.CURDIR}/shlib_version ; echo $$major
9.if ${OBJFORMAT} == aout
10SHLIB_MINOR != . ${.CURDIR}/shlib_version ; echo $$minor
11.endif
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(NOPIC)
19.undef SHLIB_NAME
20.undef INSTALL_PIC_ARCHIVE
21.else
22.if ${OBJFORMAT} == elf
23.if !defined(SHLIB_NAME) && defined(SHLIB_MAJOR)
24SHLIB_NAME=	lib${LIB}.so.${SHLIB_MAJOR}
25SHLIB_LINK?=	lib${LIB}.so
26.endif
27SONAME?=	${SHLIB_NAME}
28.else
29.if defined(SHLIB_MAJOR) && defined(SHLIB_MINOR)
30SHLIB_NAME?=	lib${LIB}.so.${SHLIB_MAJOR}.${SHLIB_MINOR}
31.endif
32.endif
33.endif
34
35.if defined(DEBUG_FLAGS)
36CFLAGS+= ${DEBUG_FLAGS}
37.endif
38
39.if !defined(DEBUG_FLAGS)
40STRIP?=	-s
41.endif
42
43.if ${OBJFORMAT} != aout || make(checkdpadd) || defined(NEED_LIBNAMES)
44.include <bsd.libnames.mk>
45.endif
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 .asm .c .cc .cpp .cxx .m .C .f .y .l .ln
51
52.c.ln:
53	${LINT} ${LINTOBJFLAGS} ${CFLAGS:M-[DIU]*} ${.IMPSRC} || \
54	    touch ${.TARGET}
55
56.cc.ln .C.ln .cpp.ln .cxx.ln:
57	${LINT} ${LINTOBJFLAGS} ${CXXFLAGS:M-[DIU]*} ${.IMPSRC} || \
58	    touch ${.TARGET}
59
60.c.o:
61	${CC} ${CFLAGS} -c ${.IMPSRC} -o ${.TARGET}
62	@${LD} -o ${.TARGET}.tmp -x -r ${.TARGET}
63	@mv ${.TARGET}.tmp ${.TARGET}
64
65.c.po:
66	${CC} -pg ${CFLAGS} -c ${.IMPSRC} -o ${.TARGET}
67	@${LD} -o ${.TARGET}.tmp -X -r ${.TARGET}
68	@mv ${.TARGET}.tmp ${.TARGET}
69
70.c.So:
71	${CC} ${PICFLAG} -DPIC ${CFLAGS} -c ${.IMPSRC} -o ${.TARGET}
72	@${LD} -o ${.TARGET}.tmp -x -r ${.TARGET}
73	@mv ${.TARGET}.tmp ${.TARGET}
74
75.cc.o .C.o .cpp.o .cxx.o:
76	${CXX} ${CXXFLAGS} -c ${.IMPSRC} -o ${.TARGET}
77	@${LD} -o ${.TARGET}.tmp -x -r ${.TARGET}
78	@mv ${.TARGET}.tmp ${.TARGET}
79
80.cc.po .C.po .cpp.po .cxx.po:
81	${CXX} -pg ${CXXFLAGS} -c ${.IMPSRC} -o ${.TARGET}
82	@${LD} -o ${.TARGET}.tmp -X -r ${.TARGET}
83	@mv ${.TARGET}.tmp ${.TARGET}
84
85.cc.So .C.So .cpp.So .cxx.So:
86	${CXX} ${PICFLAG} -DPIC ${CXXFLAGS} -c ${.IMPSRC} -o ${.TARGET}
87	@${LD} -o ${.TARGET}.tmp -x -r ${.TARGET}
88	@mv ${.TARGET}.tmp ${.TARGET}
89
90.f.o:
91	${FC} ${FFLAGS} -o ${.TARGET} -c ${.IMPSRC} 
92	@${LD} -o ${.TARGET}.tmp -x -r ${.TARGET}
93	@mv ${.TARGET}.tmp ${.TARGET}
94
95.f.po:
96	${FC} -pg ${FFLAGS} -o ${.TARGET} -c ${.IMPSRC} 
97	@${LD} -o ${.TARGET}.tmp -X -r ${.TARGET}
98	@mv ${.TARGET}.tmp ${.TARGET}
99
100.f.So:
101	${FC} ${PICFLAG} -DPIC ${FFLAGS} -o ${.TARGET} -c ${.IMPSRC}
102	@${LD} -o ${.TARGET}.tmp -x -r ${.TARGET}
103	@mv ${.TARGET}.tmp ${.TARGET}
104
105.m.o:
106	${OBJC} ${OBJCFLAGS} -c ${.IMPSRC} -o ${.TARGET}
107	@${LD} -o ${.TARGET}.tmp -x -r ${.TARGET}
108	@mv ${.TARGET}.tmp ${.TARGET}
109
110.m.po:
111	${OBJC} ${OBJCFLAGS} -pg -c ${.IMPSRC} -o ${.TARGET}
112	@${LD} -o ${.TARGET}.tmp -X -r ${.TARGET}
113	@mv ${.TARGET}.tmp ${.TARGET}
114
115.m.So:
116	${OBJC} ${PICFLAG} -DPIC ${OBJCFLAGS} -c ${.IMPSRC} -o ${.TARGET}
117	@${LD} -o ${.TARGET}.tmp -x -r ${.TARGET}
118	@mv ${.TARGET}.tmp ${.TARGET}
119
120.s.o .asm.o:
121	${CC} -x assembler-with-cpp ${CFLAGS:M-[BID]*} ${AINC} -c \
122	    ${.IMPSRC} -o ${.TARGET}
123	@${LD} -o ${.TARGET}.tmp -x -r ${.TARGET}
124	@mv ${.TARGET}.tmp ${.TARGET}
125
126.s.po .asm.po:
127	${CC} -x assembler-with-cpp -DPROF ${CFLAGS:M-[BID]*} ${AINC} -c \
128	    ${.IMPSRC} -o ${.TARGET}
129	@${LD} -o ${.TARGET}.tmp -X -r ${.TARGET}
130	@mv ${.TARGET}.tmp ${.TARGET}
131
132.s.So .asm.So:
133	${CC} -x assembler-with-cpp ${PICFLAG} -DPIC ${CFLAGS:M-[BID]*} \
134	    ${AINC} -c ${.IMPSRC} -o ${.TARGET}
135	@${LD} -o ${.TARGET}.tmp -x -r ${.TARGET}
136	@mv ${.TARGET}.tmp ${.TARGET}
137
138.S.o:
139	${CC} ${CFLAGS:M-[BID]*} ${AINC} -c ${.IMPSRC} -o ${.TARGET}
140	@${LD} -o ${.TARGET}.tmp -x -r ${.TARGET}
141	@mv ${.TARGET}.tmp ${.TARGET}
142
143.S.po:
144	${CC} -DPROF ${CFLAGS:M-[BID]*} ${AINC} -c ${.IMPSRC} -o ${.TARGET}
145	@${LD} -o ${.TARGET}.tmp -X -r ${.TARGET}
146	@mv ${.TARGET}.tmp ${.TARGET}
147
148.S.So:
149	${CC} ${PICFLAG} -DPIC ${CFLAGS:M-[BID]*} ${AINC} -c ${.IMPSRC} \
150	    -o ${.TARGET}
151	@${LD} -o ${.TARGET}.tmp -x -r ${.TARGET}
152	@mv ${.TARGET}.tmp ${.TARGET}
153
154.if !defined(INTERNALLIB) || defined(INTERNALSTATICLIB)
155.if !defined(NOPROFILE) && !defined(INTERNALLIB)
156_LIBS=lib${LIB}.a lib${LIB}_p.a
157.else
158_LIBS=lib${LIB}.a
159.endif
160.endif
161
162.if defined(SHLIB_NAME)
163_LIBS+=${SHLIB_NAME}
164.endif
165.if defined(INSTALL_PIC_ARCHIVE)
166_LIBS+=lib${LIB}_pic.a
167.endif
168
169.if !defined(PICFLAG)
170.if ${MACHINE_ARCH} == "sparc64"
171PICFLAG=-fPIC
172.else
173PICFLAG=-fpic
174.endif
175.endif
176
177LINTOBJS+= ${SRCS:M*.c:C/\..+$/.ln/}
178
179.if defined(WANT_LINT) && defined(LIB) && defined(LINTOBJS) && !empty(LINTOBJS)
180LINTLIB=llib-l${LIB}.ln
181_LIBS+=${LINTLIB}
182.endif
183
184.if !defined(NOMAN)
185all: objwarn ${_LIBS} all-man _SUBDIR
186.else
187all: objwarn ${_LIBS} _SUBDIR
188.endif
189
190OBJS+=	${SRCS:N*.h:R:S/$/.o/g}
191
192lib${LIB}.a:: ${OBJS} ${STATICOBJS}
193	@${ECHO} building static ${LIB} library
194	@rm -f lib${LIB}.a
195	@${AR} cq lib${LIB}.a `lorder ${OBJS} ${STATICOBJS} | tsort -q` ${ARADD}
196	${RANLIB} lib${LIB}.a
197
198POBJS+=	${OBJS:.o=.po} ${STATICOBJS:.o=.po}
199.if !defined(NOPROFILE)
200lib${LIB}_p.a:: ${POBJS}
201	@${ECHO} building profiled ${LIB} library
202	@rm -f lib${LIB}_p.a
203	@${AR} cq lib${LIB}_p.a `lorder ${POBJS} | tsort -q` ${ARADD}
204	${RANLIB} lib${LIB}_p.a
205.endif
206
207SOBJS+= ${OBJS:.o=.So}
208
209.if defined(SHLIB_NAME)
210${SHLIB_NAME}: ${SOBJS}
211	@${ECHO} building shared library ${SHLIB_NAME}
212	@rm -f ${SHLIB_NAME} ${SHLIB_LINK}
213.if defined(SHLIB_LINK)
214	@ln -sf ${SHLIB_NAME} ${SHLIB_LINK}
215.endif
216.if ${OBJFORMAT} == aout
217	@${CC} -shared -Wl,-x,-assert,pure-text \
218	    -o ${SHLIB_NAME} \
219	    `lorder ${SOBJS} | tsort -q` ${LDADD}
220.else
221	@${CC} -shared -Wl,-x \
222	    -o ${SHLIB_NAME} -Wl,-soname,${SONAME} \
223	    `lorder ${SOBJS} | tsort -q` ${LDADD}
224.endif
225.endif
226
227.if defined(INSTALL_PIC_ARCHIVE)
228lib${LIB}_pic.a:: ${SOBJS}
229	@${ECHO} building special pic ${LIB} library
230	@rm -f lib${LIB}_pic.a
231	@${AR} cq lib${LIB}_pic.a ${SOBJS} ${ARADD}
232	${RANLIB} lib${LIB}_pic.a
233.endif
234
235.if defined(WANT_LINT) && defined(LIB) && defined(LINTOBJS) && !empty(LINTOBJS)
236${LINTLIB}: ${LINTOBJS}
237	@${ECHO} building lint library ${LINTLIB}
238	@rm -f ${LINTLIB}
239	${LINT} ${LINTLIBFLAGS} ${CFLAGS:M-[DIU]*} ${.ALLSRC}
240.endif
241
242.if !target(clean)
243clean:	_SUBDIR
244	rm -f a.out ${OBJS} ${STATICOBJS} ${OBJS:S/$/.tmp/} ${CLEANFILES}
245	rm -f lib${LIB}.a
246	rm -f ${POBJS} ${POBJS:S/$/.tmp/} lib${LIB}_p.a
247	rm -f ${SOBJS} ${SOBJS:.So=.so} ${SOBJS:S/$/.tmp/} \
248	    ${SHLIB_NAME} ${SHLIB_LINK} \
249	    lib${LIB}.so.* lib${LIB}.so lib${LIB}_pic.a
250	rm -f ${LINTOBJS} ${LINTLIB}
251.if defined(CLEANDIRS) && !empty(CLEANDIRS)
252	rm -rf ${CLEANDIRS}
253.endif
254.endif
255
256_EXTRADEPEND:
257	@TMP=_depend$$$$; \
258	sed -e 's/^\([^\.]*\).o[ ]*:/\1.o \1.po \1.So:/' < ${DEPENDFILE} \
259	    > $$TMP; \
260	mv $$TMP ${DEPENDFILE}
261.if !defined(NOEXTRADEPEND) && defined(SHLIB_NAME)
262.if ${OBJFORMAT} == aout
263	echo ${SHLIB_NAME}: \
264	    `${CC} -shared -Wl,-f ${LDADD}` \
265	    >> ${DEPENDFILE}
266.else
267.if defined(DPADD) && !empty(DPADD)
268	echo ${SHLIB_NAME}: ${DPADD} >> ${DEPENDFILE}
269.endif
270.endif
271.endif
272
273.if !target(install)
274.if !target(beforeinstall)
275beforeinstall: _includeinstall
276.endif
277
278_includeinstall:
279.if defined(INCS)
280.for header in ${INCS}
281	cd ${.CURDIR} && \
282	${INSTALL} -C -o ${INCOWN} -g ${INCGRP} -m ${INCMODE} \
283	    ${header} ${DESTDIR}${INCDIR}
284.endfor
285.endif
286
287.if defined(PRECIOUSLIB) && !defined(NOFSCHG)
288SHLINSTALLFLAGS+= -fschg
289.endif
290
291_INSTALLFLAGS:=	${INSTALLFLAGS}
292.for ie in ${INSTALLFLAGS_EDIT}
293_INSTALLFLAGS:=	${_INSTALLFLAGS${ie}}
294.endfor
295_SHLINSTALLFLAGS:=	${SHLINSTALLFLAGS}
296.for ie in ${INSTALLFLAGS_EDIT}
297_SHLINSTALLFLAGS:=	${_SHLINSTALLFLAGS${ie}}
298.endfor
299
300realinstall: beforeinstall
301.if !defined(INTERNALLIB)
302	${INSTALL} -C -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
303	    ${_INSTALLFLAGS} lib${LIB}.a ${DESTDIR}${LIBDIR}
304.if !defined(NOPROFILE)
305	${INSTALL} -C -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
306	    ${_INSTALLFLAGS} lib${LIB}_p.a ${DESTDIR}${LIBDIR}
307.endif
308.endif
309.if defined(SHLIB_NAME)
310	${INSTALL} ${COPY} ${STRIP} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
311	    ${_INSTALLFLAGS} ${_SHLINSTALLFLAGS} \
312	    ${SHLIB_NAME} ${DESTDIR}${SHLIBDIR}
313.if defined(SHLIB_LINK)
314	ln -sf ${SHLIB_NAME} ${DESTDIR}${SHLIBDIR}/${SHLIB_LINK}
315.endif
316.endif
317.if defined(INSTALL_PIC_ARCHIVE)
318	${INSTALL} ${COPY} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
319	    ${_INSTALLFLAGS} lib${LIB}_pic.a ${DESTDIR}${LIBDIR}
320.endif
321.if defined(LINKS) && !empty(LINKS)
322	@set ${LINKS}; \
323	while test $$# -ge 2; do \
324		l=${DESTDIR}$$1; \
325		shift; \
326		t=${DESTDIR}$$1; \
327		shift; \
328		${ECHO} $$t -\> $$l; \
329		ln -f $$l $$t; \
330	done; true
331.endif
332.if defined(SYMLINKS) && !empty(SYMLINKS)
333	@set ${SYMLINKS}; \
334	while test $$# -ge 2; do \
335		l=$$1; \
336		shift; \
337		t=${DESTDIR}$$1; \
338		shift; \
339		${ECHO} $$t -\> $$l; \
340		ln -fs $$l $$t; \
341	done; true
342.endif
343.if defined(WANT_LINT) && defined(LIB) && defined(LINTOBJS) && !empty(LINTOBJS)
344	${INSTALL} ${COPY} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
345	    ${_INSTALLFLAGS} ${LINTLIB} ${DESTDIR}${LINTLIBDIR}
346.endif
347
348install: afterinstall _SUBDIR
349.if !defined(NOMAN)
350afterinstall: realinstall maninstall
351.else
352afterinstall: realinstall
353.endif
354.endif
355
356.if !target(regress)
357regress:
358.endif
359
360DISTRIBUTION?=	bin
361.if !target(distribute)
362distribute:	_SUBDIR
363.for dist in ${DISTRIBUTION}
364	cd ${.CURDIR} ; $(MAKE) install DESTDIR=${DISTDIR}/${dist} SHARED=copies
365.endfor
366.endif
367
368.if !target(lint)
369lint: ${SRCS:M*.c} _SUBDIR
370	${LINT} ${LINTOBJFLAGS} ${CFLAGS:M-[DIU]*} ${.ALLSRC}
371.endif
372
373.if !defined(NOMAN)
374.include <bsd.man.mk>
375.else
376.if !target(all-man)
377all-man:
378.endif
379.if !target(maninstall)
380maninstall:
381.endif
382.endif
383
384.include <bsd.dep.mk>
385
386.if !exists(${.OBJDIR}/${DEPENDFILE})
387${OBJS} ${STATICOBJS} ${POBJS} ${SOBJS}: ${SRCS:M*.h}
388.endif
389
390.include <bsd.obj.mk>
391
392.include <bsd.sys.mk>
393