1# from: @(#)bsd.lib.mk 5.26 (Berkeley) 5/2/91 2# $FreeBSD$ 3# 4 5.include <bsd.init.mk> 6 7.if defined(LIB_CXX) 8LIB= ${LIB_CXX} 9_LD= ${CXX} 10.else 11_LD= ${CC} 12.endif 13 14# Set up the variables controlling shared libraries. After this section, 15# SHLIB_NAME will be defined only if we are to create a shared library. 16# SHLIB_LINK will be defined only if we are to create a link to it. 17# INSTALL_PIC_ARCHIVE will be defined only if we are to create a PIC archive. 18.if defined(NO_PIC) 19.undef SHLIB_NAME 20.undef INSTALL_PIC_ARCHIVE 21.else 22.if !defined(SHLIB) && defined(LIB) 23SHLIB= ${LIB} 24.endif 25.if !defined(SHLIB_NAME) && defined(SHLIB) && defined(SHLIB_MAJOR) 26SHLIB_NAME= lib${SHLIB}.so.${SHLIB_MAJOR} 27.endif 28.if defined(SHLIB_NAME) && !empty(SHLIB_NAME:M*.so.*) 29SHLIB_LINK?= ${SHLIB_NAME:R} 30.endif 31SONAME?= ${SHLIB_NAME} 32.endif 33 34.if defined(CRUNCH_CFLAGS) 35CFLAGS+= ${CRUNCH_CFLAGS} 36.endif 37 38.if ${MK_ASSERT_DEBUG} == "no" 39CFLAGS+= -DNDEBUG 40NO_WERROR= 41.endif 42 43.if defined(DEBUG_FLAGS) 44CFLAGS+= ${DEBUG_FLAGS} 45 46.if ${MK_CTF} != "no" && ${DEBUG_FLAGS:M-g} != "" 47CTFFLAGS+= -g 48.endif 49.else 50STRIP?= -s 51.endif 52 53.if ${MK_DEBUG_FILES} != "no" && empty(DEBUG_FLAGS:M-g) && \ 54 empty(DEBUG_FLAGS:M-gdwarf*) 55SHARED_CFLAGS+= -g 56SHARED_CXXFLAGS+= -g 57CTFFLAGS+= -g 58.endif 59 60.include <bsd.libnames.mk> 61 62# prefer .s to a .c, add .po, remove stuff not used in the BSD libraries 63# .So used for PIC object files 64.SUFFIXES: 65.SUFFIXES: .out .o .po .So .S .asm .s .c .cc .cpp .cxx .C .f .y .l .ln 66 67.if !defined(PICFLAG) 68.if ${MACHINE_CPUARCH} == "sparc64" 69PICFLAG=-fPIC 70.else 71PICFLAG=-fpic 72.endif 73.endif 74 75PO_FLAG=-pg 76 77.c.o: 78 ${CC} ${STATIC_CFLAGS} ${CFLAGS} -c ${.IMPSRC} -o ${.TARGET} 79 ${CTFCONVERT_CMD} 80 81.c.po: 82 ${CC} ${PO_FLAG} ${STATIC_CFLAGS} ${PO_CFLAGS} -c ${.IMPSRC} -o ${.TARGET} 83 ${CTFCONVERT_CMD} 84 85.c.So: 86 ${CC} ${PICFLAG} -DPIC ${SHARED_CFLAGS} ${CFLAGS} -c ${.IMPSRC} -o ${.TARGET} 87 ${CTFCONVERT_CMD} 88 89.cc.o .C.o .cpp.o .cxx.o: 90 ${CXX} ${STATIC_CXXFLAGS} ${CXXFLAGS} -c ${.IMPSRC} -o ${.TARGET} 91 92.cc.po .C.po .cpp.po .cxx.po: 93 ${CXX} ${PO_FLAG} ${STATIC_CXXFLAGS} ${PO_CXXFLAGS} -c ${.IMPSRC} -o ${.TARGET} 94 95.cc.So .C.So .cpp.So .cxx.So: 96 ${CXX} ${PICFLAG} -DPIC ${SHARED_CXXFLAGS} ${CXXFLAGS} -c ${.IMPSRC} -o ${.TARGET} 97 98.f.po: 99 ${FC} -pg ${FFLAGS} -o ${.TARGET} -c ${.IMPSRC} 100 ${CTFCONVERT_CMD} 101 102.f.So: 103 ${FC} ${PICFLAG} -DPIC ${FFLAGS} -o ${.TARGET} -c ${.IMPSRC} 104 ${CTFCONVERT_CMD} 105 106.s.po .s.So: 107 ${AS} ${AFLAGS} -o ${.TARGET} ${.IMPSRC} 108 ${CTFCONVERT_CMD} 109 110.asm.po: 111 ${CC} -x assembler-with-cpp -DPROF ${PO_CFLAGS} ${ACFLAGS} \ 112 -c ${.IMPSRC} -o ${.TARGET} 113 ${CTFCONVERT_CMD} 114 115.asm.So: 116 ${CC} -x assembler-with-cpp ${PICFLAG} -DPIC ${CFLAGS} ${ACFLAGS} \ 117 -c ${.IMPSRC} -o ${.TARGET} 118 ${CTFCONVERT_CMD} 119 120.S.po: 121 ${CC} -DPROF ${PO_CFLAGS} ${ACFLAGS} -c ${.IMPSRC} -o ${.TARGET} 122 ${CTFCONVERT_CMD} 123 124.S.So: 125 ${CC} ${PICFLAG} -DPIC ${CFLAGS} ${ACFLAGS} -c ${.IMPSRC} -o ${.TARGET} 126 ${CTFCONVERT_CMD} 127 128all: beforebuild .WAIT 129beforebuild: objwarn 130 131.if defined(PRIVATELIB) 132_LIBDIR:=${LIBPRIVATEDIR} 133_SHLIBDIR:=${LIBPRIVATEDIR} 134.else 135_LIBDIR:=${LIBDIR} 136_SHLIBDIR:=${SHLIBDIR} 137.endif 138 139.if defined(SHLIB_NAME) 140.if ${MK_DEBUG_FILES} != "no" 141SHLIB_NAME_FULL=${SHLIB_NAME}.full 142# Use ${DEBUGDIR} for base system debug files, else .debug subdirectory 143.if ${_SHLIBDIR} == "/boot" ||\ 144 ${SHLIBDIR:C%/lib(/.*)?$%/lib%} == "/lib" ||\ 145 ${SHLIBDIR:C%/usr/lib(32)?(/.*)?%/usr/lib%} == "/usr/lib" 146DEBUGFILEDIR=${DEBUGDIR}${_SHLIBDIR} 147.else 148DEBUGFILEDIR=${_SHLIBDIR}/.debug 149DEBUGMKDIR= 150.endif 151.else 152SHLIB_NAME_FULL=${SHLIB_NAME} 153.endif 154.endif 155 156.include <bsd.symver.mk> 157 158# Allow libraries to specify their own version map or have it 159# automatically generated (see bsd.symver.mk above). 160.if ${MK_SYMVER} == "yes" && !empty(VERSION_MAP) 161${SHLIB_NAME_FULL}: ${VERSION_MAP} 162LDFLAGS+= -Wl,--version-script=${VERSION_MAP} 163.endif 164 165.if defined(USEPRIVATELIB) 166LDFLAGS+= -rpath ${LIBPRIVATEDIR} 167.endif 168 169.if defined(LIB) && !empty(LIB) || defined(SHLIB_NAME) 170OBJS+= ${SRCS:N*.h:R:S/$/.o/} 171NOPATH_FILES+= ${OBJS} 172.endif 173 174.if defined(LIB) && !empty(LIB) 175_LIBS= lib${LIB}.a 176 177lib${LIB}.a: ${OBJS} ${STATICOBJS} 178 @${ECHO} building static ${LIB} library 179 @rm -f ${.TARGET} 180 @${AR} ${ARFLAGS} ${.TARGET} `NM='${NM}' lorder ${OBJS} ${STATICOBJS} | tsort -q` ${ARADD} 181 ${RANLIB} ${RANLIBFLAGS} ${.TARGET} 182.endif 183 184.if !defined(INTERNALLIB) 185 186.if ${MK_PROFILE} != "no" && defined(LIB) && !empty(LIB) 187_LIBS+= lib${LIB}_p.a 188POBJS+= ${OBJS:.o=.po} ${STATICOBJS:.o=.po} 189NOPATH_FILES+= ${POBJS} 190 191lib${LIB}_p.a: ${POBJS} 192 @${ECHO} building profiled ${LIB} library 193 @rm -f ${.TARGET} 194 @${AR} ${ARFLAGS} ${.TARGET} `NM='${NM}' lorder ${POBJS} | tsort -q` ${ARADD} 195 ${RANLIB} ${RANLIBFLAGS} ${.TARGET} 196.endif 197 198.if defined(SHLIB_NAME) || \ 199 defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB) 200SOBJS+= ${OBJS:.o=.So} 201NOPATH_FILES+= ${SOBJS} 202.endif 203 204.if defined(SHLIB_NAME) 205_LIBS+= ${SHLIB_NAME} 206 207SOLINKOPTS= -shared -Wl,-x 208.if !defined(ALLOW_SHARED_TEXTREL) 209.if defined(LD_FATAL_WARNINGS) && ${LD_FATAL_WARNINGS} == "no" 210SOLINKOPTS+= -Wl,--no-fatal-warnings 211.else 212SOLINKOPTS+= -Wl,--fatal-warnings 213.endif 214SOLINKOPTS+= -Wl,--warn-shared-textrel 215.endif 216 217.if target(beforelinking) 218beforelinking: ${SOBJS} 219${SHLIB_NAME_FULL}: beforelinking 220.endif 221${SHLIB_NAME_FULL}: ${SOBJS} 222 @${ECHO} building shared library ${SHLIB_NAME} 223 @rm -f ${SHLIB_NAME} ${SHLIB_LINK} 224.if defined(SHLIB_LINK) 225 @${INSTALL_SYMLINK} ${SHLIB_NAME} ${SHLIB_LINK} 226.endif 227 ${_LD} ${LDFLAGS} ${SSP_CFLAGS} ${SOLINKOPTS} \ 228 -o ${.TARGET} -Wl,-soname,${SONAME} \ 229 `NM='${NM}' lorder ${SOBJS} | tsort -q` ${LDADD} 230.if ${MK_CTF} != "no" 231 ${CTFMERGE} ${CTFFLAGS} -o ${.TARGET} ${SOBJS} 232.endif 233 234.if ${MK_DEBUG_FILES} != "no" 235CLEANFILES+= ${SHLIB_NAME_FULL} ${SHLIB_NAME}.debug 236${SHLIB_NAME}: ${SHLIB_NAME_FULL} ${SHLIB_NAME}.debug 237 ${OBJCOPY} --strip-debug --add-gnu-debuglink=${SHLIB_NAME}.debug \ 238 ${SHLIB_NAME_FULL} ${.TARGET} 239 240${SHLIB_NAME}.debug: ${SHLIB_NAME_FULL} 241 ${OBJCOPY} --only-keep-debug ${SHLIB_NAME_FULL} ${.TARGET} 242.endif 243.endif #defined(SHLIB_NAME) 244 245.if defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB) && ${MK_TOOLCHAIN} != "no" 246_LIBS+= lib${LIB}_pic.a 247 248lib${LIB}_pic.a: ${SOBJS} 249 @${ECHO} building special pic ${LIB} library 250 @rm -f ${.TARGET} 251 @${AR} ${ARFLAGS} ${.TARGET} ${SOBJS} ${ARADD} 252 ${RANLIB} ${RANLIBFLAGS} ${.TARGET} 253.endif 254 255.if defined(WANT_LINT) && !defined(NO_LINT) && defined(LIB) && !empty(LIB) 256LINTLIB= llib-l${LIB}.ln 257_LIBS+= ${LINTLIB} 258LINTOBJS+= ${SRCS:M*.c:.c=.ln} 259NOPATH_FILES+= ${LINTOBJS} 260 261${LINTLIB}: ${LINTOBJS} 262 @${ECHO} building lint library ${.TARGET} 263 @rm -f ${.TARGET} 264 ${LINT} ${LINTLIBFLAGS} ${CFLAGS:M-[DIU]*} ${.ALLSRC} 265.endif 266 267.endif # !defined(INTERNALLIB) 268 269all: ${_LIBS} 270 271.if ${MK_MAN} != "no" 272all: _manpages 273.endif 274 275_EXTRADEPEND: 276 @TMP=_depend$$$$; \ 277 sed -e 's/^\([^\.]*\).o[ ]*:/\1.o \1.po \1.So:/' < ${DEPENDFILE} \ 278 > $$TMP; \ 279 mv $$TMP ${DEPENDFILE} 280.if !defined(NO_EXTRADEPEND) && defined(SHLIB_NAME) 281.if defined(DPADD) && !empty(DPADD) 282 echo ${SHLIB_NAME_FULL}: ${DPADD} >> ${DEPENDFILE} 283.endif 284.endif 285 286.if !target(install) 287 288.if defined(PRECIOUSLIB) 289.if !defined(NO_FSCHG) 290SHLINSTALLFLAGS+= -fschg 291.endif 292SHLINSTALLFLAGS+= -S 293.endif 294 295_INSTALLFLAGS:= ${INSTALLFLAGS} 296.for ie in ${INSTALLFLAGS_EDIT} 297_INSTALLFLAGS:= ${_INSTALLFLAGS${ie}} 298.endfor 299_SHLINSTALLFLAGS:= ${SHLINSTALLFLAGS} 300.for ie in ${INSTALLFLAGS_EDIT} 301_SHLINSTALLFLAGS:= ${_SHLINSTALLFLAGS${ie}} 302.endfor 303 304.if !defined(INTERNALLIB) 305realinstall: _libinstall 306.ORDER: beforeinstall _libinstall 307_libinstall: 308.if defined(LIB) && !empty(LIB) && ${MK_INSTALLLIB} != "no" && !defined(PRIVATELIB) 309 ${INSTALL} -C -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ 310 ${_INSTALLFLAGS} lib${LIB}.a ${DESTDIR}${_LIBDIR} 311.endif 312.if ${MK_PROFILE} != "no" && defined(LIB) && !empty(LIB) && !defined(PRIVATELIB) 313 ${INSTALL} -C -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ 314 ${_INSTALLFLAGS} lib${LIB}_p.a ${DESTDIR}${_LIBDIR} 315.endif 316.if defined(SHLIB_NAME) 317 ${INSTALL} ${STRIP} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ 318 ${_INSTALLFLAGS} ${_SHLINSTALLFLAGS} \ 319 ${SHLIB_NAME} ${DESTDIR}${_SHLIBDIR} 320.if ${MK_DEBUG_FILES} != "no" 321.if defined(DEBUGMKDIR) 322 ${INSTALL} -T debug -d ${DESTDIR}${DEBUGFILEDIR} 323.endif 324 ${INSTALL} -T debug -o ${LIBOWN} -g ${LIBGRP} -m ${DEBUGMODE} \ 325 ${_INSTALLFLAGS} \ 326 ${SHLIB_NAME}.debug ${DESTDIR}${DEBUGFILEDIR} 327.endif 328.if defined(SHLIB_LINK) && !defined(PRIVATELIB) 329# ${_SHLIBDIRPREFIX} and ${_LDSCRIPTROOT} are both needed when cross-building 330# and when building 32 bits library shims. ${_SHLIBDIRPREFIX} is the directory 331# prefix where shared objects will be installed by the install target. 332# 333# ${_LDSCRIPTROOT} is the directory prefix that will be used when generating 334# ld(1) scripts. The crosstools' ld is configured to lookup libraries in an 335# alternative directory which is called "sysroot", so during buildworld binaries 336# won't be linked against the running system libraries but against the ones of 337# the current source tree. ${_LDSCRIPTROOT} behavior is twisted because of 338# the location where we store them: 339# - 64 bits libs are located under sysroot, so ${_LDSCRIPTROOT} must be empty 340# because ld(1) will manage to find them from sysroot; 341# - 32 bits shims are not, so ${_LDSCRIPTROOT} is used to specify their full 342# path, outside of sysroot. 343# Note that ld(1) scripts are generated both during buildworld and 344# installworld; in the later case ${_LDSCRIPTROOT} must be obviously empty 345# because on the target system, libraries are meant to be looked up from /. 346.if defined(SHLIB_LDSCRIPT) && !empty(SHLIB_LDSCRIPT) && exists(${.CURDIR}/${SHLIB_LDSCRIPT}) 347 sed -e 's,@@SHLIB@@,${_LDSCRIPTROOT}${_SHLIBDIR}/${SHLIB_NAME},g' \ 348 -e 's,@@LIBDIR@@,${_LDSCRIPTROOT}${_LIBDIR},g' \ 349 ${.CURDIR}/${SHLIB_LDSCRIPT} > ${DESTDIR}${_LIBDIR}/${SHLIB_LINK:R}.ld 350 ${INSTALL} -S -C -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ 351 ${_INSTALLFLAGS} ${DESTDIR}${_LIBDIR}/${SHLIB_LINK:R}.ld \ 352 ${DESTDIR}${_LIBDIR}/${SHLIB_LINK} 353 rm -f ${DESTDIR}${_LIBDIR}/${SHLIB_LINK:R}.ld 354 355.else 356.if ${_SHLIBDIR} == ${_LIBDIR} 357 ${INSTALL_SYMLINK} ${SHLIB_NAME} ${DESTDIR}${_LIBDIR}/${SHLIB_LINK} 358.else 359 ${INSTALL_SYMLINK} ${_SHLIBDIRPREFIX}${_SHLIBDIR}/${SHLIB_NAME} \ 360 ${DESTDIR}${_LIBDIR}/${SHLIB_LINK} 361.if exists(${DESTDIR}${_LIBDIR}/${SHLIB_NAME}) 362 -chflags noschg ${DESTDIR}${_LIBDIR}/${SHLIB_NAME} 363 rm -f ${DESTDIR}${_LIBDIR}/${SHLIB_NAME} 364.endif 365.endif 366.endif # SHLIB_LDSCRIPT 367.endif # SHLIB_LINK 368.endif # SHIB_NAME 369.if defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB) && ${MK_TOOLCHAIN} != "no" && !defined(PRIVATELIB) 370 ${INSTALL} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ 371 ${_INSTALLFLAGS} lib${LIB}_pic.a ${DESTDIR}${_LIBDIR} 372.endif 373.if defined(WANT_LINT) && !defined(NO_LINT) && defined(LIB) && !empty(LIB) 374 ${INSTALL} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ 375 ${_INSTALLFLAGS} ${LINTLIB} ${DESTDIR}${LINTLIBDIR} 376.endif 377.endif # !defined(INTERNALLIB) 378 379.if !defined(LIBRARIES_ONLY) 380.include <bsd.nls.mk> 381.include <bsd.files.mk> 382.include <bsd.incs.mk> 383.endif 384 385.include <bsd.links.mk> 386 387.if ${MK_MAN} != "no" && !defined(LIBRARIES_ONLY) 388realinstall: _maninstall 389.ORDER: beforeinstall _maninstall 390.endif 391 392.endif 393 394.if !target(lint) 395lint: ${SRCS:M*.c} 396 ${LINT} ${LINTFLAGS} ${CFLAGS:M-[DIU]*} ${.ALLSRC} 397.endif 398 399.if ${MK_MAN} != "no" && !defined(LIBRARIES_ONLY) 400.include <bsd.man.mk> 401.endif 402 403.include <bsd.dep.mk> 404 405.if !exists(${.OBJDIR}/${DEPENDFILE}) 406.if defined(LIB) && !empty(LIB) 407${OBJS} ${STATICOBJS} ${POBJS}: ${SRCS:M*.h} 408.for _S in ${SRCS:N*.[hly]} 409${_S:R}.po: ${_S} 410.endfor 411.endif 412.if defined(SHLIB_NAME) || \ 413 defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB) 414${SOBJS}: ${SRCS:M*.h} 415.for _S in ${SRCS:N*.[hly]} 416${_S:R}.So: ${_S} 417.endfor 418.endif 419.endif 420 421.if !target(clean) 422clean: 423.if defined(CLEANFILES) && !empty(CLEANFILES) 424 rm -f ${CLEANFILES} 425.endif 426.if defined(LIB) && !empty(LIB) 427 rm -f a.out ${OBJS} ${OBJS:S/$/.tmp/} ${STATICOBJS} 428.endif 429.if !defined(INTERNALLIB) 430.if ${MK_PROFILE} != "no" && defined(LIB) && !empty(LIB) 431 rm -f ${POBJS} ${POBJS:S/$/.tmp/} 432.endif 433.if defined(SHLIB_NAME) || \ 434 defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB) 435 rm -f ${SOBJS} ${SOBJS:.So=.so} ${SOBJS:S/$/.tmp/} 436.endif 437.if defined(SHLIB_NAME) 438.if defined(SHLIB_LINK) 439.if defined(SHLIB_LDSCRIPT) && exists(${.CURDIR}/${SHLIB_LDSCRIPT}) 440 rm -f lib${LIB}.ld 441.endif 442 rm -f ${SHLIB_LINK} 443.endif 444.endif # defined(SHLIB_NAME) 445.if defined(WANT_LINT) && defined(LIB) && !empty(LIB) 446 rm -f ${LINTOBJS} 447.endif 448.endif # !defined(INTERNALLIB) 449.if defined(_LIBS) && !empty(_LIBS) 450 rm -f ${_LIBS} 451.endif 452.if defined(CLEANDIRS) && !empty(CLEANDIRS) 453 rm -rf ${CLEANDIRS} 454.endif 455.if !empty(VERSION_DEF) && !empty(SYMBOL_MAPS) 456 rm -f ${VERSION_MAP} 457.endif 458.endif 459 460.if !empty(_LIBS) 461NOPATH_FILES+= ${_LIBS} 462.endif 463 464.include <bsd.obj.mk> 465 466.include <bsd.sys.mk> 467