1# $NetBSD: bsd.lib.mk,v 1.342 2013/10/18 16:06:52 christos Exp $ 2# @(#)bsd.lib.mk 8.3 (Berkeley) 4/22/94 3 4.include <bsd.init.mk> 5.include <bsd.shlib.mk> 6.include <bsd.gcc.mk> 7# Pull in <bsd.sys.mk> here so we can override its .c.o rule 8.include <bsd.sys.mk> 9 10LIBISMODULE?= no 11LIBISPRIVATE?= no 12LIBISCXX?= no 13 14.if ${LIBISMODULE} != "no" 15_LIB_PREFIX?= # empty 16MKDEBUGLIB:= no 17MKLINT:= no 18MKPICINSTALL:= no 19MKPROFILE:= no 20MKSTATICLIB:= no 21.else 22_LIB_PREFIX?= lib 23.endif 24 25.if ${LIBISPRIVATE} != "no" 26MKDEBUGLIB:= no 27MKLINT:= no 28MKPICINSTALL:= no 29. if defined(NOSTATICLIB) && ${MKPICLIB} != "no" 30MKSTATICLIB:= no 31. else 32MKPIC:= no 33. endif 34MKPROFILE:= no 35.endif 36 37##### Basic targets 38.PHONY: checkver libinstall 39realinstall: checkver libinstall 40 41##### LIB specific flags. 42# XXX: This is needed for programs that link with .a libraries 43# Perhaps a more correct solution is to always generate _pic.a 44# files or always have a shared library. 45.if defined(MKPIE) && (${MKPIE} != "no") 46CFLAGS+= ${PIE_CFLAGS} 47AFLAGS+= ${PIE_AFLAGS} 48.endif 49 50##### Libraries that this may depend upon. 51.if defined(LIBDPLIBS) && ${MKPIC} != "no" # { 52.for _lib _dir in ${LIBDPLIBS} 53.if !defined(LIBDO.${_lib}) 54LIBDO.${_lib}!= cd "${_dir}" && ${PRINTOBJDIR} 55.MAKEOVERRIDES+=LIBDO.${_lib} 56.endif 57.if ${LIBDO.${_lib}} == "_external" 58LDADD+= -l${_lib} 59.else 60LDADD+= -L${LIBDO.${_lib}} -l${_lib} 61DPADD+= ${LIBDO.${_lib}}/lib${_lib}.so # Don't use _LIB_PREFIX 62.endif 63.endfor 64.endif # } 65 66##### Build and install rules 67MKDEP_SUFFIXES?= .o .po .pico .go .ln 68 69.if !defined(SHLIB_MAJOR) && exists(${SHLIB_VERSION_FILE}) # { 70SHLIB_MAJOR != . ${SHLIB_VERSION_FILE} ; echo $$major 71SHLIB_MINOR != . ${SHLIB_VERSION_FILE} ; echo $$minor 72SHLIB_TEENY != . ${SHLIB_VERSION_FILE} ; echo $$teeny 73 74DPADD+= ${SHLIB_VERSION_FILE} 75 76# Check for higher installed library versions. 77.if !defined(NOCHECKVER) && !defined(NOCHECKVER_${LIB}) && \ 78 exists(${NETBSDSRCDIR}/lib/checkver) 79checkver: 80 @(cd "${.CURDIR}" && \ 81 HOST_SH=${HOST_SH:Q} AWK=${TOOL_AWK:Q} \ 82 ${HOST_SH} ${NETBSDSRCDIR}/lib/checkver -v ${SHLIB_VERSION_FILE} \ 83 -d ${_DEST.OBJ} ${LIB}) 84.endif 85.endif # } 86 87.if !target(checkver) 88checkver: 89.endif 90 91print-shlib-major: 92.if defined(SHLIB_MAJOR) && ${MKPIC} != "no" 93 @echo ${SHLIB_MAJOR} 94.else 95 @false 96.endif 97 98print-shlib-minor: 99.if defined(SHLIB_MINOR) && ${MKPIC} != "no" 100 @echo ${SHLIB_MINOR} 101.else 102 @false 103.endif 104 105print-shlib-teeny: 106.if defined(SHLIB_TEENY) && ${MKPIC} != "no" 107 @echo ${SHLIB_TEENY} 108.else 109 @false 110.endif 111 112.if defined(SHLIB_MAJOR) && !empty(SHLIB_MAJOR) # { 113.if defined(SHLIB_MINOR) && !empty(SHLIB_MINOR) 114.if defined(SHLIB_TEENY) && !empty(SHLIB_TEENY) 115SHLIB_FULLVERSION=${SHLIB_MAJOR}.${SHLIB_MINOR}.${SHLIB_TEENY} 116.else 117SHLIB_FULLVERSION=${SHLIB_MAJOR}.${SHLIB_MINOR} 118.endif 119.else 120SHLIB_FULLVERSION=${SHLIB_MAJOR} 121.endif 122.endif # } 123 124# add additional suffixes not exported. 125# .po is used for profiling object files. 126# .pico is used for PIC object files. 127.SUFFIXES: .out .a .ln .pico .po .go .o .s .S .c .cc .cpp .cxx .C .m .F .f .r .y .l .cl .p .h 128.SUFFIXES: .sh .m4 .m 129 130 131# Set PICFLAGS to cc flags for producing position-independent code, 132# if not already set. 133 134# Data-driven table using make variables to control how shared libraries 135# are built for different platforms and object formats. 136# SHLIB_MAJOR, SHLIB_MINOR, SHLIB_TEENY: Major, minor, and teeny version 137# numbers of shared library 138# SHLIB_SOVERSION: version number to be compiled into a shared library 139# via -soname. Usualy ${SHLIB_MAJOR} on ELF. 140# NetBSD/pmax used to use ${SHLIB_MAJOR}[.${SHLIB_MINOR} 141# [.${SHLIB_TEENY}]] 142# SHLIB_SHFLAGS: Flags to tell ${LD} to emit shared library. 143# with ELF, also set shared-lib version for ld.so. 144# SHLIB_LDSTARTFILE: support .o file, call C++ file-level constructors 145# SHLIB_LDENDFILE: support .o file, call C++ file-level destructors 146 147PICFLAGS ?= -fPIC 148 149.if ${MKPICLIB} != "no" 150CSHLIBFLAGS+= ${PICFLAGS} 151.endif 152 153.if defined(CSHLIBFLAGS) && !empty(CSHLIBFLAGS) 154MKSHLIBOBJS= yes 155.else 156MKSHLIBOBJS= no 157.endif 158 159.if (defined(MKDEBUG) && (${MKDEBUG} != "no")) || \ 160 (defined(CFLAGS) && !empty(CFLAGS:M*-g*)) 161# We only add -g to the shared library objects 162# because we don't currently split .a archives. 163CSHLIBFLAGS+= -g 164.if ${LIBISPRIVATE} == "yes" 165CFLAGS+= -g 166.endif 167.endif 168 169# Platform-independent linker flags for ELF shared libraries 170SHLIB_SOVERSION= ${SHLIB_MAJOR} 171SHLIB_SHFLAGS= -Wl,-soname,${_LIB}.so.${SHLIB_SOVERSION} 172SHLIB_SHFLAGS+= -Wl,--warn-shared-textrel 173.if !defined(SHLIB_MKMAP) || ${SHLIB_MKMAP} != "no" 174SHLIB_SHFLAGS+= -Wl,-Map=${_LIB}.so.${SHLIB_SOVERSION}.map 175.endif 176CLEANFILES+= ${_LIB}.so.${SHLIB_SOVERSION}.map 177SHLIB_LDSTARTFILE?= ${_GCC_CRTI} ${_GCC_CRTBEGINS} 178SHLIB_LDENDFILE?= ${_GCC_CRTENDS} ${_GCC_CRTN} 179 180CFLAGS+= ${COPTS} 181OBJCFLAGS+= ${OBJCOPTS} 182AFLAGS+= ${COPTS} 183FFLAGS+= ${FOPTS} 184 185.if defined(CTFCONVERT) 186.if defined(CFLAGS) && !empty(CFLAGS:M*-g*) 187CTFFLAGS+= -g 188.endif 189.endif 190 191LIBSTRIPAOBJS= yes 192.if !defined(CFLAGS) || empty(CFLAGS:M*-g*) 193LIBSTRIPCOBJS= yes 194.endif 195.if !defined(OBJCFLAGS) || empty(OBJCFLAGS:M*-g*) 196LIBSTRIPOBJCOBJS= yes 197.endif 198.if !defined(FFLAGS) || empty(FFLAGS:M*-g*) 199LIBSTRIPFOBJS= yes 200.endif 201.if !defined(CSHLIBFLAGS) || empty(CSHLIBFLAGS:M*-g*) 202LIBSTRIPSHLIBOBJS= yes 203.endif 204 205.if defined(__MINIX) && ${USE_BITCODE:Uno} == "yes" 206 207SHLIB_SHFLAGS+= ${${HAVE_GOLD:Uno} != "no":? -Wl,--script,${LDS_SHARED_LIB}:} 208 209.S.bc: ${.TARGET:.bc=.o} 210 rm -f ${.TARGET} 211 ln ${.TARGET:.bc=.o} ${.TARGET} 212.c.bc: 213 ${_MKTARGET_COMPILE} 214 ${COMPILE.c} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o - \ 215 -Qunused-arguments -E -D"__weak_alias(X, Y)=__weak_alias2( __WEAK__ ## X, __WEAK__ ## Y)" \ 216 | sed 's/__WEAK__//g' \ 217 | ${COMPILE.c} -flto ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} -x c - \ 218 -o ${.TARGET} -D"STRINGIFY(a)=#a" -D"__weak_alias2(X, Y)=_Pragma(STRINGIFY(weak X = Y))" 219.endif # defined(__MINIX) && ${USE_BITCODE:Uno} == "yes" 220.c.o: 221 ${_MKTARGET_COMPILE} 222 ${COMPILE.c} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET} 223.if defined(CTFCONVERT) 224 ${CTFCONVERT} ${CTFFLAGS} ${.TARGET} 225.endif 226.if defined(LIBSTRIPCOBJS) 227 ${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET} 228.endif 229 230.c.po: 231 ${_MKTARGET_COMPILE} 232 ${COMPILE.c} ${PROFFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} -pg ${.IMPSRC} -o ${.TARGET} 233.if defined(CTFCONVERT) 234 ${CTFCONVERT} ${CTFFLAGS} ${.TARGET} 235.endif 236.if defined(LIBSTRIPCOBJS) 237 ${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET} 238.endif 239 240.c.go: 241 ${_MKTARGET_COMPILE} 242 ${COMPILE.c} ${DEBUGFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} -g ${.IMPSRC} -o ${.TARGET} 243 244.c.pico: 245 ${_MKTARGET_COMPILE} 246 ${COMPILE.c} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${CSHLIBFLAGS} ${.IMPSRC} -o ${.TARGET} 247.if defined(LIBSTRIPSHLIBOBJS) 248 ${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET} 249.endif 250 251.cc.o .cpp.o .cxx.o .C.o: 252 ${_MKTARGET_COMPILE} 253 ${COMPILE.cc} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET} 254.if defined(LIBSTRIPCOBJS) 255 ${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET} 256.endif 257 258.cc.po .cpp.po .cxx.po .C.po: 259 ${_MKTARGET_COMPILE} 260 ${COMPILE.cc} ${PROFFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} -pg ${.IMPSRC} -o ${.TARGET} 261.if defined(LIBSTRIPCOBJS) 262 ${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET} 263.endif 264 265.cc.go .cpp.go .cxx.go .C.go: 266 ${_MKTARGET_COMPILE} 267 ${COMPILE.cc} ${DEBUGFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} -g ${.IMPSRC} -o ${.TARGET} 268 269.cc.pico .cpp.pico .cxx.pico .C.pico: 270 ${_MKTARGET_COMPILE} 271 ${COMPILE.cc} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${CSHLIBFLAGS} ${.IMPSRC} -o ${.TARGET} 272.if defined(LIBSTRIPSHLIBOBJS) 273 ${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET} 274.endif 275 276.f.o: 277 ${_MKTARGET_COMPILE} 278 ${COMPILE.f} ${.IMPSRC} -o ${.TARGET} 279.if defined(CTFCONVERT) 280 ${CTFCONVERT} ${CTFFLAGS} ${.TARGET} 281.endif 282.if defined(LIBSTRIPFOBJS) 283 ${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET} 284.endif 285 286.f.po: 287 ${_MKTARGET_COMPILE} 288 ${COMPILE.f} ${PROFFLAGS} -pg ${.IMPSRC} -o ${.TARGET} 289.if defined(CTFCONVERT) 290 ${CTFCONVERT} ${CTFFLAGS} ${.TARGET} 291.endif 292.if defined(LIBSTRIPFOBJS) 293 ${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET} 294.endif 295 296.f.go: 297 ${_MKTARGET_COMPILE} 298 ${COMPILE.f} ${DEBUGFLAGS} -g ${.IMPSRC} -o ${.TARGET} 299 300.f.pico: 301 ${_MKTARGET_COMPILE} 302 ${COMPILE.f} ${PICFLAGS} ${.IMPSRC} -o ${.TARGET} 303.if defined(LIBSTRIPFOBJS) 304 ${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET} 305.endif 306 307.f.ln: 308 ${_MKTARGET_COMPILE} 309 @echo Skipping lint for Fortran libraries. 310 311.m.o: 312 ${_MKTARGET_COMPILE} 313 ${COMPILE.m} ${OBJCOPTS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET} 314.if defined(CTFCONVERT) 315 ${CTFCONVERT} ${CTFFLAGS} ${.TARGET} 316.endif 317.if defined(LIBSTRIPOBJCOBJS) 318 ${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET} 319.endif 320 321.m.po: 322 ${_MKTARGET_COMPILE} 323 ${COMPILE.m} ${PROFFLAGS} -pg ${OBJCOPTS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET} 324.if defined(CTFCONVERT) 325 ${CTFCONVERT} ${CTFFLAGS} ${.TARGET} 326.endif 327.if defined(LIBSTRIPOBJCOBJS) 328 ${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET} 329.endif 330 331.m.go: 332 ${_MKTARGET_COMPILE} 333 ${COMPILE.m} ${DEBUGFLAGS} -g ${OBJCOPTS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET} 334.if defined(LIBSTRIPOBJCOBJS) 335 ${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET} 336.endif 337 338.m.pico: 339 ${_MKTARGET_COMPILE} 340 ${COMPILE.m} ${CSHLIBFLAGS} ${OBJCOPTS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET} 341.if defined(LIBSTRIPOBJCOBJS) 342 ${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET} 343.endif 344 345.s.o: 346 ${_MKTARGET_COMPILE} 347 ${COMPILE.s} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET} 348.if defined(CTFCONVERT) 349 ${CTFCONVERT} ${CTFFLAGS} ${.TARGET} 350.endif 351.if defined(LIBSTRIPAOBJS) 352 ${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET} 353.endif 354 355.S.o: 356 ${_MKTARGET_COMPILE} 357 ${COMPILE.S} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET} 358.if defined(CTFCONVERT) 359 ${CTFCONVERT} ${CTFFLAGS} ${.TARGET} 360.endif 361.if defined(LIBSTRIPAOBJS) 362 ${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET} 363.endif 364 365.s.po: 366 ${_MKTARGET_COMPILE} 367 ${COMPILE.s} ${PROFFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET} 368.if defined(CTFCONVERT) 369 ${CTFCONVERT} ${CTFFLAGS} ${.TARGET} 370.endif 371.if defined(LIBSTRIPAOBJS) 372 ${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET} 373.endif 374 375.S.po: 376 ${_MKTARGET_COMPILE} 377 ${COMPILE.S} ${PROFFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET} 378.if defined(CTFCONVERT) 379 ${CTFCONVERT} ${CTFFLAGS} ${.TARGET} 380.endif 381.if defined(LIBSTRIPAOBJS) 382 ${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET} 383.endif 384 385.s.go: 386 ${_MKTARGET_COMPILE} 387 ${COMPILE.s} ${DEBUGFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET} 388 389.S.go: 390 ${_MKTARGET_COMPILE} 391 ${COMPILE.S} ${DEBUGFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET} 392 393.s.pico: 394 ${_MKTARGET_COMPILE} 395 ${COMPILE.s} ${PICFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET} 396.if defined(LIBSTRIPAOBJS) 397 ${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET} 398.endif 399 400.S.pico: 401 ${_MKTARGET_COMPILE} 402 ${COMPILE.S} ${PICFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET} 403.if defined(LIBSTRIPAOBJS) 404 ${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET} 405.endif 406 407# Declare a few variables to make our life easier later. 408_LIB:=${_LIB_PREFIX}${LIB} 409_LIB.a:=${_LIB}.a 410_LIB_p.a:=${_LIB}_p.a 411_LIB_g.a:=${_LIB}_g.a 412_LIB_pic.a:=${_LIB}_pic.a 413_LIB.ln:=llib-l${LIB}.ln 414.if defined(__MINIX) && ${USE_BITCODE:Uno} == "yes" 415_LIB_bc.a:=${_LIB}_bc.a 416.endif # defined(__MINIX) 417 418.if ${MKPIC} != "no" && defined(SHLIB_FULLVERSION) 419_LIB.so:=${_LIB}.so 420_LIB.so.major:=${_LIB}.so.${SHLIB_MAJOR} 421_LIB.so.full:=${_LIB}.so.${SHLIB_FULLVERSION} 422.if ${MKDEBUG} != "no" 423_LIB.so.debug:=${_LIB.so.full}.debug 424.endif 425.endif 426 427_DEST.LIB:=${DESTDIR}${LIBDIR} 428_DEST.OBJ:=${DESTDIR}${_LIBSODIR} 429_DEST.LINT:=${DESTDIR}${LINTLIBDIR} 430_DEST.DEBUG:=${DESTDIR}${DEBUGDIR}${LIBDIR} 431_DEST.ODEBUG:=${DESTDIR}${DEBUGDIR}${_LIBSODIR} 432 433.if defined(LIB) # { 434.if (${MKPIC} == "no" || (defined(LDSTATIC) && ${LDSTATIC} != "") \ 435 || ${MKLINKLIB} != "no") && ${MKSTATICLIB} != "no" 436_LIBS=${_LIB.a} 437.else 438_LIBS= 439.endif 440 441.if ${LIBISPRIVATE} != "no" \ 442 && (defined(USE_COMBINE) && ${USE_COMBINE} == "yes" \ 443 && !defined(NOCOMBINE)) # { 444.for f in ${SRCS:N*.h:N*.sh:C/\.[yl]$/.c/g} 445COMBINEFLAGS.${LIB}.$f := ${CPPFLAGS.$f:D1} ${CPUFLAGS.$f:D2} ${COPTS.$f:D3} ${OBJCOPTS.$f:D4} ${CXXFLAGS.$f:D5} 446.if empty(COMBINEFLAGS.${LIB}.${f}) && !defined(NOCOMBINE.$f) 447COMBINESRCS+= ${f} 448NODPSRCS+= ${f} 449.else 450OBJS+= ${f:R:S/$/.o/} 451.endif 452.endfor 453 454.if !empty(COMBINESRCS) 455OBJS+= ${_LIB}_combine.o 456${_LIB}_combine.o: ${COMBINESRCS} 457 ${_MKTARGET_COMPILE} 458 ${COMPILE.c} -MD --combine ${.ALLSRC} -o ${.TARGET} 459.if defined(LIBSTRIPOBJS) 460 ${OBJCOPY} -x ${.TARGET} 461.endif 462 463CLEANFILES+= ${_LIB}_combine.d 464 465.if exists("${_LIB}_combine.d") 466.include "${_LIB}_combine.d" 467.endif 468.endif # empty(XSRCS.${LIB}) 469.else # } { 470OBJS+=${SRCS:N*.h:N*.sh:R:S/$/.o/g} 471.endif # } 472 473STOBJS+=${OBJS} 474 475LOBJS+=${LSRCS:.c=.ln} ${SRCS:M*.c:.c=.ln} 476 477.if ${LIBISPRIVATE} != "no" 478# No installation is required 479libinstall:: 480.endif 481 482.if ${MKDEBUGLIB} != "no" 483_LIBS+=${_LIB_g.a} 484GOBJS+=${OBJS:.o=.go} 485DEBUGFLAGS?=-DDEBUG 486.endif 487 488.if ${MKPROFILE} != "no" 489_LIBS+=${_LIB_p.a} 490POBJS+=${OBJS:.o=.po} 491PROFFLAGS?=-DGPROF -DPROF 492.endif 493 494.if ${MKPIC} != "no" # { 495.if ${MKPICLIB} == "no" 496.if ${MKSHLIBOBJS} != "no" 497# make _pic.a, which isn't really pic, 498# since it's needed for making shared lib. 499# but don't install it. 500SOLIB=${_LIB_pic.a} 501SOBJS+=${OBJS:.o=.pico} 502.else 503SOLIB=${_LIB.a} 504.endif 505.else 506SOLIB=${_LIB_pic.a} 507_LIBS+=${SOLIB} 508SOBJS+=${OBJS:.o=.pico} 509.endif 510.if defined(SHLIB_FULLVERSION) 511_LIBS+=${_LIB.so.full} 512.endif 513.endif # } 514 515.if ${MKLINT} != "no" && !empty(LOBJS) 516_LIBS+=${_LIB.ln} 517.endif 518 519ALLOBJS= 520.if (${MKPIC} == "no" || (defined(LDSTATIC) && ${LDSTATIC} != "") \ 521 || ${MKLINKLIB} != "no") && ${MKSTATICLIB} != "no" 522ALLOBJS+=${STOBJS} 523.endif 524ALLOBJS+=${POBJS} ${SOBJS} 525.if ${MKLINT} != "no" && !empty(LOBJS) 526ALLOBJS+=${LOBJS} 527.endif 528.else # !defined(LIB) # } { 529LOBJS= 530SOBJS= 531.endif # !defined(LIB) # } 532 533_YLSRCS= ${SRCS:M*.[ly]:C/\..$/.c/} ${YHEADER:D${SRCS:M*.y:.y=.h}} 534 535.if ${USE_BITCODE:Uno} == "yes" 536_LIBS+=${_LIB_bc.a} 537.endif # ${USE_BITCODE:Uno} == "yes" 538 539.NOPATH: ${ALLOBJS} ${_LIBS} ${_YLSRCS} 540 541realall: ${SRCS} ${ALLOBJS:O} ${_LIBS} ${_LIB.so.debug} 542 543MKARZERO?=no 544 545.if ${MKARZERO} == "yes" 546_ARFL=crsD 547_ARRANFL=sD 548_INSTRANLIB= 549.else 550_ARFL=crs 551_ARRANFL=s 552_INSTRANLIB=${empty(PRESERVE):?-a "${RANLIB} -t":} 553.endif 554 555# If you change this, please consider reflecting the change in 556# the override in sys/rump/Makefile.rump. 557.if !target(__archivebuild) 558__archivebuild: .USE 559 ${_MKTARGET_BUILD} 560 rm -f ${.TARGET} 561 ${AR} ${_ARFL} ${.TARGET} `NM=${NM} ${LORDER} ${.ALLSRC:M*o} | ${TSORT}` 562.endif 563 564.if !target(__archiveinstall) 565__archiveinstall: .USE 566 ${_MKTARGET_INSTALL} 567 ${INSTALL_FILE} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ 568 ${_INSTRANLIB} ${.ALLSRC} ${.TARGET} 569.endif 570 571__archivesymlinkpic: .USE 572 ${_MKTARGET_INSTALL} 573 ${INSTALL_SYMLINK} ${.ALLSRC} ${.TARGET} 574 575DPSRCS+= ${_YLSRCS} 576CLEANFILES+= ${_YLSRCS} 577 578${STOBJS} ${POBJS} ${GOBJS} ${SOBJS} ${LOBJS}: ${DPSRCS} 579 580.if ${USE_BITCODE:Uno} == "yes" 581BCOBJS+=${OBJS:.o=.bc} 582${LIB_bc.a}:: ${BCOBJS} 583 ${_MKTARGET_BUILD} 584 rm -f ${.TARGET} 585 ${AR} ${_ARFL} ${.TARGET} `NM=${NM} ${LORDER} ${.ALLSRC:M*bc} | ${TSORT}` 586.endif # ${USE_BITCODE:Uno} == "yes" 587 588${_LIB.a}:: ${STOBJS} __archivebuild 589 590${_LIB_p.a}:: ${POBJS} __archivebuild 591 592${_LIB_pic.a}:: ${SOBJS} __archivebuild 593 594${_LIB_g.a}:: ${GOBJS} __archivebuild 595 596 597_LIBLDOPTS= 598.if ${SHLIBDIR} != "/usr/lib" 599_LIBLDOPTS+= -Wl,-rpath,${SHLIBDIR} \ 600 -L=${SHLIBDIR} 601.elif ${SHLIBINSTALLDIR} != "/usr/lib" 602_LIBLDOPTS+= -Wl,-rpath-link,${DESTDIR}${SHLIBINSTALLDIR} \ 603 -L=${SHLIBINSTALLDIR} 604.endif 605 606# gcc -shared now adds -lc automatically. For libraries other than libc and 607# libgcc* we add as a dependency the installed shared libc. For libc and 608# libgcc* we avoid adding libc as a dependency by using -nostdlib. Note that 609# -Xl,-nostdlib is not enough because we want to tell the compiler-driver not 610# to add standard libraries, not the linker. 611.if !defined(LIB) 612.if !empty(LIBC_SO) 613DPLIBC ?= ${DESTDIR}${LIBC_SO} 614.endif 615.else 616.if ${LIB} != "c" && ${LIB:Mgcc*} == "" \ 617 && ${LIB} != "minlib" && ${LIB} != "sys" && ${LIB} != "minc" && ${LIB} != "mthread" # Minix-specific libs 618.if !empty(LIBC_SO) 619DPLIBC ?= ${DESTDIR}${LIBC_SO} 620.endif 621.else 622LDLIBC ?= -nodefaultlibs 623.if ${HAVE_LIBGCC} == "yes" && (${LIB} == "c" || ${LIB} == "minc") 624.if !defined(__MINIX) 625LDADD+= -lgcc 626.else 627LDADD+= ${${ACTIVE_CC} == "gcc":? -lgcc:} 628LDADD+= ${${ACTIVE_CC} == "clang":?-lCompilerRT-Generic:} 629.if ${MACHINE_ARCH} == "earm" 630LDADD+= ${${ACTIVE_CC} == "gcc":? -lgcc_eh:} 631.endif # ${MACHINE_ARCH} == "earm" 632.endif # !defined(__MINIX) 633.endif 634.endif 635.endif 636 637.if ${LIBISCXX} != "no" 638LIBCC:= ${CXX} 639. if ${MKLIBCXX} == "yes" 640LIBDPLIBS+= c++ ${.CURDIR}/../../../../../external/bsd/libc++/lib 641. elif defined(HAVE_GCC) && ${HAVE_GCC} == 4 642LIBDPLIBS+= stdc++ ${.CURDIR}/../../../../../gnu/lib/libstdc++-v3_4 643. else 644LIBDPLIBS+= stdc++ ${.CURDIR}/../../../../../external/gpl3/gcc/lib/libstdc++-v3 645. endif 646.else 647LIBCC:= ${CC} 648.endif 649 650_LDADD.${_LIB}= ${LDADD} ${LDADD.${_LIB}} 651_LDFLAGS.${_LIB}= ${LDFLAGS} ${LDFLAGS.${_LIB}} 652 653${_LIB.so.full}: ${SOLIB} ${DPADD} ${DPLIBC} \ 654 ${SHLIB_LDSTARTFILE} ${SHLIB_LDENDFILE} 655 ${_MKTARGET_BUILD} 656 rm -f ${.TARGET} 657 ${LIBCC} ${LDLIBC} -Wl,-x -shared ${SHLIB_SHFLAGS} \ 658 ${_LDFLAGS.${_LIB}} -o ${.TARGET} ${_LIBLDOPTS} \ 659 ${${USE_BITCODE:Uno} == "yes":? -Wl,-plugin=/usr/pkg/lib/bfd-plugins/LLVMgold.so -Wl,-plugin-opt=-disable-opt:} \ 660 -Wl,--whole-archive ${SOLIB} \ 661 -Wl,--no-whole-archive ${_LDADD.${_LIB}} 662# We don't use INSTALL_SYMLINK here because this is just 663# happening inside the build directory/objdir. XXX Why does 664# this spend so much effort on libraries that aren't live??? XXX 665.if defined(SHLIB_FULLVERSION) && defined(SHLIB_MAJOR) && \ 666 "${SHLIB_FULLVERSION}" != "${SHLIB_MAJOR}" 667 ${HOST_LN} -sf ${_LIB.so.full} ${_LIB.so.major}.tmp 668 mv -f ${_LIB.so.major}.tmp ${_LIB.so.major} 669.endif 670 ${HOST_LN} -sf ${_LIB.so.full} ${_LIB.so}.tmp 671 mv -f ${_LIB.so}.tmp ${_LIB.so} 672.if ${MKSTRIPIDENT} != "no" 673 ${OBJCOPY} -R .ident ${.TARGET} 674.endif 675 676.if defined(_LIB.so.debug) 677${_LIB.so.debug}: ${_LIB.so.full} 678 ${_MKTARGET_CREATE} 679 ( ${OBJCOPY} --only-keep-debug ${_LIB.so.full} ${_LIB.so.debug} \ 680 && ${OBJCOPY} --strip-debug -p -R .gnu_debuglink \ 681 --add-gnu-debuglink=${_LIB.so.debug} ${_LIB.so.full} \ 682 ) || (rm -f ${.TARGET}; false) 683.endif 684 685.if !empty(LOBJS) # { 686LLIBS?= -lc 687${_LIB.ln}: ${LOBJS} 688 ${_MKTARGET_COMPILE} 689 rm -f ${.TARGET} 690.if defined(DESTDIR) 691 ${LINT} -C${LIB} ${.ALLSRC} -L${DESTDIR}/usr/libdata ${LLIBS} 692.else 693 ${LINT} -C${LIB} ${.ALLSRC} ${LLIBS} 694.endif 695.endif # } 696 697lint: ${LOBJS} 698.if defined(LOBJS) && !empty(LOBJS) 699 ${LINT} ${LINTFLAGS} ${LOBJS} 700.endif 701 702 703# If the number of entries in CLEANFILES is too large, then the 704# commands in bsd.clean.mk encounter errors like "exec(/bin/sh) 705# failed (Argument list too long)". Avoid that by splitting the 706# files to clean into several lists using different variable names. 707# __cleanuse is an internal target in bsd.clean.mk; the way we 708# use it here mimics the way it's used by the clean target in 709# bsd.clean.mk. 710# 711clean: libclean1 libclean2 libclean3 libclean4 libclean5 712libclean1: .PHONY .MADE __cleanuse LIBCLEANFILES1 713libclean2: .PHONY .MADE __cleanuse LIBCLEANFILES2 714libclean3: .PHONY .MADE __cleanuse LIBCLEANFILES3 715libclean4: .PHONY .MADE __cleanuse LIBCLEANFILES4 716libclean5: .PHONY .MADE __cleanuse LIBCLEANFILES5 717.if defined(__MINIX) 718# MINIX: core conflicts with core/ in lib/liblwip 719CLEANFILES+= a.out [Ee]rrs mklog *.core 720.else 721CLEANFILES+= a.out [Ee]rrs mklog core *.core 722.endif # defined(__MINIX) 723LIBCLEANFILES1+= ${_LIB.a} ${STOBJS} ${STOBJS:=.tmp} 724LIBCLEANFILES2+= ${_LIB_p.a} ${POBJS} ${POBJS:=.tmp} 725LIBCLEANFILES3+= ${_LIB_g.a} ${GOBJS} ${GOBJS:=.tmp} 726LIBCLEANFILES4+= ${_LIB_pic.a} 727.if ${MKPIC} != "no" && defined(SHLIB_FULLVERSION) 728LIBCLEANFILES4+= ${_LIB.so}.* ${_LIB.so} ${_LIB.so.debug} 729.endif 730LIBCLEANFILES4+= ${SOBJS} ${SOBJS:=.tmp} 731LIBCLEANFILES5+= ${_LIB.ln} ${LOBJS} 732 733.if defined(__MINIX) 734clean: libclean6 735libclean6: .PHONY .MADE __cleanuse LIBCLEANFILES6 736LIBCLEANFILES6+= ${_LIB_bc.a} ${BCOBJS} ${BCOBJS:=.tmp} 737.endif 738 739.if !target(libinstall) # { 740# Make sure it gets defined, in case MKPIC==no && MKLINKLIB==no 741libinstall:: 742 743.if ${USE_BITCODE:Uno} == "yes" 744libinstall:: ${_DEST.LIB}/bc/${_LIB_bc.a} 745.PRECIOUS: ${_DEST.LIB}/bc/${_LIB_bc.a} 746 747.if ${MKUPDATE} == "no" 748.if !defined(BUILD) && !make(all) && !make(${_LIB_bc.a}) 749${_DEST.LIB}/bc/${_LIB_bc.a}! .MADE 750.endif 751${_DEST.LIB}/bc/${_LIB_bc.a}! ${_LIB_bc.a} __archiveinstall 752.else 753.if !defined(BUILD) && !make(all) && !make(${_LIB_bc.a}) 754${_DEST.LIB}/bc/${_LIB_bc.a}: .MADE 755.endif 756${_DEST.LIB}/bc/${_LIB_bc.a}: ${_LIB_bc.a} __archiveinstall 757.endif 758.endif # ${USE_BITCODE:Uno} == "yes" 759 760.if ${MKLINKLIB} != "no" && ${MKSTATICLIB} != "no" 761libinstall:: ${_DEST.LIB}/${_LIB.a} 762.PRECIOUS: ${_DEST.LIB}/${_LIB.a} 763 764.if ${MKUPDATE} == "no" 765.if !defined(BUILD) && !make(all) && !make(${_LIB.a}) 766${_DEST.LIB}/${_LIB.a}! .MADE 767.endif 768${_DEST.LIB}/${_LIB.a}! ${_LIB.a} __archiveinstall 769.else 770.if !defined(BUILD) && !make(all) && !make(${_LIB.a}) 771${_DEST.LIB}/${_LIB.a}: .MADE 772.endif 773${_DEST.LIB}/${_LIB.a}: ${_LIB.a} __archiveinstall 774.endif 775.endif 776 777.if ${MKPROFILE} != "no" 778libinstall:: ${_DEST.LIB}/${_LIB_p.a} 779.PRECIOUS: ${_DEST.LIB}/${_LIB_p.a} 780 781.if ${MKUPDATE} == "no" 782.if !defined(BUILD) && !make(all) && !make(${_LIB_p.a}) 783${_DEST.LIB}/${_LIB_p.a}! .MADE 784.endif 785${_DEST.LIB}/${_LIB_p.a}! ${_LIB_p.a} __archiveinstall 786.else 787.if !defined(BUILD) && !make(all) && !make(${_LIB_p.a}) 788${_DEST.LIB}/${_LIB_p.a}: .MADE 789.endif 790${_DEST.LIB}/${_LIB_p.a}: ${_LIB_p.a} __archiveinstall 791.endif 792.endif 793 794.if ${MKDEBUGLIB} != "no" 795libinstall:: ${_DEST.LIB}/${_LIB_g.a} 796.PRECIOUS: ${_DEST.LIB}/${_LIB_g.a} 797 798.if ${MKUPDATE} == "no" 799.if !defined(BUILD) && !make(all) && !make(${_LIB_g.a}) 800${_DEST.LIB}/${_LIB_g.a}! .MADE 801.endif 802${_DEST.LIB}/${_LIB_g.a}! ${_LIB_g.a} __archiveinstall 803.else 804.if !defined(BUILD) && !make(all) && !make(${LIB_g.a}) 805${_DEST.LIB}/${_LIB_g.a}: .MADE 806.endif 807${_DEST.LIB}/${_LIB_g.a}: ${_LIB_g.a} __archiveinstall 808.endif 809.endif 810 811.if ${MKPIC} != "no" && ${MKPICINSTALL} != "no" 812libinstall:: ${_DEST.LIB}/${_LIB_pic.a} 813.PRECIOUS: ${_DEST.LIB}/${_LIB_pic.a} 814 815.if ${MKUPDATE} == "no" 816.if !defined(BUILD) && !make(all) && !make(${_LIB_pic.a}) 817${_DEST.LIB}/${_LIB_pic.a}! .MADE 818.endif 819.if ${MKPICLIB} == "no" 820${_DEST.LIB}/${_LIB_pic.a}! ${_LIB.a} __archivesymlinkpic 821.else 822${_DEST.LIB}/${_LIB_pic.a}! ${_LIB_pic.a} __archiveinstall 823.endif 824.else 825.if !defined(BUILD) && !make(all) && !make(${_LIB_pic.a}) 826${_DEST.LIB}/${_LIB_pic.a}: .MADE 827.endif 828.if ${MKPICLIB} == "no" 829${_DEST.LIB}/${_LIB_pic.a}: ${_LIB.a} __archivesymlinkpic 830.else 831${_DEST.LIB}/${_LIB_pic.a}: ${_LIB_pic.a} __archiveinstall 832.endif 833.endif 834.endif 835 836.if ${MKPIC} != "no" && defined(SHLIB_FULLVERSION) 837 838libinstall:: ${_DEST.OBJ}/${_LIB.so.full} 839.PRECIOUS: ${_DEST.OBJ}/${_LIB.so.full} 840 841.if ${MKUPDATE} == "no" 842.if !defined(BUILD) && !make(all) && !make(${_LIB.so.full}) 843${_DEST.OBJ}/${_LIB.so.full}! .MADE 844.endif 845${_DEST.OBJ}/${_LIB.so.full}! ${_LIB.so.full} 846.else 847.if !defined(BUILD) && !make(all) && !make(${_LIB.so.full}) 848${_DEST.OBJ}/${_LIB.so.full}: .MADE 849.endif 850${_DEST.OBJ}/${_LIB.so.full}: ${_LIB.so.full} 851.endif 852 ${_MKTARGET_INSTALL} 853 ${INSTALL_FILE} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ 854 ${.ALLSRC} ${.TARGET} 855.if ${_LIBSODIR} != ${LIBDIR} 856 ${INSTALL_SYMLINK} -l r ${_DEST.OBJ}/${_LIB.so.full} \ 857 ${_DEST.LIB}/${_LIB.so.full} 858.endif 859.if defined(SHLIB_FULLVERSION) && defined(SHLIB_MAJOR) && \ 860 "${SHLIB_FULLVERSION}" != "${SHLIB_MAJOR}" 861 ${INSTALL_SYMLINK} ${_LIB.so.full} ${_DEST.OBJ}/${_LIB.so.major} 862.if ${_LIBSODIR} != ${LIBDIR} 863 ${INSTALL_SYMLINK} -l r ${_DEST.OBJ}/${_LIB.so.full} \ 864 ${_DEST.LIB}/${_LIB.so.major} 865.endif 866.endif 867.if ${MKLINKLIB} != "no" 868 ${INSTALL_SYMLINK} ${_LIB.so.full} ${_DEST.OBJ}/${_LIB.so} 869.if ${_LIBSODIR} != ${LIBDIR} 870 ${INSTALL_SYMLINK} -l r ${_DEST.OBJ}/${_LIB.so.full} \ 871 ${_DEST.LIB}/${_LIB.so} 872.endif 873.endif 874.endif 875 876.if defined(_LIB.so.debug) 877libinstall:: ${_DEST.DEBUG}/${_LIB.so.debug} 878.PRECIOUS: ${_DEST.DEBUG}/${_LIB.so.debug} 879 880${_DEST.DEBUG}/${_LIB.so.debug}: ${_LIB.so.debug} 881 ${_MKTARGET_INSTALL} 882 ${INSTALL_FILE} -o ${DEBUGOWN} -g ${DEBUGGRP} -m ${DEBUGMODE} \ 883 ${.ALLSRC} ${.TARGET} 884.if ${_LIBSODIR} != ${LIBDIR} 885 ${INSTALL_SYMLINK} -l r ${_DEST.DEBUG}/${_LIB.so.debug} \ 886 ${_DEST.ODEBUG}/${_LIB.so.debug} 887.endif 888.endif 889 890.if ${MKLINT} != "no" && !empty(LOBJS) 891libinstall:: ${_DEST.LINT}/${_LIB.ln} 892.PRECIOUS: ${_DEST.LINT}/${_LIB.ln} 893 894.if ${MKUPDATE} == "no" 895.if !defined(BUILD) && !make(all) && !make(${_LIB.ln}) 896${_DEST.LINT}/${_LIB.ln}! .MADE 897.endif 898${_DEST.LINT}/${_LIB.ln}! ${_LIB.ln} 899.else 900.if !defined(BUILD) && !make(all) && !make(${_LIB.ln}) 901${_DEST.LINT}/${_LIB.ln}: .MADE 902.endif 903${_DEST.LINT}/${_LIB.ln}: ${_LIB.ln} 904.endif 905 ${_MKTARGET_INSTALL} 906 ${INSTALL_FILE} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ 907 ${.ALLSRC} ${_DEST.LINT} 908.endif 909.endif # !target(libinstall) # } 910 911##### Pull in related .mk logic 912LINKSOWN?= ${LIBOWN} 913LINKSGRP?= ${LIBGRP} 914LINKSMODE?= ${LIBMODE} 915.include <bsd.man.mk> 916.include <bsd.nls.mk> 917.include <bsd.files.mk> 918.include <bsd.inc.mk> 919.include <bsd.links.mk> 920.include <bsd.dep.mk> 921.include <bsd.clang-analyze.mk> 922.include <bsd.clean.mk> 923 924${TARGETS}: # ensure existence 925