1# $NetBSD: bsd.lib.mk,v 1.384 2020/11/09 16:15:05 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} ${OBJECT_TARGET} 225 ${CTFCONVERT_RUN} 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}} ${PGFLAGS} ${.IMPSRC} ${OBJECT_TARGET} 233 ${CTFCONVERT_RUN} 234.if defined(LIBSTRIPCOBJS) 235 ${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET} 236.endif 237 238.c.go: 239 ${_MKTARGET_COMPILE} 240 ${COMPILE.c} ${DEBUGFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} -g ${.IMPSRC} -o ${.TARGET} 241 242.c.pico: 243 ${_MKTARGET_COMPILE} 244 ${COMPILE.c} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${CSHLIBFLAGS} ${.IMPSRC} -o ${.TARGET} 245.if defined(LIBSTRIPSHLIBOBJS) 246 ${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET} 247.endif 248 249.cc.o .cpp.o .cxx.o .C.o: 250 ${_MKTARGET_COMPILE} 251 ${COMPILE.cc} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET} 252.if defined(LIBSTRIPCOBJS) 253 ${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET} 254.endif 255 256.cc.po .cpp.po .cxx.po .C.po: 257 ${_MKTARGET_COMPILE} 258 ${COMPILE.cc} ${PROFFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${PGFLAGS} ${.IMPSRC} -o ${.TARGET} 259.if defined(LIBSTRIPCOBJS) 260 ${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET} 261.endif 262 263.cc.go .cpp.go .cxx.go .C.go: 264 ${_MKTARGET_COMPILE} 265 ${COMPILE.cc} ${DEBUGFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} -g ${.IMPSRC} -o ${.TARGET} 266 267.cc.pico .cpp.pico .cxx.pico .C.pico: 268 ${_MKTARGET_COMPILE} 269 ${COMPILE.cc} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${CSHLIBFLAGS} ${.IMPSRC} -o ${.TARGET} 270.if defined(LIBSTRIPSHLIBOBJS) 271 ${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET} 272.endif 273 274.f.o: 275 ${_MKTARGET_COMPILE} 276 ${COMPILE.f} ${.IMPSRC} ${OBJECT_TARGET} 277 ${CTFCONVERT_RUN} 278.if defined(LIBSTRIPFOBJS) 279 ${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET} 280.endif 281 282.f.po: 283 ${_MKTARGET_COMPILE} 284 ${COMPILE.f} ${PROFFLAGS} ${PGFLAGS} ${.IMPSRC} ${OBJECT_TARGET} 285 ${CTFCONVERT_RUN} 286.if defined(LIBSTRIPFOBJS) 287 ${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET} 288.endif 289 290.f.go: 291 ${_MKTARGET_COMPILE} 292 ${COMPILE.f} ${DEBUGFLAGS} -g ${.IMPSRC} -o ${.TARGET} 293 294.f.pico: 295 ${_MKTARGET_COMPILE} 296 ${COMPILE.f} ${PICFLAGS} ${.IMPSRC} -o ${.TARGET} 297.if defined(LIBSTRIPFOBJS) 298 ${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET} 299.endif 300 301.f.ln: 302 ${_MKTARGET_COMPILE} 303 @echo Skipping lint for Fortran libraries. 304 305.m.o: 306 ${_MKTARGET_COMPILE} 307 ${COMPILE.m} ${OBJCOPTS.${.IMPSRC:T}} ${.IMPSRC} ${OBJECT_TARGET} 308 ${CTFCONVERT_RUN} 309.if defined(LIBSTRIPOBJCOBJS) 310 ${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET} 311.endif 312 313.m.po: 314 ${_MKTARGET_COMPILE} 315 ${COMPILE.m} ${PROFFLAGS} ${PGFLAGS} ${OBJCOPTS.${.IMPSRC:T}} ${.IMPSRC} ${OBJECT_TARGET} 316 ${CTFCONVERT_RUN} 317.if defined(LIBSTRIPOBJCOBJS) 318 ${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET} 319.endif 320 321.m.go: 322 ${_MKTARGET_COMPILE} 323 ${COMPILE.m} ${DEBUGFLAGS} -g ${OBJCOPTS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET} 324.if defined(LIBSTRIPOBJCOBJS) 325 ${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET} 326.endif 327 328.m.pico: 329 ${_MKTARGET_COMPILE} 330 ${COMPILE.m} ${CSHLIBFLAGS} ${OBJCOPTS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET} 331.if defined(LIBSTRIPOBJCOBJS) 332 ${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET} 333.endif 334 335.s.o: 336 ${_MKTARGET_COMPILE} 337 ${COMPILE.s} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} ${OBJECT_TARGET} 338 ${CTFCONVERT_RUN} 339.if defined(LIBSTRIPAOBJS) 340 ${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET} 341.endif 342 343.S.o: 344 ${_MKTARGET_COMPILE} 345 ${COMPILE.S} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} ${OBJECT_TARGET} 346 ${CTFCONVERT_RUN} 347.if defined(LIBSTRIPAOBJS) 348 ${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET} 349.endif 350 351.s.po: 352 ${_MKTARGET_COMPILE} 353 ${COMPILE.s} ${PROFFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} ${OBJECT_TARGET} 354 ${CTFCONVERT_RUN} 355.if defined(LIBSTRIPAOBJS) 356 ${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET} 357.endif 358 359.S.po: 360 ${_MKTARGET_COMPILE} 361 ${COMPILE.S} ${PROFFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} ${OBJECT_TARGET} 362 ${CTFCONVERT_RUN} 363.if defined(LIBSTRIPAOBJS) 364 ${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET} 365.endif 366 367.s.go: 368 ${_MKTARGET_COMPILE} 369 ${COMPILE.s} ${DEBUGFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET} 370 371.S.go: 372 ${_MKTARGET_COMPILE} 373 ${COMPILE.S} ${DEBUGFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET} 374 375.s.pico: 376 ${_MKTARGET_COMPILE} 377 ${COMPILE.s} ${PICFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET} 378.if defined(LIBSTRIPAOBJS) 379 ${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET} 380.endif 381 382.S.pico: 383 ${_MKTARGET_COMPILE} 384 ${COMPILE.S} ${PICFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET} 385.if defined(LIBSTRIPAOBJS) 386 ${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET} 387.endif 388 389# Declare a few variables to make our life easier later. 390_LIB:=${_LIB_PREFIX}${LIB} 391_LIB.a:=${_LIB}.a 392_LIB_p.a:=${_LIB}_p.a 393_LIB_g.a:=${_LIB}_g.a 394_LIB_pic.a:=${_LIB}_pic.a 395_LIB.ln:=llib-l${LIB}.ln 396 397.if ${MKPIC} != "no" && defined(SHLIB_FULLVERSION) 398_LIB.so:=${_LIB}.so 399_LIB.so.major:=${_LIB}.so.${SHLIB_MAJOR} 400_LIB.so.full:=${_LIB}.so.${SHLIB_FULLVERSION} 401_LIB.so.link:=${_LIB}.so.${SHLIB_FULLVERSION}.link 402.if ${MKDEBUG:Uno} != "no" && !defined(NODEBUG) 403_LIB.so.debug:=${_LIB.so.full}.debug 404.endif 405.endif 406 407_DEST.LIB:=${DESTDIR}${LIBDIR} 408_DEST.OBJ:=${DESTDIR}${_LIBSODIR} 409_DEST.LINT:=${DESTDIR}${LINTLIBDIR} 410_DEST.DEBUG:=${DESTDIR}${DEBUGDIR}${LIBDIR} 411_DEST.ODEBUG:=${DESTDIR}${DEBUGDIR}${_LIBSODIR} 412 413.if defined(LIB) # { 414.if (${MKPIC} == "no" || (defined(LDSTATIC) && ${LDSTATIC} != "") \ 415 || ${MKLINKLIB} != "no") && ${MKSTATICLIB} != "no" 416_LIBS=${_LIB.a} 417.else 418_LIBS= 419.endif 420 421.if ${LIBISPRIVATE} != "no" \ 422 && (defined(USE_COMBINE) && ${USE_COMBINE} == "yes" \ 423 && !defined(NOCOMBINE)) # { 424.for f in ${SRCS:N*.h:N*.sh:C/\.[yl]$/.c/g} 425COMBINEFLAGS.${LIB}.$f := ${CPPFLAGS.$f:D1} ${CPUFLAGS.$f:D2} ${COPTS.$f:D3} ${OBJCOPTS.$f:D4} ${CXXFLAGS.$f:D5} 426.if empty(COMBINEFLAGS.${LIB}.${f}) && !defined(NOCOMBINE.$f) 427COMBINESRCS+= ${f} 428NODPSRCS+= ${f} 429.else 430OBJS+= ${f:R:S/$/.o/} 431.endif 432.endfor 433 434.if !empty(COMBINESRCS) 435OBJS+= ${_LIB}_combine.o 436${_LIB}_combine.o: ${COMBINESRCS} 437 ${_MKTARGET_COMPILE} 438 ${COMPILE.c} -MD --combine ${.ALLSRC} -o ${.TARGET} 439.if defined(LIBSTRIPOBJS) 440 ${OBJCOPY} ${OBJCOPYLIBFLAGS} ${.TARGET} 441.endif 442 443CLEANFILES+= ${_LIB}_combine.d 444 445.if exists("${_LIB}_combine.d") 446.include "${_LIB}_combine.d" 447.endif 448.endif # empty(XSRCS.${LIB}) 449.else # } { 450OBJS+=${SRCS:N*.h:N*.sh:R:S/$/.o/g} 451.endif # } 452 453STOBJS+=${OBJS} 454 455LOBJS+=${LSRCS:.c=.ln} ${SRCS:M*.c:.c=.ln} 456 457.if ${LIBISPRIVATE} != "no" 458# No installation is required 459libinstall:: 460.endif 461 462.if ${MKDEBUGLIB} != "no" 463_LIBS+=${_LIB_g.a} 464GOBJS+=${OBJS:.o=.go} 465DEBUGFLAGS?=-DDEBUG 466.endif 467 468.if ${MKPROFILE} != "no" 469_LIBS+=${_LIB_p.a} 470POBJS+=${OBJS:.o=.po} 471PROFFLAGS?=-DGPROF -DPROF 472.endif 473 474.if ${MKPIC} != "no" # { 475.if ${MKPICLIB} == "no" 476.if ${MKSHLIBOBJS} != "no" 477# make _pic.a, which isn't really pic, 478# since it's needed for making shared lib. 479# but don't install it. 480SOLIB=${_LIB_pic.a} 481SOBJS+=${OBJS:.o=.pico} 482.else 483SOLIB=${_LIB.a} 484.endif 485.else 486SOLIB=${_LIB_pic.a} 487_LIBS+=${SOLIB} 488SOBJS+=${OBJS:.o=.pico} 489.endif 490.if defined(SHLIB_FULLVERSION) 491_LIBS+=${_LIB.so.full} 492.endif 493.endif # } 494 495.if ${MKLINT} != "no" && !empty(LOBJS) 496_LIBS+=${_LIB.ln} 497.endif 498 499ALLOBJS= 500.if (${MKPIC} == "no" || (defined(LDSTATIC) && ${LDSTATIC} != "") \ 501 || ${MKLINKLIB} != "no") && ${MKSTATICLIB} != "no" 502ALLOBJS+=${STOBJS} 503.endif 504ALLOBJS+=${POBJS} ${SOBJS} 505.if ${MKLINT} != "no" && !empty(LOBJS) 506ALLOBJS+=${LOBJS} 507.endif 508.else # !defined(LIB) # } { 509LOBJS= 510SOBJS= 511.endif # !defined(LIB) # } 512 513_YLSRCS= ${SRCS:M*.[ly]:C/\..$/.c/} ${YHEADER:D${SRCS:M*.y:.y=.h}} 514 515.NOPATH: ${ALLOBJS} ${_LIBS} ${_YLSRCS} 516 517realall: ${SRCS} ${ALLOBJS:O} ${_LIBS} ${_LIB.so.debug} 518 519.if ${MKARZERO} == "yes" 520_ARFL=crsD 521_ARRANFL=sD 522_INSTRANLIB= 523.else 524_ARFL=crs 525_ARRANFL=s 526_INSTRANLIB=${empty(PRESERVE):?-a "${RANLIB} -t":} 527.endif 528 529# If you change this, please consider reflecting the change in 530# the override in sys/rump/Makefile.rump. 531.if !target(__archivebuild) 532__archivebuild: .USE 533 ${_MKTARGET_BUILD} 534 @rm -f ${.TARGET} 535 ${AR} ${_ARFL} ${.TARGET} `NM=${NM} ${LORDER} ${.ALLSRC:M*o} | ${TSORT}` 536.endif 537 538.if !target(__archiveinstall) 539__archiveinstall: .USE 540 ${_MKTARGET_INSTALL} 541 ${INSTALL_FILE} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ 542 ${_INSTRANLIB} ${.ALLSRC} ${.TARGET} 543.endif 544 545__archivesymlinkpic: .USE 546 ${_MKTARGET_INSTALL} 547 ${INSTALL_SYMLINK} ${.ALLSRC} ${.TARGET} 548 549.if !target(__buildstdlib) 550__buildstdlib: .USE 551 @echo building standard ${.TARGET:T:S/.o//:S/lib//} library 552 @rm -f ${.TARGET} 553 @${LINK.c:S/-nostdinc//} -nostdlib ${LDFLAGS} -Wno-unused-command-line-argument -r -o ${.TARGET} `NM=${NM} ${LORDER} ${.ALLSRC:M*o} | ${TSORT}` 554.endif 555 556.if !target(__buildproflib) 557__buildproflib: .USE 558 @echo building profiled ${.TARGET:T:S/.o//:S/lib//} library 559 ${_MKTARGET_BUILD} 560 @rm -f ${.TARGET} 561 @${LINK.c:S/-nostdinc//} -nostdlib ${LDFLAGS} -r -o ${.TARGET} `NM=${NM} ${LORDER} ${.ALLSRC:M*po} | ${TSORT}` 562.endif 563 564DPSRCS+= ${_YLSRCS} 565CLEANFILES+= ${_YLSRCS} 566 567${STOBJS} ${POBJS} ${GOBJS} ${SOBJS} ${LOBJS}: ${DPSRCS} 568 569${_LIB.a}:: ${STOBJS} __archivebuild 570 571${_LIB_p.a}:: ${POBJS} __archivebuild 572 573${_LIB_pic.a}:: ${SOBJS} __archivebuild 574 575${_LIB_g.a}:: ${GOBJS} __archivebuild 576 577 578_LIBLDOPTS= 579.if ${SHLIBDIR} != "/usr/lib" 580_LIBLDOPTS+= -Wl,-rpath,${SHLIBDIR} \ 581 -L=${SHLIBDIR} 582.elif ${SHLIBINSTALLDIR} != "/usr/lib" 583_LIBLDOPTS+= -Wl,-rpath-link,${DESTDIR}${SHLIBINSTALLDIR} \ 584 -L=${SHLIBINSTALLDIR} 585.endif 586.if ${MKSTRIPSYM:Uyes} == "yes" 587_LIBLDOPTS+= -Wl,-x 588.else 589_LIBLDOPTS+= -Wl,-X 590.endif 591 592# gcc -shared now adds -lc automatically. For libraries other than libc and 593# libgcc* we add as a dependency the installed shared libc. For libc and 594# libgcc* we avoid adding libc as a dependency by using -nostdlib. Note that 595# -Xl,-nostdlib is not enough because we want to tell the compiler-driver not 596# to add standard libraries, not the linker. 597.if !defined(LIB) 598.if !empty(LIBC_SO) 599DPLIBC ?= ${DESTDIR}${LIBC_SO} 600.endif 601.else 602.if ${LIB} != "c" && ${LIB:Mgcc*} == "" 603.if !empty(LIBC_SO) 604DPLIBC ?= ${DESTDIR}${LIBC_SO} 605.endif 606.else 607LDLIBC ?= -nodefaultlibs 608.if ${HAVE_LIBGCC} == "yes" && ${LIB} == "c" 609LDADD+= -lgcc 610.endif 611.endif 612.endif 613 614.if ${LIBISCXX} != "no" 615LIBCC:= ${CXX} 616. if ${MKLIBCXX} == "yes" 617LIBDPLIBS+= c++ ${.CURDIR}/../../../../../external/bsd/libc++/lib 618. else 619LIBDPLIBS+= stdc++ ${.CURDIR}/../../../../../external/gpl3/${EXTERNAL_GCC_SUBDIR}/lib/libstdc++-v3 620. endif 621.else 622LIBCC:= ${CC} 623.endif 624 625_LDADD.${_LIB}= ${LDADD} ${LDADD.${_LIB}} 626_LDFLAGS.${_LIB}= ${LDFLAGS} ${LDFLAGS.${_LIB}} 627 628_MAINLIBDEPS= ${SOLIB} ${DPADD} ${DPLIBC} \ 629 ${SHLIB_LDSTARTFILE} ${SHLIB_LDENDFILE} 630 631.if defined(_LIB.so.debug) 632${_LIB.so.debug}: ${_LIB.so.link} 633 ${_MKTARGET_CREATE} 634 ( ${OBJCOPY} --only-keep-debug \ 635 ${_LIB.so.link} ${_LIB.so.debug} \ 636 ) || (rm -f ${.TARGET}; false) 637${_LIB.so.full}: ${_LIB.so.link} ${_LIB.so.debug} 638 ${_MKTARGET_CREATE} 639 ( ${OBJCOPY} --strip-debug -p -R .gnu_debuglink \ 640 --add-gnu-debuglink=${_LIB.so.debug} \ 641 ${_LIB.so.link} ${_LIB.so.full}.tmp && \ 642 ${MV} ${_LIB.so.full}.tmp ${_LIB.so.full} \ 643 ) || (rm -f ${.TARGET}; false) 644${_LIB.so.link}: ${_MAINLIBDEPS} 645.else # aka no MKDEBUG 646${_LIB.so.full}: ${_MAINLIBDEPS} 647.endif 648 ${_MKTARGET_BUILD} 649 rm -f ${.TARGET} 650 ${LIBCC} ${LDLIBC} -shared ${SHLIB_SHFLAGS} \ 651 ${_LDFLAGS.${_LIB}} -o ${.TARGET}.tmp ${_LIBLDOPTS} \ 652 -Wl,--whole-archive ${SOLIB} \ 653 -Wl,--no-whole-archive ${_LDADD.${_LIB}} 654.if ${MKSTRIPIDENT} != "no" 655 ${OBJCOPY} -R .ident ${.TARGET}.tmp 656.endif 657 ${MV} ${.TARGET}.tmp ${.TARGET} 658# We don't use INSTALL_SYMLINK here because this is just 659# happening inside the build directory/objdir. XXX Why does 660# this spend so much effort on libraries that aren't live??? XXX 661# XXX Also creates dead symlinks until the .full rule runs 662# above and creates the main link 663.if defined(SHLIB_FULLVERSION) && defined(SHLIB_MAJOR) && \ 664 "${SHLIB_FULLVERSION}" != "${SHLIB_MAJOR}" 665 ${HOST_LN} -sf ${_LIB.so.full} ${_LIB.so.major}.tmp 666 ${MV} ${_LIB.so.major}.tmp ${_LIB.so.major} 667.endif 668 ${HOST_LN} -sf ${_LIB.so.full} ${_LIB.so}.tmp 669 ${MV} ${_LIB.so}.tmp ${_LIB.so} 670 671.if !empty(LOBJS) # { 672LLIBS?= -lc 673${_LIB.ln}: ${LOBJS} 674 ${_MKTARGET_COMPILE} 675 rm -f ${.TARGET} 676.if defined(DESTDIR) 677 ${LINT} -C${LIB} ${.ALLSRC} -L${DESTDIR}/usr/libdata ${LLIBS} 678.else 679 ${LINT} -C${LIB} ${.ALLSRC} ${LLIBS} 680.endif 681.endif # } 682 683lint: ${LOBJS} 684.if defined(LOBJS) && !empty(LOBJS) 685 ${LINT} ${LINTFLAGS} ${LOBJS} 686.endif 687 688 689# If the number of entries in CLEANFILES is too large, then the 690# commands in bsd.clean.mk encounter errors like "exec(/bin/sh) 691# failed (Argument list too long)". Avoid that by splitting the 692# files to clean into several lists using different variable names. 693# __cleanuse is an internal target in bsd.clean.mk; the way we 694# use it here mimics the way it's used by the clean target in 695# bsd.clean.mk. 696# 697clean: libclean1 libclean2 libclean3 libclean4 libclean5 698libclean1: .PHONY .MADE __cleanuse LIBCLEANFILES1 699libclean2: .PHONY .MADE __cleanuse LIBCLEANFILES2 700libclean3: .PHONY .MADE __cleanuse LIBCLEANFILES3 701libclean4: .PHONY .MADE __cleanuse LIBCLEANFILES4 702libclean5: .PHONY .MADE __cleanuse LIBCLEANFILES5 703CLEANFILES+= a.out [Ee]rrs mklog core *.core 704LIBCLEANFILES1+= ${_LIB.a} ${STOBJS} ${STOBJS:=.tmp} 705LIBCLEANFILES2+= ${_LIB_p.a} ${POBJS} ${POBJS:=.tmp} 706LIBCLEANFILES3+= ${_LIB_g.a} ${GOBJS} ${GOBJS:=.tmp} 707LIBCLEANFILES4+= ${_LIB_pic.a} 708.if ${MKPIC} != "no" && defined(SHLIB_FULLVERSION) 709LIBCLEANFILES4+= ${_LIB.so}.* ${_LIB.so} ${_LIB.so.debug} 710.endif 711LIBCLEANFILES4+= ${SOBJS} ${SOBJS:=.tmp} 712LIBCLEANFILES5+= ${_LIB.ln} ${LOBJS} 713 714.if !target(libinstall) # { 715# Make sure it gets defined, in case MKPIC==no && MKLINKLIB==no 716libinstall:: 717 718.if ${MKLINKLIB} != "no" && ${MKSTATICLIB} != "no" 719libinstall:: ${_DEST.LIB}/${_LIB.a} 720.PRECIOUS: ${_DEST.LIB}/${_LIB.a} 721 722.if ${MKUPDATE} == "no" 723.if !defined(BUILD) && !make(all) && !make(${_LIB.a}) 724${_DEST.LIB}/${_LIB.a}! .MADE 725.endif 726${_DEST.LIB}/${_LIB.a}! ${_LIB.a} __archiveinstall 727.else 728.if !defined(BUILD) && !make(all) && !make(${_LIB.a}) 729${_DEST.LIB}/${_LIB.a}: .MADE 730.endif 731${_DEST.LIB}/${_LIB.a}: ${_LIB.a} __archiveinstall 732.endif 733.endif 734 735.if ${MKPROFILE} != "no" 736libinstall:: ${_DEST.LIB}/${_LIB_p.a} 737.PRECIOUS: ${_DEST.LIB}/${_LIB_p.a} 738 739.if ${MKUPDATE} == "no" 740.if !defined(BUILD) && !make(all) && !make(${_LIB_p.a}) 741${_DEST.LIB}/${_LIB_p.a}! .MADE 742.endif 743${_DEST.LIB}/${_LIB_p.a}! ${_LIB_p.a} __archiveinstall 744.else 745.if !defined(BUILD) && !make(all) && !make(${_LIB_p.a}) 746${_DEST.LIB}/${_LIB_p.a}: .MADE 747.endif 748${_DEST.LIB}/${_LIB_p.a}: ${_LIB_p.a} __archiveinstall 749.endif 750.endif 751 752.if ${MKDEBUGLIB} != "no" 753libinstall:: ${_DEST.LIB}/${_LIB_g.a} 754.PRECIOUS: ${_DEST.LIB}/${_LIB_g.a} 755 756.if ${MKUPDATE} == "no" 757.if !defined(BUILD) && !make(all) && !make(${_LIB_g.a}) 758${_DEST.LIB}/${_LIB_g.a}! .MADE 759.endif 760${_DEST.LIB}/${_LIB_g.a}! ${_LIB_g.a} __archiveinstall 761.else 762.if !defined(BUILD) && !make(all) && !make(${LIB_g.a}) 763${_DEST.LIB}/${_LIB_g.a}: .MADE 764.endif 765${_DEST.LIB}/${_LIB_g.a}: ${_LIB_g.a} __archiveinstall 766.endif 767.endif 768 769.if ${MKPIC} != "no" && ${MKPICINSTALL} != "no" 770libinstall:: ${_DEST.LIB}/${_LIB_pic.a} 771.PRECIOUS: ${_DEST.LIB}/${_LIB_pic.a} 772 773.if ${MKUPDATE} == "no" 774.if !defined(BUILD) && !make(all) && !make(${_LIB_pic.a}) 775${_DEST.LIB}/${_LIB_pic.a}! .MADE 776.endif 777.if ${MKPICLIB} == "no" 778${_DEST.LIB}/${_LIB_pic.a}! ${_LIB.a} __archivesymlinkpic 779.else 780${_DEST.LIB}/${_LIB_pic.a}! ${_LIB_pic.a} __archiveinstall 781.endif 782.else 783.if !defined(BUILD) && !make(all) && !make(${_LIB_pic.a}) 784${_DEST.LIB}/${_LIB_pic.a}: .MADE 785.endif 786.if ${MKPICLIB} == "no" 787${_DEST.LIB}/${_LIB_pic.a}: ${_LIB.a} __archivesymlinkpic 788.else 789${_DEST.LIB}/${_LIB_pic.a}: ${_LIB_pic.a} __archiveinstall 790.endif 791.endif 792.endif 793 794.if ${MKPIC} != "no" && defined(SHLIB_FULLVERSION) 795 796libinstall:: ${_DEST.OBJ}/${_LIB.so.full} 797.PRECIOUS: ${_DEST.OBJ}/${_LIB.so.full} 798 799.if ${MKUPDATE} == "no" 800.if !defined(BUILD) && !make(all) && !make(${_LIB.so.full}) 801${_DEST.OBJ}/${_LIB.so.full}! .MADE 802.endif 803${_DEST.OBJ}/${_LIB.so.full}! ${_LIB.so.full} 804.else 805.if !defined(BUILD) && !make(all) && !make(${_LIB.so.full}) 806${_DEST.OBJ}/${_LIB.so.full}: .MADE 807.endif 808${_DEST.OBJ}/${_LIB.so.full}: ${_LIB.so.full} 809.endif 810 ${_MKTARGET_INSTALL} 811 ${INSTALL_FILE} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ 812 ${.ALLSRC} ${.TARGET} 813.if ${_LIBSODIR} != ${LIBDIR} 814 ${INSTALL_SYMLINK} -l r ${_DEST.OBJ}/${_LIB.so.full} \ 815 ${_DEST.LIB}/${_LIB.so.full} 816.endif 817.if defined(SHLIB_FULLVERSION) && defined(SHLIB_MAJOR) && \ 818 "${SHLIB_FULLVERSION}" != "${SHLIB_MAJOR}" 819 ${INSTALL_SYMLINK} ${_LIB.so.full} ${_DEST.OBJ}/${_LIB.so.major} 820.if ${_LIBSODIR} != ${LIBDIR} 821 ${INSTALL_SYMLINK} -l r ${_DEST.OBJ}/${_LIB.so.full} \ 822 ${_DEST.LIB}/${_LIB.so.major} 823.endif 824.endif 825.if ${MKLINKLIB} != "no" 826 ${INSTALL_SYMLINK} ${_LIB.so.full} ${_DEST.OBJ}/${_LIB.so} 827.if ${_LIBSODIR} != ${LIBDIR} 828 ${INSTALL_SYMLINK} -l r ${_DEST.OBJ}/${_LIB.so.full} \ 829 ${_DEST.LIB}/${_LIB.so} 830.endif 831.endif 832.endif 833 834.if defined(_LIB.so.debug) 835libinstall:: ${_DEST.DEBUG}/${_LIB.so.debug} 836.PRECIOUS: ${_DEST.DEBUG}/${_LIB.so.debug} 837 838${_DEST.DEBUG}/${_LIB.so.debug}: ${_LIB.so.debug} 839 ${_MKTARGET_INSTALL} 840 ${INSTALL_FILE} -o ${DEBUGOWN} -g ${DEBUGGRP} -m ${DEBUGMODE} \ 841 ${.ALLSRC} ${.TARGET} 842.if ${_LIBSODIR} != ${LIBDIR} 843 ${INSTALL_SYMLINK} -l r ${_DEST.DEBUG}/${_LIB.so.debug} \ 844 ${_DEST.ODEBUG}/${_LIB.so.debug} 845.endif 846.endif 847 848.if ${MKLINT} != "no" && !empty(LOBJS) 849libinstall:: ${_DEST.LINT}/${_LIB.ln} 850.PRECIOUS: ${_DEST.LINT}/${_LIB.ln} 851 852.if ${MKUPDATE} == "no" 853.if !defined(BUILD) && !make(all) && !make(${_LIB.ln}) 854${_DEST.LINT}/${_LIB.ln}! .MADE 855.endif 856${_DEST.LINT}/${_LIB.ln}! ${_LIB.ln} 857.else 858.if !defined(BUILD) && !make(all) && !make(${_LIB.ln}) 859${_DEST.LINT}/${_LIB.ln}: .MADE 860.endif 861${_DEST.LINT}/${_LIB.ln}: ${_LIB.ln} 862.endif 863 ${_MKTARGET_INSTALL} 864 ${INSTALL_FILE} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ 865 ${.ALLSRC} ${_DEST.LINT} 866.endif 867.endif # !target(libinstall) # } 868 869##### Pull in related .mk logic 870LINKSOWN?= ${LIBOWN} 871LINKSGRP?= ${LIBGRP} 872LINKSMODE?= ${LIBMODE} 873.include <bsd.man.mk> 874.include <bsd.nls.mk> 875.include <bsd.files.mk> 876.include <bsd.inc.mk> 877.include <bsd.links.mk> 878.include <bsd.dep.mk> 879.include <bsd.clang-analyze.mk> 880.include <bsd.clean.mk> 881 882${TARGETS}: # ensure existence 883