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