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