Home | History | Annotate | Line # | Download | only in mk
bsd.lib.mk revision 1.258
      1 #	$NetBSD: bsd.lib.mk,v 1.258 2004/12/29 14:41:05 lukem 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 
     10 ##### Basic targets
     11 .PHONY:		checkver libinstall
     12 realinstall:	checkver libinstall
     13 clean:		cleanlib
     14 
     15 ##### LIB specific flags.
     16 COPTS+=    ${COPTS.lib${LIB}}
     17 CPPFLAGS+=  ${CPPFLAGS.lib${LIB}}
     18 CXXFLAGS+=  ${CXXFLAGS.lib${LIB}}
     19 LDADD+=     ${LDADD.lib${LIB}}
     20 LDFLAGS+=   ${LDFLAGS.lib${LIB}}
     21 LDSTATIC+=  ${LDSTATIC.lib${LIB}}
     22 
     23 ##### Libraries that this may depend upon.
     24 .if defined(LIBDPLIBS) && ${MKPIC} != "no"				# {
     25 .for _lib _dir in ${LIBDPLIBS}
     26 .if !defined(LIBDO.${_lib})
     27 LIBDO.${_lib}!=	cd ${_dir} && ${PRINTOBJDIR}
     28 .MAKEOVERRIDES+=LIBDO.${_lib}
     29 .endif
     30 LDADD+=		-L${LIBDO.${_lib}} -l${_lib}
     31 .if exists(${LIBDO.${_lib}}/lib${_lib}.so)
     32 DPADD+=		${LIBDO.${_lib}}/lib${_lib}.so
     33 .else
     34 DPADD+=		${LIBDO.${_lib}}/lib${_lib}.a
     35 .endif
     36 .endfor
     37 .endif									# }
     38 
     39 ##### Build and install rules
     40 MKDEP_SUFFIXES?=	.o .po .so .ln
     41 CPPFLAGS+=	${DESTDIR:D-nostdinc ${CPPFLAG_ISYSTEM} ${DESTDIR}/usr/include}
     42 CXXFLAGS+=	${DESTDIR:D-nostdinc++ ${CPPFLAG_ISYSTEMXX} ${DESTDIR}/usr/include/g++}
     43 
     44 .if !defined(SHLIB_MAJOR) && exists(${SHLIB_VERSION_FILE})		# {
     45 SHLIB_MAJOR != . ${SHLIB_VERSION_FILE} ; echo $$major
     46 SHLIB_MINOR != . ${SHLIB_VERSION_FILE} ; echo $$minor
     47 SHLIB_TEENY != . ${SHLIB_VERSION_FILE} ; echo $$teeny
     48 
     49 # Check for higher installed library versions.
     50 .if !defined(NOCHECKVER) && !defined(NOCHECKVER_${LIB}) && \
     51 	exists(${NETBSDSRCDIR}/lib/checkver)
     52 checkver:
     53 	@(cd ${.CURDIR} && \
     54 	    ${HOST_SH} ${NETBSDSRCDIR}/lib/checkver -v ${SHLIB_VERSION_FILE} \
     55 		    -d ${DESTDIR}${_LIBSODIR} ${LIB})
     56 .endif
     57 .endif									# }
     58 
     59 .if !target(checkver)
     60 checkver:
     61 .endif
     62 
     63 print-shlib-major:
     64 .if defined(SHLIB_MAJOR) && ${MKPIC} != "no"
     65 	@echo ${SHLIB_MAJOR}
     66 .else
     67 	@false
     68 .endif
     69 
     70 print-shlib-minor:
     71 .if defined(SHLIB_MINOR) && ${MKPIC} != "no"
     72 	@echo ${SHLIB_MINOR}
     73 .else
     74 	@false
     75 .endif
     76 
     77 print-shlib-teeny:
     78 .if defined(SHLIB_TEENY) && ${MKPIC} != "no"
     79 	@echo ${SHLIB_TEENY}
     80 .else
     81 	@false
     82 .endif
     83 
     84 .if defined(SHLIB_MAJOR) && !empty(SHLIB_MAJOR)				# {
     85 .if defined(SHLIB_MINOR) && !empty(SHLIB_MINOR)
     86 .if defined(SHLIB_TEENY) && !empty(SHLIB_TEENY)
     87 SHLIB_FULLVERSION=${SHLIB_MAJOR}.${SHLIB_MINOR}.${SHLIB_TEENY}
     88 .else
     89 SHLIB_FULLVERSION=${SHLIB_MAJOR}.${SHLIB_MINOR}
     90 .endif
     91 .else
     92 SHLIB_FULLVERSION=${SHLIB_MAJOR}
     93 .endif
     94 .endif									# }
     95 
     96 # add additional suffixes not exported.
     97 # .po is used for profiling object files.
     98 # .so is used for PIC object files.
     99 .SUFFIXES: .out .a .ln .so .po .o .s .S .c .cc .cpp .cxx .C .m .F .f .r .y .l .cl .p .h
    100 .SUFFIXES: .sh .m4 .m
    101 
    102 
    103 # Set PICFLAGS to cc flags for producing position-independent code,
    104 # if not already set.  Includes -DPIC, if required.
    105 
    106 # Data-driven table using make variables to control how shared libraries
    107 # are built for different platforms and object formats.
    108 # OBJECT_FMT:		currently either "ELF" or "a.out", from <bsd.own.mk>
    109 # SHLIB_SOVERSION:	version number to be compiled into a shared library
    110 #			via -soname. Usualy ${SHLIB_MAJOR} on ELF.
    111 #			NetBSD/pmax used to use ${SHLIB_MAJOR}[.${SHLIB_MINOR}
    112 #			[.${SHLIB_TEENY}]]
    113 # SHLIB_SHFLAGS:	Flags to tell ${LD} to emit shared library.
    114 #			with ELF, also set shared-lib version for ld.so.
    115 # SHLIB_LDSTARTFILE:	support .o file, call C++ file-level constructors
    116 # SHLIB_LDENDFILE:	support .o file, call C++ file-level destructors
    117 # FPICFLAGS:		flags for ${FC} to compile .[fF] files to .so objects.
    118 # CPPICFLAGS:		flags for ${CPP} to preprocess .[sS] files for ${AS}
    119 # CPICFLAGS:		flags for ${CC} to compile .[cC] files to pic objects.
    120 # CSHLIBFLAGS:		flags for ${CC} to compile .[cC] files to .so objects.
    121 #			(usually includes ${CPICFLAGS})
    122 # CAPICFLAGS:		flags for ${CC} to compiling .[Ss] files
    123 #		 	(usually just ${CPPPICFLAGS} ${CPICFLAGS})
    124 # APICFLAGS:		flags for ${AS} to assemble .[sS] to .so objects.
    125 
    126 .if ${MACHINE_ARCH} == "alpha"						# {
    127 
    128 FPICFLAGS ?= -fPIC
    129 CPICFLAGS ?= -fPIC -DPIC
    130 CPPPICFLAGS?= -DPIC
    131 CAPICFLAGS?= ${CPPPICFLAGS} ${CPICFLAGS}
    132 APICFLAGS ?=
    133 
    134 .elif (${MACHINE_ARCH} == "sparc" || ${MACHINE_ARCH} == "sparc64") && \
    135        ${OBJECT_FMT} == "ELF"						# } {
    136 
    137 # If you use -fPIC you need to define BIGPIC to turn on 32-bit
    138 # relocations in asm code
    139 FPICFLAGS ?= -fPIC
    140 CPICFLAGS ?= -fPIC -DPIC
    141 CPPPICFLAGS?= -DPIC -DBIGPIC
    142 CAPICFLAGS?= ${CPPPICFLAGS} ${CPICFLAGS}
    143 APICFLAGS ?= -KPIC
    144 
    145 .elif ${MACHINE_ARCH} == "ns32k"					# } {
    146 
    147 # XXX no shared libraries yet on ns32k
    148 FPICFLAGS?=
    149 CPICFLAGS?=
    150 CPPPICFLAGS?=
    151 CAPICFLAGS?=
    152 APICFLAGS?=
    153 
    154 .else									# } {
    155 
    156 # Platform-independent flags for NetBSD shared libraries
    157 SHLIB_SOVERSION=${SHLIB_FULLVERSION}
    158 SHLIB_SHFLAGS=
    159 FPICFLAGS ?= -fPIC
    160 CPICFLAGS?= -fPIC -DPIC
    161 CPPPICFLAGS?= -DPIC
    162 CAPICFLAGS?= ${CPPPICFLAGS} ${CPICFLAGS}
    163 APICFLAGS?= -k
    164 
    165 .endif									# }
    166 
    167 .if ${MKPICLIB} != "no"
    168 CSHLIBFLAGS+= ${CPICFLAGS}
    169 .endif
    170 
    171 .if defined(CSHLIBFLAGS) && !empty(CSHLIBFLAGS)
    172 MKSHLIBOBJS= yes
    173 .else
    174 MKSHLIBOBJS= no
    175 .endif
    176 
    177 # Platform-independent linker flags for ELF shared libraries
    178 .if ${OBJECT_FMT} == "ELF"
    179 SHLIB_SOVERSION=	${SHLIB_MAJOR}
    180 SHLIB_SHFLAGS=		-Wl,-soname,lib${LIB}.so.${SHLIB_SOVERSION}
    181 SHLIB_LDSTARTFILE?=	${DESTDIR}/usr/lib/crti.o ${_GCC_CRTBEGINS}
    182 SHLIB_LDENDFILE?=	${_GCC_CRTENDS} ${DESTDIR}/usr/lib/crtn.o
    183 .endif
    184 
    185 CFLAGS+=	${COPTS}
    186 AFLAGS+=	${COPTS}
    187 FFLAGS+=	${FOPTS}
    188 
    189 .c.o:
    190 	${_MKTARGET_COMPILE}
    191 	${COMPILE.c} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}.tmp
    192 .if defined(COPTS) && !empty(COPTS:M*-g*)
    193 	mv ${.TARGET}.tmp ${.TARGET}
    194 .else
    195 	${LD} -x -r ${.TARGET}.tmp -o ${.TARGET}
    196 	rm -f ${.TARGET}.tmp
    197 .endif
    198 
    199 .c.po:
    200 	${_MKTARGET_COMPILE}
    201 	${COMPILE.c} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} -pg ${.IMPSRC} -o ${.TARGET}.tmp
    202 .if defined(COPTS) && !empty(COPTS:M*-g*)
    203 	mv ${.TARGET}.tmp ${.TARGET}
    204 .else
    205 	${LD} -X -r ${.TARGET}.tmp -o ${.TARGET}
    206 	rm -f ${.TARGET}.tmp
    207 .endif
    208 
    209 .c.so:
    210 	${_MKTARGET_COMPILE}
    211 	${COMPILE.c} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${CSHLIBFLAGS} ${.IMPSRC} -o ${.TARGET}.tmp
    212 .if defined(COPTS) && !empty(COPTS:M*-g*)
    213 	mv ${.TARGET}.tmp ${.TARGET}
    214 .else
    215 	${LD} -x -r ${.TARGET}.tmp -o ${.TARGET}
    216 	rm -f ${.TARGET}.tmp
    217 .endif
    218 
    219 .cc.o .cpp.o .cxx.o .C.o:
    220 	${_MKTARGET_COMPILE}
    221 	${COMPILE.cc} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}.tmp
    222 .if defined(COPTS) && !empty(COPTS:M*-g*)
    223 	mv ${.TARGET}.tmp ${.TARGET}
    224 .else
    225 	${LD} -x -r ${.TARGET}.tmp -o ${.TARGET}
    226 	rm -f ${.TARGET}.tmp
    227 .endif
    228 
    229 .cc.po .cpp.po .cxx.o .C.po:
    230 	${_MKTARGET_COMPILE}
    231 	${COMPILE.cc} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} -pg ${.IMPSRC} -o ${.TARGET}.tmp
    232 .if defined(COPTS) && !empty(COPTS:M*-g*)
    233 	mv ${.TARGET}.tmp ${.TARGET}
    234 .else
    235 	${LD} -X -r ${.TARGET}.tmp -o ${.TARGET}
    236 	rm -f ${.TARGET}.tmp
    237 .endif
    238 
    239 .cc.so .cpp.so .cxx.so .C.so:
    240 	${_MKTARGET_COMPILE}
    241 	${COMPILE.cc} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${CSHLIBFLAGS} ${.IMPSRC} -o ${.TARGET}.tmp
    242 .if defined(COPTS) && !empty(COPTS:M*-g*)
    243 	mv ${.TARGET}.tmp ${.TARGET}
    244 .else
    245 	${LD} -x -r ${.TARGET}.tmp -o ${.TARGET}
    246 	rm -f ${.TARGET}.tmp
    247 .endif
    248 
    249 .f.o:
    250 	${_MKTARGET_COMPILE}
    251 	${COMPILE.f} ${.IMPSRC} -o ${.TARGET}.tmp
    252 .if defined(FOPTS) && !empty(FOPTS:M*-g*)
    253 	mv ${.TARGET}.tmp ${.TARGET}
    254 .else
    255 	${LD} -x -r ${.TARGET}.tmp -o ${.TARGET}
    256 	rm -f ${.TARGET}.tmp
    257 .endif
    258 
    259 .f.po:
    260 	${_MKTARGET_COMPILE}
    261 	${COMPILE.f} -pg ${.IMPSRC} -o ${.TARGET}.tmp
    262 .if defined(FOPTS) && !empty(FOPTS:M*-g*)
    263 	mv ${.TARGET}.tmp ${.TARGET}
    264 .else
    265 	${LD} -X -r ${.TARGET}.tmp -o ${.TARGET}
    266 	rm -f ${.TARGET}.tmp
    267 .endif
    268 
    269 .f.so:
    270 	${_MKTARGET_COMPILE}
    271 	${COMPILE.f} ${FPICFLAGS} ${.IMPSRC} -o ${.TARGET}.tmp
    272 .if defined(FOPTS) && !empty(FOPTS:M*-g*)
    273 	mv ${.TARGET}.tmp ${.TARGET}
    274 .else
    275 	${LD} -x -r ${.TARGET}.tmp -o ${.TARGET}
    276 	rm -f ${.TARGET}.tmp
    277 .endif
    278 
    279 .f.ln:
    280 	${_MKTARGET_COMPILE}
    281 	@echo Skipping lint for Fortran libraries.
    282 
    283 .m.o:
    284 	${_MKTARGET_COMPILE}
    285 	${COMPILE.m} ${.IMPSRC} -o ${.TARGET}.tmp
    286 .if defined(OBJCFLAGS) && !empty(OBJCFLAGS:M*-g*)
    287 	mv ${.TARGET}.tmp ${.TARGET}
    288 .else
    289 	${LD} -x -r ${.TARGET}.tmp -o ${.TARGET}
    290 	rm -f ${.TARGET}.tmp
    291 .endif
    292 
    293 .m.po:
    294 	${_MKTARGET_COMPILE}
    295 	${COMPILE.m} -pg ${.IMPSRC} -o ${.TARGET}.tmp
    296 .if defined(OBJCFLAGS) && !empty(OBJCFLAGS:M*-g*)
    297 	mv ${.TARGET}.tmp ${.TARGET}
    298 .else
    299 	${LD} -X -r ${.TARGET}.tmp -o ${.TARGET}
    300 	rm -f ${.TARGET}.tmp
    301 .endif
    302 
    303 .m.so:
    304 	${_MKTARGET_COMPILE}
    305 	${COMPILE.m} ${CSHLIBFLAGS} ${.IMPSRC} -o ${.TARGET}.tmp
    306 .if defined(OBJCFLAGS) && !empty(OBJCFLAGS:M*-g*)
    307 	mv ${.TARGET}.tmp ${.TARGET}
    308 .else
    309 	${LD} -x -r ${.TARGET}.tmp -o ${.TARGET}
    310 	rm -f ${.TARGET}.tmp
    311 .endif
    312 
    313 .s.o:
    314 	${_MKTARGET_COMPILE}
    315 	${COMPILE.s} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}.tmp
    316 	${LD} -x -r ${.TARGET}.tmp -o ${.TARGET}
    317 	rm -f ${.TARGET}.tmp
    318 
    319 .S.o:
    320 	${_MKTARGET_COMPILE}
    321 	${COMPILE.S} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}.tmp
    322 	${LD} -x -r ${.TARGET}.tmp -o ${.TARGET}
    323 	rm -f ${.TARGET}.tmp
    324 
    325 .s.po:
    326 	${_MKTARGET_COMPILE}
    327 	${COMPILE.s} -DGPROF -DPROF ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}.tmp
    328 	${LD} -X -r ${.TARGET}.tmp -o ${.TARGET}
    329 	rm -f ${.TARGET}.tmp
    330 
    331 .S.po:
    332 	${_MKTARGET_COMPILE}
    333 	${COMPILE.S} -DGPROF -DPROF ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}.tmp
    334 	${LD} -X -r ${.TARGET}.tmp -o ${.TARGET}
    335 	rm -f ${.TARGET}.tmp
    336 
    337 .s.so:
    338 	${_MKTARGET_COMPILE}
    339 	${COMPILE.s} ${CAPICFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}.tmp
    340 	${LD} -x -r ${.TARGET}.tmp -o ${.TARGET}
    341 	rm -f ${.TARGET}.tmp
    342 
    343 .S.so:
    344 	${_MKTARGET_COMPILE}
    345 	${COMPILE.S} ${CAPICFLAGS} ${COPTS.${.IMPSRC:T}} ${CPUFLAGS.${.IMPSRC:T}} ${CPPFLAGS.${.IMPSRC:T}} ${.IMPSRC} -o ${.TARGET}.tmp
    346 	${LD} -x -r ${.TARGET}.tmp -o ${.TARGET}
    347 	rm -f ${.TARGET}.tmp
    348 
    349 .if defined(LIB)							# {
    350 .if (${MKPIC} == "no" || (defined(LDSTATIC) && ${LDSTATIC} != "") \
    351 	|| ${MKLINKLIB} != "no") && ${MKSTATICLIB} != "no"
    352 _LIBS=lib${LIB}.a
    353 .else
    354 _LIBS=
    355 .endif
    356 
    357 OBJS+=${SRCS:N*.h:N*.sh:R:S/$/.o/g}
    358 
    359 STOBJS+=${OBJS}
    360 
    361 .if ${MKPRIVATELIB} != "no"
    362 # No installation is required
    363 libinstall::
    364 .else	# ${MKPRIVATELIB} == "no"					# {
    365 
    366 .if ${MKPROFILE} != "no"
    367 _LIBS+=lib${LIB}_p.a
    368 POBJS+=${OBJS:.o=.po}
    369 .endif
    370 
    371 .if ${MKPIC} != "no"							# {
    372 .if ${MKPICLIB} == "no"
    373 .if ${MKSHLIBOBJS} != "no"
    374 # make _pic.a, which isn't really pic,
    375 # since it's needed for making shared lib.
    376 # but don't install it.
    377 SOLIB=lib${LIB}_pic.a
    378 SOBJS+=${OBJS:.o=.so}
    379 .else
    380 SOLIB=lib${LIB}.a
    381 .endif
    382 .else
    383 SOLIB=lib${LIB}_pic.a
    384 _LIBS+=${SOLIB}
    385 SOBJS+=${OBJS:.o=.so}
    386 .endif
    387 .if defined(SHLIB_FULLVERSION)
    388 _LIBS+=lib${LIB}.so.${SHLIB_FULLVERSION}
    389 .endif
    390 .endif									# }
    391 
    392 LOBJS+=${LSRCS:.c=.ln} ${SRCS:M*.c:.c=.ln}
    393 .if ${MKLINT} != "no" && ${MKLINKLIB} != "no" && !empty(LOBJS)
    394 _LIBS+=llib-l${LIB}.ln
    395 .endif
    396 
    397 .endif	# ${MKPRIVATELIB} == "no"					# }
    398 
    399 ALLOBJS=
    400 .if (${MKPIC} == "no" || (defined(LDSTATIC) && ${LDSTATIC} != "") \
    401 	|| ${MKLINKLIB} != "no") && ${MKSTATICLIB} != "no"
    402 ALLOBJS+=${STOBJS}
    403 .endif
    404 ALLOBJS+=${POBJS} ${SOBJS}
    405 .if ${MKLINT} != "no" && ${MKLINKLIB} != "no" && !empty(LOBJS)
    406 ALLOBJS+=${LOBJS}
    407 .endif
    408 .else	# !defined(LIB)							# } {
    409 LOBJS=
    410 SOBJS=
    411 .endif	# !defined(LIB)							# }
    412 
    413 _YLSRCS=	${SRCS:M*.[ly]:C/\..$/.c/} ${YHEADER:D${SRCS:M*.y:.y=.h}}
    414 
    415 .NOPATH: ${ALLOBJS} ${_LIBS} ${_YLSRCS}
    416 
    417 realall: ${SRCS} ${ALLOBJS:O} ${_LIBS}
    418 
    419 .if !target(__archivebuild)
    420 __archivebuild: .USE
    421 	${_MKTARGET_BUILD}
    422 	rm -f ${.TARGET}
    423 	${AR} cq ${.TARGET} `NM=${NM} ${LORDER} ${.ALLSRC:M*o} | ${TSORT}`
    424 	${RANLIB} ${.TARGET}
    425 .endif
    426 
    427 .if !target(__archiveinstall)
    428 __archiveinstall: .USE
    429 	${_MKTARGET_INSTALL}
    430 	${INSTALL_FILE} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
    431 	    ${UPDATE:D:U-a "${RANLIB} -t"} ${SYSPKGTAG} ${.ALLSRC} ${.TARGET}
    432 .endif
    433 
    434 __archivesymlinkpic: .USE
    435 	${_MKTARGET_INSTALL}
    436 	${INSTALL_SYMLINK} ${SYSPKGTAG} ${.ALLSRC} ${.TARGET}
    437 
    438 DPSRCS+=	${_YLSRCS}
    439 CLEANFILES+=	${_YLSRCS}
    440 
    441 ${STOBJS} ${POBJS} ${SOBJS} ${LOBJS}: ${DPSRCS}
    442 
    443 lib${LIB}.a:: ${STOBJS} __archivebuild
    444 
    445 lib${LIB}_p.a:: ${POBJS} __archivebuild
    446 
    447 lib${LIB}_pic.a:: ${SOBJS} __archivebuild
    448 
    449 
    450 _LIBLDOPTS=
    451 .if ${SHLIBDIR} != "/usr/lib"
    452 _LIBLDOPTS+=	-Wl,-rpath-link,${DESTDIR}${SHLIBDIR}:${DESTDIR}/usr/lib \
    453 		-R${SHLIBDIR} \
    454 		-L${DESTDIR}${SHLIBDIR}
    455 .elif ${SHLIBINSTALLDIR} != "/usr/lib"
    456 _LIBLDOPTS+=	-Wl,-rpath-link,${DESTDIR}${SHLIBINSTALLDIR}:${DESTDIR}/usr/lib \
    457 		-L${DESTDIR}${SHLIBINSTALLDIR}
    458 .endif
    459 
    460 lib${LIB}.so.${SHLIB_FULLVERSION}: ${SOLIB} ${DPADD} \
    461     ${SHLIB_LDSTARTFILE} ${SHLIB_LDENDFILE}
    462 	${_MKTARGET_BUILD}
    463 	rm -f lib${LIB}.so.${SHLIB_FULLVERSION}
    464 .if defined(DESTDIR)
    465 	${CC} -Wl,-nostdlib -B${_GCC_CRTDIR}/ -B${DESTDIR}/usr/lib/ \
    466 	    ${_LIBLDOPTS} \
    467 	    -Wl,-x -shared ${SHLIB_SHFLAGS} ${LDFLAGS} -o ${.TARGET} \
    468 	    -Wl,--whole-archive ${SOLIB} \
    469 	    -Wl,--no-whole-archive ${LDADD} \
    470 	    -L${_GCC_LIBGCCDIR}
    471 .else
    472 	${CC} -Wl,-x -shared ${SHLIB_SHFLAGS} ${LDFLAGS} -o ${.TARGET} \
    473 	    ${_LIBLDOPTS} \
    474 	    -Wl,--whole-archive ${SOLIB} -Wl,--no-whole-archive ${LDADD}
    475 .endif
    476 .if ${OBJECT_FMT} == "ELF"
    477 #  We don't use INSTALL_SYMLINK here because this is just
    478 #  happening inside the build directory/objdir. XXX Why does
    479 #  this spend so much effort on libraries that aren't live??? XXX
    480 	${HOST_LN} -sf lib${LIB}.so.${SHLIB_FULLVERSION} lib${LIB}.so.${SHLIB_MAJOR}.tmp
    481 	mv -f lib${LIB}.so.${SHLIB_MAJOR}.tmp lib${LIB}.so.${SHLIB_MAJOR}
    482 	${HOST_LN} -sf lib${LIB}.so.${SHLIB_FULLVERSION} lib${LIB}.so.tmp
    483 	mv -f lib${LIB}.so.tmp lib${LIB}.so
    484 .endif
    485 
    486 .if !empty(LOBJS)							# {
    487 LLIBS?=		-lc
    488 llib-l${LIB}.ln: ${LOBJS}
    489 	${_MKTARGET_COMPILE}
    490 	rm -f llib-l${LIB}.ln
    491 .if defined(DESTDIR)
    492 	${LINT} -C${LIB} ${.ALLSRC} -L${DESTDIR}/usr/libdata ${LLIBS}
    493 .else
    494 	${LINT} -C${LIB} ${.ALLSRC} ${LLIBS}
    495 .endif
    496 .endif									# }
    497 
    498 cleanlib: .PHONY
    499 	rm -f a.out [Ee]rrs mklog core *.core ${CLEANFILES}
    500 	rm -f lib${LIB}.a ${STOBJS}
    501 	rm -f lib${LIB}_p.a ${POBJS}
    502 	rm -f lib${LIB}_pic.a lib${LIB}.so.* lib${LIB}.so ${SOBJS}
    503 	rm -f ${STOBJS:=.tmp} ${POBJS:=.tmp} ${SOBJS:=.tmp}
    504 	rm -f llib-l${LIB}.ln ${LOBJS}
    505 
    506 
    507 .if !target(libinstall)							# {
    508 # Make sure it gets defined, in case MKPIC==no && MKLINKLIB==no
    509 libinstall::
    510 
    511 .if ${MKLINKLIB} != "no" && ${MKSTATICLIB} != "no"
    512 libinstall:: ${DESTDIR}${LIBDIR}/lib${LIB}.a
    513 .PRECIOUS: ${DESTDIR}${LIBDIR}/lib${LIB}.a
    514 
    515 .if !defined(UPDATE)
    516 .if !defined(BUILD) && !make(all) && !make(lib${LIB}.a)
    517 ${DESTDIR}${LIBDIR}/lib${LIB}.a! .MADE
    518 .endif
    519 ${DESTDIR}${LIBDIR}/lib${LIB}.a! lib${LIB}.a __archiveinstall
    520 .else
    521 .if !defined(BUILD) && !make(all) && !make(lib${LIB}.a)
    522 ${DESTDIR}${LIBDIR}/lib${LIB}.a: .MADE
    523 .endif
    524 ${DESTDIR}${LIBDIR}/lib${LIB}.a: lib${LIB}.a __archiveinstall
    525 .endif
    526 .endif
    527 
    528 .if ${MKPROFILE} != "no"
    529 libinstall:: ${DESTDIR}${LIBDIR}/lib${LIB}_p.a
    530 .PRECIOUS: ${DESTDIR}${LIBDIR}/lib${LIB}_p.a
    531 
    532 .if !defined(UPDATE)
    533 .if !defined(BUILD) && !make(all) && !make(lib${LIB}_p.a)
    534 ${DESTDIR}${LIBDIR}/lib${LIB}_p.a! .MADE
    535 .endif
    536 ${DESTDIR}${LIBDIR}/lib${LIB}_p.a! lib${LIB}_p.a __archiveinstall
    537 .else
    538 .if !defined(BUILD) && !make(all) && !make(lib${LIB}_p.a)
    539 ${DESTDIR}${LIBDIR}/lib${LIB}_p.a: .MADE
    540 .endif
    541 ${DESTDIR}${LIBDIR}/lib${LIB}_p.a: lib${LIB}_p.a __archiveinstall
    542 .endif
    543 .endif
    544 
    545 .if ${MKPIC} != "no" && ${MKPICINSTALL} != "no"
    546 libinstall:: ${DESTDIR}${LIBDIR}/lib${LIB}_pic.a
    547 .PRECIOUS: ${DESTDIR}${LIBDIR}/lib${LIB}_pic.a
    548 
    549 .if !defined(UPDATE)
    550 .if !defined(BUILD) && !make(all) && !make(lib${LIB}_pic.a)
    551 ${DESTDIR}${LIBDIR}/lib${LIB}_pic.a! .MADE
    552 .endif
    553 .if ${MKPICLIB} == "no"
    554 ${DESTDIR}${LIBDIR}/lib${LIB}_pic.a! lib${LIB}.a __archivesymlinkpic
    555 .else
    556 ${DESTDIR}${LIBDIR}/lib${LIB}_pic.a! lib${LIB}_pic.a __archiveinstall
    557 .endif
    558 .else
    559 .if !defined(BUILD) && !make(all) && !make(lib${LIB}_pic.a)
    560 ${DESTDIR}${LIBDIR}/lib${LIB}_pic.a: .MADE
    561 .endif
    562 .if ${MKPICLIB} == "no"
    563 ${DESTDIR}${LIBDIR}/lib${LIB}_pic.a: lib${LIB}.a __archivesymlinkpic
    564 .else
    565 ${DESTDIR}${LIBDIR}/lib${LIB}_pic.a: lib${LIB}_pic.a __archiveinstall
    566 .endif
    567 .endif
    568 .endif
    569 
    570 .if ${MKPIC} != "no" && defined(SHLIB_FULLVERSION)
    571 libinstall:: ${DESTDIR}${_LIBSODIR}/lib${LIB}.so.${SHLIB_FULLVERSION}
    572 .PRECIOUS: ${DESTDIR}${_LIBSODIR}/lib${LIB}.so.${SHLIB_FULLVERSION}
    573 
    574 .if !defined(UPDATE)
    575 .if !defined(BUILD) && !make(all) && !make(lib${LIB}.so.${SHLIB_FULLVERSION})
    576 ${DESTDIR}${_LIBSODIR}/lib${LIB}.so.${SHLIB_FULLVERSION}! .MADE
    577 .endif
    578 ${DESTDIR}${_LIBSODIR}/lib${LIB}.so.${SHLIB_FULLVERSION}! lib${LIB}.so.${SHLIB_FULLVERSION}
    579 .else
    580 .if !defined(BUILD) && !make(all) && !make(lib${LIB}.so.${SHLIB_FULLVERSION})
    581 ${DESTDIR}${_LIBSODIR}/lib${LIB}.so.${SHLIB_FULLVERSION}: .MADE
    582 .endif
    583 ${DESTDIR}${_LIBSODIR}/lib${LIB}.so.${SHLIB_FULLVERSION}: lib${LIB}.so.${SHLIB_FULLVERSION}
    584 .endif
    585 	${_MKTARGET_INSTALL}
    586 	${INSTALL_FILE} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
    587 		${SYSPKGTAG} ${.ALLSRC} ${.TARGET}
    588 .if ${_LIBSODIR} != ${LIBDIR}
    589 	${INSTALL_SYMLINK} ${SYSPKGTAG} \
    590 		${_LIBSODIR}/lib${LIB}.so.${SHLIB_FULLVERSION} \
    591 		${DESTDIR}${LIBDIR}/lib${LIB}.so.${SHLIB_FULLVERSION}
    592 .endif
    593 .if ${OBJECT_FMT} == "a.out" && !defined(DESTDIR)
    594 	/sbin/ldconfig -m ${_LIBSODIR} ${LIBDIR}
    595 .endif
    596 .if ${OBJECT_FMT} == "ELF"
    597 	${INSTALL_SYMLINK} ${SYSPKGTAG} \
    598 		lib${LIB}.so.${SHLIB_FULLVERSION} \
    599 		${DESTDIR}${_LIBSODIR}/lib${LIB}.so.${SHLIB_MAJOR}
    600 .if ${_LIBSODIR} != ${LIBDIR}
    601 	${INSTALL_SYMLINK} ${SYSPKGTAG} \
    602 		${_LIBSODIR}/lib${LIB}.so.${SHLIB_FULLVERSION} \
    603 		${DESTDIR}${LIBDIR}/lib${LIB}.so.${SHLIB_MAJOR}
    604 .endif
    605 .if ${MKLINKLIB} != "no"
    606 	${INSTALL_SYMLINK} ${SYSPKGTAG} \
    607 		lib${LIB}.so.${SHLIB_FULLVERSION} \
    608 		${DESTDIR}${_LIBSODIR}/lib${LIB}.so
    609 .if ${_LIBSODIR} != ${LIBDIR}
    610 	${INSTALL_SYMLINK} ${SYSPKGTAG} \
    611 		${_LIBSODIR}/lib${LIB}.so.${SHLIB_FULLVERSION} \
    612 		${DESTDIR}${LIBDIR}/lib${LIB}.so
    613 .endif
    614 .endif
    615 .endif
    616 .endif
    617 
    618 .if ${MKLINT} != "no" && ${MKLINKLIB} != "no" && !empty(LOBJS)
    619 libinstall:: ${DESTDIR}${LINTLIBDIR}/llib-l${LIB}.ln
    620 .PRECIOUS: ${DESTDIR}${LINTLIBDIR}/llib-l${LIB}.ln
    621 
    622 .if !defined(UPDATE)
    623 .if !defined(BUILD) && !make(all) && !make(llib-l${LIB}.ln)
    624 ${DESTDIR}${LINTLIBDIR}/llib-l${LIB}.ln! .MADE
    625 .endif
    626 ${DESTDIR}${LINTLIBDIR}/llib-l${LIB}.ln! llib-l${LIB}.ln
    627 .else
    628 .if !defined(BUILD) && !make(all) && !make(llib-l${LIB}.ln)
    629 ${DESTDIR}${LINTLIBDIR}/llib-l${LIB}.ln: .MADE
    630 .endif
    631 ${DESTDIR}${LINTLIBDIR}/llib-l${LIB}.ln: llib-l${LIB}.ln
    632 .endif
    633 	${_MKTARGET_INSTALL}
    634 	${INSTALL_FILE} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
    635 		${SYSPKGTAG} ${.ALLSRC} ${DESTDIR}${LINTLIBDIR}
    636 .endif
    637 .endif	# !target(libinstall)						# }
    638 
    639 ##### Pull in related .mk logic
    640 .include <bsd.man.mk>
    641 .include <bsd.nls.mk>
    642 .include <bsd.files.mk>
    643 .include <bsd.inc.mk>
    644 .include <bsd.links.mk>
    645 .include <bsd.dep.mk>
    646 
    647 ${TARGETS}:	# ensure existence
    648