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