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