xref: /openbsd/share/mk/bsd.lib.mk (revision a6445c1d)
1#	$OpenBSD: bsd.lib.mk,v 1.71 2013/10/15 22:40:00 deraadt Exp $
2#	$NetBSD: bsd.lib.mk,v 1.67 1996/01/17 20:39:26 mycroft Exp $
3#	@(#)bsd.lib.mk	5.26 (Berkeley) 5/2/91
4
5.include <bsd.own.mk>				# for 'NOPIC' definition
6
7.if exists(${.CURDIR}/../Makefile.inc)
8.include "${.CURDIR}/../Makefile.inc"
9.endif
10
11.if exists(${.CURDIR}/shlib_version)
12.include "${.CURDIR}/shlib_version"
13.if defined(LIB) && defined(LIB${LIB}_VERSION)
14SHLIB_MAJOR=${LIB${LIB}_VERSION:R}
15SHLIB_MINOR=${LIB${LIB}_VERSION:E}
16.else
17SHLIB_MAJOR=${major}
18SHLIB_MINOR=${minor}
19.endif
20.endif
21
22.MAIN: all
23
24# prefer .S to a .c, add .po, remove stuff not used in the BSD libraries.
25# .so used for PIC object files.
26# .do used for distrib "crunchgen" object files
27# .m for objective c files.
28.SUFFIXES:
29.SUFFIXES: .out .o .go .po .so .do .S .s .c .cc .cpp .C .cxx .f .y .l .m4 .m
30
31.if defined(NOPIE)
32CFLAGS+=	${NOPIE_FLAGS}
33AFLAGS+=	${NOPIE_FLAGS}
34.endif
35
36DIST_CFLAGS+=	-Os
37
38.c.o:
39	@echo "${COMPILE.c} ${.IMPSRC} -o ${.TARGET}"
40	@${COMPILE.c} ${.IMPSRC}  -o ${.TARGET}.o
41	@${LD} -X -r ${.TARGET}.o -o ${.TARGET}
42	@rm -f ${.TARGET}.o
43
44.c.go:
45	@echo "${COMPILE.c} -g ${.IMPSRC} -o ${.TARGET}"
46	@${COMPILE.c} -g ${.IMPSRC} -o ${.TARGET}.o
47	@${LD} -X -r ${.TARGET}.o -o ${.TARGET}
48	@rm -f ${.TARGET}.o
49
50.c.po:
51	@echo "${COMPILE.c} -p ${.IMPSRC} -o ${.TARGET}"
52	@${COMPILE.c} -p ${.IMPSRC} -o ${.TARGET}.o
53	@${LD} -X -r ${.TARGET}.o -o ${.TARGET}
54	@rm -f ${.TARGET}.o
55
56.c.so:
57	@echo "${COMPILE.c} ${PICFLAG} -DPIC ${.IMPSRC} -o ${.TARGET}"
58	@${COMPILE.c} ${PICFLAG} -DPIC ${.IMPSRC} -o ${.TARGET}.o
59	@${LD} -X -r ${.TARGET}.o -o ${.TARGET}
60	@rm -f ${.TARGET}.o
61
62.c.do:
63	@echo "${COMPILE.c} ${DIST_CFLAGS} ${.IMPSRC} -o ${.TARGET}"
64	@${COMPILE.c} ${DIST_CFLAGS} ${.IMPSRC}  -o ${.TARGET}.o
65	@${LD} -X -r ${.TARGET}.o -o ${.TARGET}
66	@rm -f ${.TARGET}.o
67
68.cc.o .cpp.o .C.o .cxx.o:
69	@echo "${COMPILE.cc} ${.IMPSRC} -o ${.TARGET}"
70	@${COMPILE.cc} ${.IMPSRC} -o ${.TARGET}.o
71	@${LD} -X -r ${.TARGET}.o -o ${.TARGET}
72	@rm -f ${.TARGET}.o
73
74.cc.go .cpp.go .C.go .cxx.go:
75	@echo "${COMPILE.cc} -g ${.IMPSRC} -o ${.TARGET}"
76	@${COMPILE.cc} -g ${.IMPSRC} -o ${.TARGET}.o
77	@${LD} -X -r ${.TARGET}.o -o ${.TARGET}
78	@rm -f ${.TARGET}.o
79
80.cc.po .cpp.po .C.po .cxx.po:
81	@echo "${COMPILE.cc} -p ${.IMPSRC} -o ${.TARGET}"
82	@${COMPILE.cc} -p ${.IMPSRC} -o ${.TARGET}.o
83	@${LD} -X -r ${.TARGET}.o -o ${.TARGET}
84	@rm -f ${.TARGET}.o
85
86.cc.so .cpp.so .C.so .cxx.so:
87	@echo "${COMPILE.cc} ${PICFLAG} -DPIC ${.IMPSRC} -o ${.TARGET}"
88	@${COMPILE.cc} ${PICFLAG} -DPIC ${.IMPSRC} -o ${.TARGET}.o
89	@${LD} -X -r ${.TARGET}.o -o ${.TARGET}
90	@rm -f ${.TARGET}.o
91
92# Fortran 77
93.f.o:
94	@echo "${COMPILE.f} ${.IMPSRC} -o ${.TARGET}"
95	@${COMPILE.f} ${.IMPSRC} -o ${.TARGET}.o
96	@${LD} -X -r ${.TARGET}.o -o ${.TARGET}
97	@rm -f ${.TARGET}.o
98
99.f.go:
100	@echo "${COMPILE.f} -g ${.IMPSRC} -o ${.TARGET}"
101	@${COMPILE.f} -g ${.IMPSRC} -o ${.TARGET}.o
102	@${LD} -X -r ${.TARGET}.o -o ${.TARGET}
103	@rm -f ${.TARGET}.o
104
105.f.po:
106	@echo "${COMPILE.f} -p ${.IMPSRC} -o ${.TARGET}"
107	@${COMPILE.f} -p ${.IMPSRC} -o ${.TARGET}.o
108	@${LD} -X -r ${.TARGET}.o -o ${.TARGET}
109	@rm -f ${.TARGET}.o
110
111.f.so:
112	@echo "${COMPILE.f} ${PICFLAG} -DPIC ${.IMPSRC} -o ${.TARGET}"
113	@${COMPILE.f} ${PICFLAG} -DPIC ${.IMPSRC} -o ${.TARGET}.o
114	@${LD} -X -r ${.TARGET}.o -o ${.TARGET}
115	@rm -f ${.TARGET}.o
116
117.S.o .s.o:
118	@echo "${COMPILE.S} ${CFLAGS:M-[ID]*} ${AINC} ${.IMPSRC} -o ${.TARGET}"
119	@${COMPILE.S} ${CFLAGS:M-[ID]*} ${AINC} ${.IMPSRC} -o ${.TARGET}.o
120	@${LD} -X -r ${.TARGET}.o -o ${.TARGET}
121	@rm -f ${.TARGET}.o
122
123.S.go .s.go:
124	@echo "${COMPILE.S} ${CFLAGS:M-[ID]*} ${AINC} ${.IMPSRC} -o ${.TARGET}"
125	@${COMPILE.S} ${CFLAGS:M-[ID]*} ${AINC} ${.IMPSRC} -o ${.TARGET}.o
126	@${LD} -X -r ${.TARGET}.o -o ${.TARGET}
127	@rm -f ${.TARGET}.o
128
129.S.po .s.po:
130	@echo "${COMPILE.S} -DPROF ${CFLAGS:M-[ID]*} ${AINC} ${.IMPSRC} \
131	    -o ${.TARGET}"
132	@${COMPILE.S} -DPROF ${CFLAGS:M-[ID]*} ${AINC} ${.IMPSRC} \
133	    -o ${.TARGET}.o
134	@${LD} -X -r ${.TARGET}.o -o ${.TARGET}
135	@rm -f ${.TARGET}.o
136
137.S.so .s.so:
138	@echo "${COMPILE.S} ${PICFLAG} ${CFLAGS:M-[ID]*} ${AINC} ${.IMPSRC} \
139	    -o ${.TARGET}"
140	@${COMPILE.S} ${PICFLAG} ${CFLAGS:M-[ID]*} ${AINC} ${.IMPSRC} \
141	    -o ${.TARGET}.o
142	@${LD} -X -r ${.TARGET}.o -o ${.TARGET}
143	@rm -f ${.TARGET}.o
144
145.S.do .s.do:
146	@echo "${COMPILE.S} ${CFLAGS:M-[ID]*} ${AINC} ${DIST_CFLAGS} \
147	    ${.IMPSRC} -o ${.TARGET}"
148	@${COMPILE.S} ${CFLAGS:M-[ID]*} ${AINC} ${DIST_CFLAGS} ${.IMPSRC} \
149	    -o ${.TARGET}.o
150	@${LD} -X -r ${.TARGET}.o -o ${.TARGET}
151	@rm -f ${.TARGET}.o
152
153.if ${WARNINGS:L} == "yes"
154CFLAGS+=	${CDIAGFLAGS}
155CXXFLAGS+=	${CXXDIAGFLAGS}
156.endif
157CFLAGS+=	${COPTS}
158CXXFLAGS+=	${CXXOPTS}
159
160DEBUG?=	-g
161
162_LIBS=lib${LIB}.a
163.if (${DEBUGLIBS:L} == "yes")
164_LIBS+=lib${LIB}_g.a
165.endif
166.if !defined(NOPROFILE)
167_LIBS+=lib${LIB}_p.a
168.endif
169
170.if !defined(NOPIC)
171.if defined(SHLIB_MAJOR) && defined(SHLIB_MINOR)
172_LIBS+=lib${LIB}.so.${SHLIB_MAJOR}.${SHLIB_MINOR}
173.endif
174.endif
175
176all: ${_LIBS} _SUBDIRUSE
177
178OBJS+=	${SRCS:N*.h:R:S/$/.o/}
179
180lib${LIB}.a: ${OBJS}
181	@echo building standard ${LIB} library
182	@rm -f lib${LIB}.a
183	@${AR} cq lib${LIB}.a `${LORDER} ${OBJS} | tsort -q`
184	${RANLIB} lib${LIB}.a
185
186GOBJS+=	${OBJS:.o=.go}
187lib${LIB}_g.a: ${GOBJS}
188	@echo building debugging ${LIB} library
189	@rm -f lib${LIB}_g.a
190	@${AR} cq lib${LIB}_g.a `${LORDER} ${GOBJS} | tsort -q`
191	${RANLIB} lib${LIB}_g.a
192
193POBJS+=	${OBJS:.o=.po}
194lib${LIB}_p.a: ${POBJS}
195	@echo building profiled ${LIB} library
196	@rm -f lib${LIB}_p.a
197	@${AR} cq lib${LIB}_p.a `${LORDER} ${POBJS} | tsort -q`
198	${RANLIB} lib${LIB}_p.a
199
200SOBJS+=	${OBJS:.o=.so}
201lib${LIB}.so.${SHLIB_MAJOR}.${SHLIB_MINOR}: ${SOBJS} ${DPADD}
202	@echo building shared ${LIB} library \(version ${SHLIB_MAJOR}.${SHLIB_MINOR}\)
203	@rm -f lib${LIB}.so.${SHLIB_MAJOR}.${SHLIB_MINOR}
204	${CC} -shared ${PICFLAG} \
205	    -o lib${LIB}.so.${SHLIB_MAJOR}.${SHLIB_MINOR} \
206	    `${LORDER} ${SOBJS}|tsort -q` ${LDADD}
207
208# all .do files...
209DOBJS+=	${OBJS:.o=.do}
210
211# .do files that we actually need for where this dist lib will be used
212.if defined(DIST_OBJS)
213SELECTED_DOBJS=${DIST_OBJS:.o=.do}
214.else
215SELECTED_DOBJS?=${DOBJS}
216.endif
217
218DIST_LIB?=lib${LIB}_d.a
219${DIST_LIB}: ${SELECTED_DOBJS}
220	@echo building distrib ${DIST_LIB} library from ${SELECTED_DOBJS}
221	@rm -f ${DIST_LIB}
222.if !empty(SELECTED_DOBJS)
223	@${AR} cq ${DIST_LIB} `${LORDER} ${SELECTED_DOBJS} | tsort -q`
224.else
225	@${AR} cq ${DIST_LIB}
226.endif
227	${RANLIB} ${DIST_LIB}
228
229.if !target(clean)
230clean: _SUBDIRUSE
231	rm -f a.out [Ee]rrs mklog *.core ${CLEANFILES}
232	rm -f lib${LIB}.a ${OBJS}
233	rm -f lib${LIB}_g.a ${GOBJS}
234	rm -f lib${LIB}_p.a ${POBJS}
235	rm -f lib${LIB}.so.*.* ${SOBJS}
236	rm -f ${DIST_LIB} ${DOBJS}
237.endif
238
239cleandir: _SUBDIRUSE clean
240
241.if defined(SRCS)
242afterdepend: .depend
243	@(TMP=`mktemp -q /tmp/_dependXXXXXXXXXX`; \
244	if [ $$? -ne 0 ]; then \
245		echo "$$0: cannot create temp file, exiting..."; \
246		exit 1; \
247	fi; \
248	sed -e 's/^\([^\.]*\).o[ ]*:/\1.o \1.go \1.po \1.so \1.do:/' \
249	      < .depend > $$TMP; \
250	mv $$TMP .depend)
251.endif
252
253.if !target(install)
254.if !target(beforeinstall)
255beforeinstall:
256.endif
257
258realinstall:
259#	ranlib lib${LIB}.a
260	${INSTALL} ${INSTALL_COPY} -S -o ${LIBOWN} -g ${LIBGRP} -m 600 lib${LIB}.a \
261	    ${DESTDIR}${LIBDIR}/lib${LIB}.a
262.if (${INSTALL_COPY} != "-p")
263	${RANLIB} -t ${DESTDIR}${LIBDIR}/lib${LIB}.a
264.endif
265	chmod ${LIBMODE} ${DESTDIR}${LIBDIR}/lib${LIB}.a
266.if (${DEBUGLIBS:L} == "yes")
267#	ranlib lib${LIB}_g.a
268	${INSTALL} ${INSTALL_COPY} -S -o ${LIBOWN} -g ${LIBGRP} -m 600 \
269	    lib${LIB}_g.a ${DESTDIR}${LIBDIR}/debug/lib${LIB}.a
270.if (${INSTALL_COPY} != "-p")
271	${RANLIB} -t ${DESTDIR}${LIBDIR}/debug/lib${LIB}.a
272.endif
273	chmod ${LIBMODE} ${DESTDIR}${LIBDIR}/debug/lib${LIB}.a
274.endif
275.if !defined(NOPROFILE)
276#	ranlib lib${LIB}_p.a
277	${INSTALL} ${INSTALL_COPY} -S -o ${LIBOWN} -g ${LIBGRP} -m 600 \
278	    lib${LIB}_p.a ${DESTDIR}${LIBDIR}
279.if (${INSTALL_COPY} != "-p")
280	${RANLIB} -t ${DESTDIR}${LIBDIR}/lib${LIB}_p.a
281.endif
282	chmod ${LIBMODE} ${DESTDIR}${LIBDIR}/lib${LIB}_p.a
283.endif
284.if !defined(NOPIC) && defined(SHLIB_MAJOR) && defined(SHLIB_MINOR)
285	${INSTALL} ${INSTALL_COPY} -S -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
286	    lib${LIB}.so.${SHLIB_MAJOR}.${SHLIB_MINOR} ${DESTDIR}${LIBDIR}
287.endif
288.if defined(LINKS) && !empty(LINKS)
289.  for lnk file in ${LINKS}
290	@l=${DESTDIR}${lnk}; \
291	 t=${DESTDIR}${file}; \
292	 echo $$t -\> $$l; \
293	 rm -f $$t; ln $$l $$t
294.  endfor
295.endif
296
297install: maninstall _SUBDIRUSE
298maninstall: afterinstall
299afterinstall: realinstall
300realinstall: beforeinstall
301.endif
302
303.if !defined(NOMAN)
304.include <bsd.man.mk>
305.endif
306
307.if !defined(NONLS)
308.include <bsd.nls.mk>
309.endif
310
311.include <bsd.obj.mk>
312.include <bsd.dep.mk>
313.include <bsd.subdir.mk>
314.include <bsd.sys.mk>
315