1# $NetBSD: bsd.lib.mk,v 1.116 1997/06/04 08:38:45 pk Exp $ 2# @(#)bsd.lib.mk 8.3 (Berkeley) 4/22/94 3 4.if exists(${.CURDIR}/../Makefile.inc) 5.include "${.CURDIR}/../Makefile.inc" 6.endif 7 8.include <bsd.own.mk> 9 10.MAIN: all 11.PHONY: cleanlib libinstall 12realinstall: libinstall 13clean cleandir: cleanlib 14 15.if exists(${.CURDIR}/shlib_version) 16SHLIB_MAJOR != . ${.CURDIR}/shlib_version ; echo $$major 17SHLIB_MINOR != . ${.CURDIR}/shlib_version ; echo $$minor 18.endif 19 20# add additional suffixes not exported. 21# .po is used for profiling object files. 22# .so is used for PIC object files. 23.SUFFIXES: .out .a .ln .so .po .o .s .S .c .cc .C .F .f .r .y .l .cl .p .h .sh .m4 24 25 26# Set PICFLAGS to cc flags for producing position-independent code, 27# if not already set. Includes -DPIC, if required. 28 29# Data-driven table using make variables to control how shared libraries 30# are built for different platforms and object formats. 31# SHLIB_TYPE: currently either "ELF" or "a.out". 32# SHLIB_SOVERSION: version number to be compiled into a shared library 33# via -soname. Usualy ${SHLIB_MAJOR} on ELF. 34# NetBSD/pmax used to use ${SHLIB_MAJOR}.{SHLIB-MINOR}. 35# SHLIB_LDSTARTFILE: ??? 36# SHLIB_LDENDTILE: ?? 37# CPPICFLAGS: flags for ${CPP} to preprocess .[sS] files for ${AS} 38# CPICFLAGS: flags for ${CC} to compile .[cC] files to .so objects. 39# CAPICFLAGS flags for {$CC} to compiling .[Ss] files 40# (usually just ${CPPPICFLAGS} ${CPICFLAGS}) 41# APICFLAGS: flags for ${AS} to assemble .[sS] to .so objects. 42 43.if (${MACHINE_ARCH} == "alpha") 44 45SHLIB_TYPE=ELF 46SHLIB_LDSTARTFILE= ${DESTDIR}/usr/lib/crtbeginS.o 47SHLIB_LDENDFILE= ${DESTDIR}/usr/lib/crtendS.o 48SHLIB_SOVERSION=${SHLIB_MAJOR} 49CPICFLAGS ?= -fpic -DPIC 50CPPPICFLAGS?= -DPIC 51CAPICFLAGS?= ${CPPPICFLAGS} ${CPICFLAGS} 52APICFLAGS ?= 53 54.elif (${MACHINE_ARCH} == "mips") 55 56SHLIB_TYPE=ELF 57# still use gnu-derived ld.so on pmax; don't have or need lib<>.so support. 58SHLIB_LDSTARTFILE= 59SHLIB_LDENDFILE= 60SHLIB_SOVERSION=${SHLIB_MAJOR} 61 62# On mips, all libs need to be compiled with ABIcalls, not just sharedlibs. 63CPICFLAGS?= 64APICFLAGS?= 65#CPICFLAGS?= -fpic -DPIC 66#APICFLAGS?= -DPIC 67 68# so turn shlib PIC flags on for ${CPP}, ${CC}, and ${AS} as follows: 69AINC+=-DPIC -DABICALLS 70COPTS+= -fPIC ${AINC} 71AFLAGS+= -fPIC 72AS+= -KPIC 73 74.else 75 76SHLIB_TYPE=a.out 77SHLIB_LDSTARTFILE= 78SHLIB_LDENDFILE= 79SHLIB_SOVERSION=${SHLIB_MAJOR}.${SHLIB_MINOR} 80CPICFLAGS?= -fpic -DPIC 81CPPPICFLAGS?= -DPIC 82CAPICFLAGS?= ${CPPPICFLAGS} ${CPICFLAGS} 83APICFLAGS?= -k 84 85.endif 86 87 88CFLAGS+= ${COPTS} 89 90.c.o: 91 @echo ${COMPILE.c:Q} ${.IMPSRC} 92 @${COMPILE.c} ${.IMPSRC} -o ${.TARGET}.o 93 @${LD} -x -r ${.TARGET}.o -o ${.TARGET} 94 @rm -f ${.TARGET}.o 95 96.c.po: 97 @echo ${COMPILE.c:Q} -pg ${.IMPSRC} -o ${.TARGET} 98 @${COMPILE.c} -pg ${.IMPSRC} -o ${.TARGET}.o 99 @${LD} -X -r ${.TARGET}.o -o ${.TARGET} 100 @rm -f ${.TARGET}.o 101 102.c.so: 103 @echo ${COMPILE.c:Q} ${CPICFLAGS} ${.IMPSRC} -o ${.TARGET} 104 @${COMPILE.c} ${CPICFLAGS} ${.IMPSRC} -o ${.TARGET}.o 105 @${LD} -x -r ${.TARGET}.o -o ${.TARGET} 106 @rm -f ${.TARGET}.o 107 108.c.ln: 109 ${LINT} ${LINTFLAGS} ${CFLAGS:M-[IDU]*} -i ${.IMPSRC} 110 111.cc.o .C.o: 112 @echo ${COMPILE.cc:Q} ${.IMPSRC} 113 @${COMPILE.cc} ${.IMPSRC} -o ${.TARGET}.o 114 @${LD} -x -r ${.TARGET}.o -o ${.TARGET} 115 @rm -f ${.TARGET}.o 116 117.cc.po .C.po: 118 @echo ${COMPILE.cc:Q} -pg ${.IMPSRC} -o ${.TARGET} 119 @${COMPILE.cc} -pg ${.IMPSRC} -o ${.TARGET}.o 120 @${LD} -X -r ${.TARGET}.o -o ${.TARGET} 121 @rm -f ${.TARGET}.o 122 123.cc.so .C.so: 124 @echo ${COMPILE.cc:Q} ${CPICFLAGS} ${.IMPSRC} -o ${.TARGET} 125 @${COMPILE.cc} ${CPICFLAGS} ${.IMPSRC} -o ${.TARGET}.o 126 @${LD} -x -r ${.TARGET}.o -o ${.TARGET} 127 @rm -f ${.TARGET}.o 128 129.S.o .s.o: 130 @echo ${COMPILE.S:Q} ${CFLAGS:M-[ID]*} ${AINC} ${.IMPSRC} 131 @${COMPILE.S} ${CFLAGS:M-[ID]*} ${AINC} ${.IMPSRC} -o ${.TARGET}.o 132 @${LD} -x -r ${.TARGET}.o -o ${.TARGET} 133 @rm -f ${.TARGET}.o 134 135.S.po .s.po: 136 @echo ${COMPILE.S:Q} -DGPROF -DPROF ${CFLAGS:M-[ID]*} ${AINC} ${.IMPSRC} -o ${.TARGET} 137 @${COMPILE.S} -DGPROF -DPROF ${CFLAGS:M-[ID]*} ${AINC} ${.IMPSRC} -o ${.TARGET}.o 138 @${LD} -X -r ${.TARGET}.o -o ${.TARGET} 139 @rm -f ${.TARGET}.o 140 141.S.so .s.so: 142 @echo ${COMPILE.S:Q} ${CAPICFLAGS} ${CFLAGS:M-[ID]*} ${AINC} ${.IMPSRC} -o ${.TARGET} 143 @${COMPILE.S} ${CAPICFLAGS} ${CFLAGS:M-[ID]*} ${AINC} ${.IMPSRC} -o ${.TARGET}.o 144 @${LD} -x -r ${.TARGET}.o -o ${.TARGET} 145 @rm -f ${.TARGET}.o 146 147 148.if !defined(NOPROFILE) 149_LIBS=lib${LIB}.a lib${LIB}_p.a 150.else 151_LIBS=lib${LIB}.a 152.endif 153 154.if !defined(NOPIC) 155_LIBS+=lib${LIB}_pic.a 156.if defined(SHLIB_MAJOR) && defined(SHLIB_MINOR) 157_LIBS+=lib${LIB}.so.${SHLIB_MAJOR}.${SHLIB_MINOR} 158.endif 159.endif 160 161.if !defined(NOLINT) 162_LIBS+=llib-l${LIB}.ln 163.endif 164 165all: ${SRCS} ${_LIBS} 166 167__archivebuild: .USE 168 @rm -f ${.TARGET} 169 @${AR} cq ${.TARGET} `NM=${NM} lorder ${.ALLSRC} | tsort -q` 170 ${RANLIB} ${.TARGET} 171 172__archiveinstall: .USE 173 ${INSTALL} ${COPY} -o ${LIBOWN} -g ${LIBGRP} -m 600 ${.ALLSRC} \ 174 ${.TARGET} 175 ${RANLIB} -t ${.TARGET} 176 chmod ${LIBMODE} ${.TARGET} 177 178DPSRCS+= ${SRCS:M*.l:.l=.c} ${SRCS:M*.y:.y=.c} 179CLEANFILES+= ${DPSRCS} 180 181OBJS+= ${SRCS:N*.h:N*.sh:R:S/$/.o/g} 182lib${LIB}.a:: ${OBJS} __archivebuild 183 @echo building standard ${LIB} library 184 185POBJS+= ${OBJS:.o=.po} 186lib${LIB}_p.a:: ${POBJS} __archivebuild 187 @echo building profiled ${LIB} library 188 189SOBJS+= ${OBJS:.o=.so} 190lib${LIB}_pic.a:: ${SOBJS} __archivebuild 191 @echo building shared object ${LIB} library 192 193lib${LIB}.so.${SHLIB_MAJOR}.${SHLIB_MINOR}: lib${LIB}_pic.a ${DPADD} \ 194 ${SHLIB_LDSTARTFILE} ${SHLIB_LDENDFILE} 195 @echo building shared ${LIB} library \(version ${SHLIB_MAJOR}.${SHLIB_MINOR}\) 196 @rm -f lib${LIB}.so.${SHLIB_MAJOR}.${SHLIB_MINOR} 197.if (${SHLIB_TYPE} == "a.out") 198 $(LD) -x -Bshareable -Bforcearchive \ 199 -o ${.TARGET} lib${LIB}_pic.a ${LDADD} 200.elif (${SHLIB_TYPE} == "ELF") 201 $(LD) -x -shared -o ${.TARGET} \ 202 -soname lib${LIB}.so.${SHLIB_SOVERSION} ${SHLIB_LDSTARTFILE} \ 203 --whole-archive lib${LIB}_pic.a --no-whole-archive ${LDADD} \ 204 ${SHLIB_LDENDFILE} 205.endif 206 207LOBJS+= ${LSRCS:.c=.ln} ${SRCS:M*.c:.c=.ln} 208LLIBS?= -lc 209llib-l${LIB}.ln: ${LOBJS} 210 @echo building llib-l${LIB}.ln 211 @rm -f llib-l${LIB}.ln 212 @${LINT} -C${LIB} ${LOBJS} ${LLIBS} 213 214cleanlib: 215 rm -f a.out [Ee]rrs mklog core *.core ${CLEANFILES} 216 rm -f lib${LIB}.a ${OBJS} 217 rm -f lib${LIB}_p.a ${POBJS} 218 rm -f lib${LIB}_pic.a lib${LIB}.so.*.* ${SOBJS} 219 rm -f llib-l${LIB}.ln ${LOBJS} 220 221.if defined(SRCS) 222afterdepend: .depend 223 @(TMP=/tmp/_depend$$$$; \ 224 sed -e 's/^\([^\.]*\).o[ ]*:/\1.o \1.po \1.so \1.ln:/' \ 225 < .depend > $$TMP; \ 226 mv $$TMP .depend) 227.endif 228 229.if !target(libinstall) 230libinstall:: ${DESTDIR}${LIBDIR}/lib${LIB}.a 231.if !defined(UPDATE) 232.PHONY: ${DESTDIR}${LIBDIR}/lib${LIB}.a 233.endif 234.if !defined(BUILD) 235${DESTDIR}${LIBDIR}/lib${LIB}.a: .MADE 236.endif 237 238.PRECIOUS: ${DESTDIR}${LIBDIR}/lib${LIB}.a 239${DESTDIR}${LIBDIR}/lib${LIB}.a: lib${LIB}.a __archiveinstall 240 241.if !defined(NOPROFILE) 242libinstall:: ${DESTDIR}${LIBDIR}/lib${LIB}_p.a 243.if !defined(UPDATE) 244.PHONY: ${DESTDIR}${LIBDIR}/lib${LIB}_p.a 245.endif 246.if !defined(BUILD) 247${DESTDIR}${LIBDIR}/lib${LIB}_p.a: .MADE 248.endif 249 250.PRECIOUS: ${DESTDIR}${LIBDIR}/lib${LIB}_p.a 251${DESTDIR}${LIBDIR}/lib${LIB}_p.a: lib${LIB}_p.a __archiveinstall 252.endif 253 254.if !defined(NOPIC) 255libinstall:: ${DESTDIR}${LIBDIR}/lib${LIB}_pic.a 256.if !defined(UPDATE) 257.PHONY: ${DESTDIR}${LIBDIR}/lib${LIB}_pic.a 258.endif 259.if !defined(BUILD) 260${DESTDIR}${LIBDIR}/lib${LIB}_pic.a: .MADE 261.endif 262 263.PRECIOUS: ${DESTDIR}${LIBDIR}/lib${LIB}_pic.a 264${DESTDIR}${LIBDIR}/lib${LIB}_pic.a: lib${LIB}_pic.a __archiveinstall 265.endif 266 267.if !defined(NOPIC) && defined(SHLIB_MAJOR) && defined(SHLIB_MINOR) 268libinstall:: ${DESTDIR}${LIBDIR}/lib${LIB}.so.${SHLIB_MAJOR}.${SHLIB_MINOR} 269.if !defined(UPDATE) 270.PHONY: ${DESTDIR}${LIBDIR}/lib${LIB}.so.${SHLIB_MAJOR}.${SHLIB_MINOR} 271.endif 272.if !defined(BUILD) 273${DESTDIR}${LIBDIR}/lib${LIB}.so.${SHLIB_MAJOR}.${SHLIB_MINOR}: .MADE 274.endif 275 276.PRECIOUS: ${DESTDIR}${LIBDIR}/lib${LIB}.so.${SHLIB_MAJOR}.${SHLIB_MINOR} 277${DESTDIR}${LIBDIR}/lib${LIB}.so.${SHLIB_MAJOR}.${SHLIB_MINOR}: lib${LIB}.so.${SHLIB_MAJOR}.${SHLIB_MINOR} 278 ${INSTALL} ${COPY} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} ${.ALLSRC} \ 279 ${.TARGET} 280.if (${SHLIB_TYPE} == "ELF") 281 rm -f ${DESTDIR}${LIBDIR}/lib${LIB}.so.${SHLIB_MAJOR} 282 ln -s lib${LIB}.so.${SHLIB_MAJOR}.${SHLIB_MINOR} \ 283 ${DESTDIR}${LIBDIR}/lib${LIB}.so.${SHLIB_MAJOR} 284 rm -f ${DESTDIR}${LIBDIR}/lib${LIB}.so 285 ln -s lib${LIB}.so.${SHLIB_MAJOR}.${SHLIB_MINOR} \ 286 ${DESTDIR}${LIBDIR}/lib${LIB}.so 287.endif 288.endif 289 290.if !defined(NOLINT) 291libinstall:: ${DESTDIR}${LINTLIBDIR}/llib-l${LIB}.ln 292.if !defined(UPDATE) 293.PHONY: ${DESTDIR}${LINTLIBDIR}/llib-l${LIB}.ln 294.endif 295.if !defined(BUILD) 296${DESTDIR}${LINTLIBDIR}/llib-l${LIB}.ln: .MADE 297.endif 298 299.PRECIOUS: ${DESTDIR}${LINTLIBDIR}/llib-l${LIB}.ln 300${DESTDIR}${LINTLIBDIR}/llib-l${LIB}.ln: llib-l${LIB}.ln 301 ${INSTALL} ${COPY} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ 302 llib-l${LIB}.ln ${DESTDIR}${LINTLIBDIR} 303.endif 304.endif 305 306.if !defined(NOMAN) 307.include <bsd.man.mk> 308.endif 309 310.if !defined(NONLS) 311.include <bsd.nls.mk> 312.endif 313 314.include <bsd.obj.mk> 315.include <bsd.files.mk> 316.include <bsd.inc.mk> 317.include <bsd.links.mk> 318.include <bsd.dep.mk> 319.include <bsd.subdir.mk> 320.include <bsd.sys.mk> 321