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