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