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