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