1 # from: @(#)bsd.lib.mk 5.26 (Berkeley) 5/2/91
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.
13 .undef INSTALL_PIC_ARCHIVE
15 .if !defined(SHLIB) && defined(LIB)
18 .if !defined(SHLIB_NAME) && defined(SHLIB) && defined(SHLIB_MAJOR)
19 SHLIB_NAME= lib${SHLIB}.so.${SHLIB_MAJOR}
21 .if defined(SHLIB_NAME) && !empty(SHLIB_NAME:M*.so.*)
22 SHLIB_LINK?= ${SHLIB_NAME:R}
24 SONAME?= ${SHLIB_NAME}
27 .if defined(CRUNCH_CFLAGS)
28 CFLAGS+= ${CRUNCH_CFLAGS}
31 .if ${MK_ASSERT_DEBUG} == "no"
36 # Enable CTF conversion on request.
41 .if defined(DEBUG_FLAGS)
42 CFLAGS+= ${DEBUG_FLAGS}
44 .if !defined(NO_CTF) && (${DEBUG_FLAGS:M-g} != "")
49 .if !defined(DEBUG_FLAGS)
53 .include <bsd.libnames.mk>
55 # prefer .s to a .c, add .po, remove stuff not used in the BSD libraries
56 # .So used for PIC object files
58 .SUFFIXES: .out .o .po .So .S .asm .s .c .cc .cpp .cxx .C .f .y .l .ln
61 .if ${MACHINE_CPUARCH} == "sparc64"
71 ${CC} ${STATIC_CFLAGS} ${CFLAGS} -c ${.IMPSRC} -o ${.TARGET}
72 @[ -z "${CTFCONVERT}" -o -n "${NO_CTF}" ] || \
73 (${ECHO} ${CTFCONVERT} ${CTFFLAGS} ${.TARGET} && \
74 ${CTFCONVERT} ${CTFFLAGS} ${.TARGET})
77 ${CC} ${PO_FLAG} ${STATIC_CFLAGS} ${PO_CFLAGS} -c ${.IMPSRC} -o ${.TARGET}
78 @[ -z "${CTFCONVERT}" -o -n "${NO_CTF}" ] || \
79 (${ECHO} ${CTFCONVERT} ${CTFFLAGS} ${.TARGET} && \
80 ${CTFCONVERT} ${CTFFLAGS} ${.TARGET})
83 ${CC} ${PICFLAG} -DPIC ${SHARED_CFLAGS} ${CFLAGS} -c ${.IMPSRC} -o ${.TARGET}
84 @[ -z "${CTFCONVERT}" -o -n "${NO_CTF}" ] || \
85 (${ECHO} ${CTFCONVERT} ${CTFFLAGS} ${.TARGET} && \
86 ${CTFCONVERT} ${CTFFLAGS} ${.TARGET})
88 .cc.o .C.o .cpp.o .cxx.o:
89 ${CXX} ${STATIC_CXXFLAGS} ${CXXFLAGS} -c ${.IMPSRC} -o ${.TARGET}
91 .cc.po .C.po .cpp.po .cxx.po:
92 ${CXX} ${PO_FLAG} ${STATIC_CXXFLAGS} ${PO_CXXFLAGS} -c ${.IMPSRC} -o ${.TARGET}
94 .cc.So .C.So .cpp.So .cxx.So:
95 ${CXX} ${PICFLAG} -DPIC ${SHARED_CXXFLAGS} ${CXXFLAGS} -c ${.IMPSRC} -o ${.TARGET}
98 ${FC} -pg ${FFLAGS} -o ${.TARGET} -c ${.IMPSRC}
99 @[ -z "${CTFCONVERT}" -o -n "${NO_CTF}" ] || \
100 (${ECHO} ${CTFCONVERT} ${CTFFLAGS} ${.TARGET} && \
101 ${CTFCONVERT} ${CTFFLAGS} ${.TARGET})
104 ${FC} ${PICFLAG} -DPIC ${FFLAGS} -o ${.TARGET} -c ${.IMPSRC}
105 @[ -z "${CTFCONVERT}" -o -n "${NO_CTF}" ] || \
106 (${ECHO} ${CTFCONVERT} ${CTFFLAGS} ${.TARGET} && \
107 ${CTFCONVERT} ${CTFFLAGS} ${.TARGET})
110 ${AS} ${AFLAGS} -o ${.TARGET} ${.IMPSRC}
111 @[ -z "${CTFCONVERT}" -o -n "${NO_CTF}" ] || \
112 (${ECHO} ${CTFCONVERT} ${CTFFLAGS} ${.TARGET} && \
113 ${CTFCONVERT} ${CTFFLAGS} ${.TARGET})
116 ${CC} -x assembler-with-cpp -DPROF ${PO_CFLAGS} ${ACFLAGS} \
117 -c ${.IMPSRC} -o ${.TARGET}
118 @[ -z "${CTFCONVERT}" -o -n "${NO_CTF}" ] || \
119 (${ECHO} ${CTFCONVERT} ${CTFFLAGS} ${.TARGET} && \
120 ${CTFCONVERT} ${CTFFLAGS} ${.TARGET})
123 ${CC} -x assembler-with-cpp ${PICFLAG} -DPIC ${CFLAGS} ${ACFLAGS} \
124 -c ${.IMPSRC} -o ${.TARGET}
125 @[ -z "${CTFCONVERT}" -o -n "${NO_CTF}" ] || \
126 (${ECHO} ${CTFCONVERT} ${CTFFLAGS} ${.TARGET} && \
127 ${CTFCONVERT} ${CTFFLAGS} ${.TARGET})
130 ${CC} -DPROF ${PO_CFLAGS} ${ACFLAGS} -c ${.IMPSRC} -o ${.TARGET}
131 @[ -z "${CTFCONVERT}" -o -n "${NO_CTF}" ] || \
132 (${ECHO} ${CTFCONVERT} ${CTFFLAGS} ${.TARGET} && \
133 ${CTFCONVERT} ${CTFFLAGS} ${.TARGET})
136 ${CC} ${PICFLAG} -DPIC ${CFLAGS} ${ACFLAGS} -c ${.IMPSRC} -o ${.TARGET}
137 @[ -z "${CTFCONVERT}" -o -n "${NO_CTF}" ] || \
138 (${ECHO} ${CTFCONVERT} ${CTFFLAGS} ${.TARGET} && \
139 ${CTFCONVERT} ${CTFFLAGS} ${.TARGET})
143 .include <bsd.symver.mk>
145 # Allow libraries to specify their own version map or have it
146 # automatically generated (see bsd.symver.mk above).
147 .if ${MK_SYMVER} == "yes" && !empty(VERSION_MAP)
148 ${SHLIB_NAME}: ${VERSION_MAP}
149 LDFLAGS+= -Wl,--version-script=${VERSION_MAP}
152 .if defined(LIB) && !empty(LIB) || defined(SHLIB_NAME)
153 OBJS+= ${SRCS:N*.h:R:S/$/.o/}
156 .if defined(LIB) && !empty(LIB)
159 lib${LIB}.a: ${OBJS} ${STATICOBJS}
160 @${ECHO} building static ${LIB} library
163 @${AR} cq ${.TARGET} `lorder ${OBJS} ${STATICOBJS} | tsort -q` ${ARADD}
165 @${AR} cq ${.TARGET} `NM='${NM}' lorder ${OBJS} ${STATICOBJS} | tsort -q` ${ARADD}
170 .if !defined(INTERNALLIB)
172 .if ${MK_PROFILE} != "no" && defined(LIB) && !empty(LIB)
173 _LIBS+= lib${LIB}_p.a
174 POBJS+= ${OBJS:.o=.po} ${STATICOBJS:.o=.po}
176 lib${LIB}_p.a: ${POBJS}
177 @${ECHO} building profiled ${LIB} library
180 @${AR} cq ${.TARGET} `lorder ${POBJS} | tsort -q` ${ARADD}
182 @${AR} cq ${.TARGET} `NM='${NM}' lorder ${POBJS} | tsort -q` ${ARADD}
187 .if defined(SHLIB_NAME) || \
188 defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB)
189 SOBJS+= ${OBJS:.o=.So}
192 .if defined(SHLIB_NAME)
193 _LIBS+= ${SHLIB_NAME}
195 SOLINKOPTS= -shared -Wl,-x
196 .if !defined(ALLOW_SHARED_TEXTREL)
197 SOLINKOPTS+= -Wl,--fatal-warnings -Wl,--warn-shared-textrel
200 .if target(beforelinking)
201 ${SHLIB_NAME}: ${SOBJS} beforelinking
203 ${SHLIB_NAME}: ${SOBJS}
205 @${ECHO} building shared library ${SHLIB_NAME}
206 @rm -f ${.TARGET} ${SHLIB_LINK}
207 .if defined(SHLIB_LINK)
208 @ln -fs ${.TARGET} ${SHLIB_LINK}
211 @${CC} ${LDFLAGS} ${SSP_CFLAGS} ${SOLINKOPTS} \
212 -o ${.TARGET} -Wl,-soname,${SONAME} \
213 `lorder ${SOBJS} | tsort -q` ${LDADD}
215 @${CC} ${LDFLAGS} ${SSP_CFLAGS} ${SOLINKOPTS} \
216 -o ${.TARGET} -Wl,-soname,${SONAME} \
217 `NM='${NM}' lorder ${SOBJS} | tsort -q` ${LDADD}
219 @[ -z "${CTFMERGE}" -o -n "${NO_CTF}" ] || \
220 (${ECHO} ${CTFMERGE} ${CTFFLAGS} -o ${.TARGET} ${SOBJS} && \
221 ${CTFMERGE} ${CTFFLAGS} -o ${.TARGET} ${SOBJS})
224 .if defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB) && ${MK_TOOLCHAIN} != "no"
225 _LIBS+= lib${LIB}_pic.a
227 lib${LIB}_pic.a: ${SOBJS}
228 @${ECHO} building special pic ${LIB} library
230 @${AR} cq ${.TARGET} ${SOBJS} ${ARADD}
234 .if defined(WANT_LINT) && !defined(NO_LINT) && defined(LIB) && !empty(LIB)
235 LINTLIB= llib-l${LIB}.ln
237 LINTOBJS+= ${SRCS:M*.c:.c=.ln}
239 ${LINTLIB}: ${LINTOBJS}
240 @${ECHO} building lint library ${.TARGET}
242 ${LINT} ${LINTLIBFLAGS} ${CFLAGS:M-[DIU]*} ${.ALLSRC}
245 .endif # !defined(INTERNALLIB)
249 .if ${MK_MAN} != "no"
255 sed -e 's/^\([^\.]*\).o[ ]*:/\1.o \1.po \1.So:/' < ${DEPENDFILE} \
257 mv $$TMP ${DEPENDFILE}
258 .if !defined(NO_EXTRADEPEND) && defined(SHLIB_NAME)
259 .if defined(DPADD) && !empty(DPADD)
260 echo ${SHLIB_NAME}: ${DPADD} >> ${DEPENDFILE}
266 .if defined(PRECIOUSLIB)
267 .if !defined(NO_FSCHG)
268 SHLINSTALLFLAGS+= -fschg
273 _INSTALLFLAGS:= ${INSTALLFLAGS}
274 .for ie in ${INSTALLFLAGS_EDIT}
275 _INSTALLFLAGS:= ${_INSTALLFLAGS${ie}}
277 _SHLINSTALLFLAGS:= ${SHLINSTALLFLAGS}
278 .for ie in ${INSTALLFLAGS_EDIT}
279 _SHLINSTALLFLAGS:= ${_SHLINSTALLFLAGS${ie}}
282 .if !defined(INTERNALLIB)
283 realinstall: _libinstall
284 .ORDER: beforeinstall _libinstall
286 .if defined(LIB) && !empty(LIB) && ${MK_INSTALLLIB} != "no"
287 ${INSTALL} -C -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
288 ${_INSTALLFLAGS} lib${LIB}.a ${DESTDIR}${LIBDIR}
290 .if ${MK_PROFILE} != "no" && defined(LIB) && !empty(LIB)
291 ${INSTALL} -C -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
292 ${_INSTALLFLAGS} lib${LIB}_p.a ${DESTDIR}${LIBDIR}
294 .if defined(SHLIB_NAME)
295 ${INSTALL} ${STRIP} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
296 ${_INSTALLFLAGS} ${_SHLINSTALLFLAGS} \
297 ${SHLIB_NAME} ${DESTDIR}${SHLIBDIR}
298 .if defined(SHLIB_LINK)
299 # ${_SHLIBDIRPREFIX} and ${_LDSCRIPTROOT} are both needed when cross-building
300 # and when building 32 bits library shims. ${_SHLIBDIRPREFIX} is the directory
301 # prefix where shared objects will be installed. ${_LDSCRIPTROOT} is the
302 # directory prefix that will be used in generated ld(1) scripts. They cannot
303 # be coalesced because of the way ld(1) handles the sysroot prefix (used in the
305 # - 64 bits libs are located under sysroot, so ${_LDSCRIPTROOT} must be empty.
306 # - 32 bits shims are not, so ${_LDSCRIPTROOT} is used to specify their full
307 # path. Note that ld(1) scripts are generated both during buildworld and
308 # installworld; in the later case ${_LDSCRIPTROOT} must be obviously empty.
309 # On the other hand, the use of ${_SHLIBDIRPREFIX} is more consistent since it
310 # does not involve the logic of a tool we do not own.
311 .if defined(SHLIB_LDSCRIPT) && !empty(SHLIB_LDSCRIPT) && exists(${.CURDIR}/${SHLIB_LDSCRIPT})
312 sed -e 's,@@SHLIB@@,${_LDSCRIPTROOT}${SHLIBDIR}/${SHLIB_NAME},g' \
313 -e 's,@@LIBDIR@@,${_LDSCRIPTROOT}${LIBDIR},g' \
314 ${.CURDIR}/${SHLIB_LDSCRIPT} > lib${LIB}.ld
315 ${INSTALL} -S -C -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
316 ${_INSTALLFLAGS} lib${LIB}.ld ${DESTDIR}${LIBDIR}/${SHLIB_LINK}
318 .if ${SHLIBDIR} == ${LIBDIR}
319 ln -fs ${SHLIB_NAME} ${DESTDIR}${LIBDIR}/${SHLIB_LINK}
321 ln -fs ${_SHLIBDIRPREFIX}${SHLIBDIR}/${SHLIB_NAME} \
322 ${DESTDIR}${LIBDIR}/${SHLIB_LINK}
323 .if exists(${DESTDIR}${LIBDIR}/${SHLIB_NAME})
324 -chflags noschg ${DESTDIR}${LIBDIR}/${SHLIB_NAME}
325 rm -f ${DESTDIR}${LIBDIR}/${SHLIB_NAME}
328 .endif # SHLIB_LDSCRIPT
331 .if defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB) && ${MK_TOOLCHAIN} != "no"
332 ${INSTALL} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
333 ${_INSTALLFLAGS} lib${LIB}_pic.a ${DESTDIR}${LIBDIR}
335 .if defined(WANT_LINT) && !defined(NO_LINT) && defined(LIB) && !empty(LIB)
336 ${INSTALL} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
337 ${_INSTALLFLAGS} ${LINTLIB} ${DESTDIR}${LINTLIBDIR}
339 .endif # !defined(INTERNALLIB)
341 .include <bsd.nls.mk>
342 .include <bsd.files.mk>
343 .include <bsd.incs.mk>
344 .include <bsd.links.mk>
346 .if ${MK_MAN} != "no"
347 realinstall: _maninstall
348 .ORDER: beforeinstall _maninstall
355 ${LINT} ${LINTFLAGS} ${CFLAGS:M-[DIU]*} ${.ALLSRC}
358 .if ${MK_MAN} != "no"
359 .include <bsd.man.mk>
362 .include <bsd.dep.mk>
364 .if !exists(${.OBJDIR}/${DEPENDFILE})
365 .if defined(LIB) && !empty(LIB)
366 ${OBJS} ${STATICOBJS} ${POBJS}: ${SRCS:M*.h}
367 .for _S in ${SRCS:N*.[hly]}
371 .if defined(SHLIB_NAME) || \
372 defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB)
373 ${SOBJS}: ${SRCS:M*.h}
374 .for _S in ${SRCS:N*.[hly]}
382 .if defined(CLEANFILES) && !empty(CLEANFILES)
385 .if defined(LIB) && !empty(LIB)
386 rm -f a.out ${OBJS} ${OBJS:S/$/.tmp/} ${STATICOBJS}
388 .if !defined(INTERNALLIB)
389 .if ${MK_PROFILE} != "no" && defined(LIB) && !empty(LIB)
390 rm -f ${POBJS} ${POBJS:S/$/.tmp/}
392 .if defined(SHLIB_NAME) || \
393 defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB)
394 rm -f ${SOBJS} ${SOBJS:.So=.so} ${SOBJS:S/$/.tmp/}
396 .if defined(SHLIB_NAME)
397 .if defined(SHLIB_LINK)
398 .if defined(SHLIB_LDSCRIPT) && exists(${.CURDIR}/${SHLIB_LDSCRIPT})
403 .if defined(LIB) && !empty(LIB)
404 rm -f lib${LIB}.so.* lib${LIB}.so
407 .if defined(WANT_LINT) && defined(LIB) && !empty(LIB)
410 .endif # !defined(INTERNALLIB)
411 .if defined(_LIBS) && !empty(_LIBS)
414 .if defined(CLEANDIRS) && !empty(CLEANDIRS)
417 .if !empty(VERSION_DEF) && !empty(SYMBOL_MAPS)
422 .include <bsd.obj.mk>
424 .include <bsd.sys.mk>