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