1321964Ssjg# $Id: lib.mk,v 1.62 2017/06/11 03:24:04 sjg Exp $ 2246149Ssjg 3246149Ssjg.if !target(__${.PARSEFILE}__) 4246149Ssjg__${.PARSEFILE}__: 5246149Ssjg 6246149Ssjg.include <init.mk> 7246149Ssjg 8246149Ssjg.if ${OBJECT_FMT} == "ELF" 9246149SsjgNEED_SOLINKS?= yes 10246149Ssjg.endif 11246149Ssjg 12321964SsjgSHLIB_VERSION_FILE?= ${.CURDIR}/shlib_version 13321964Ssjg.if !defined(SHLIB_MAJOR) && exists(${SHLIB_VERSION_FILE}) 14321964SsjgSHLIB_MAJOR != . ${SHLIB_VERSION_FILE} ; echo $$major 15321964SsjgSHLIB_MINOR != . ${SHLIB_VERSION_FILE} ; echo $$minor 16321964SsjgSHLIB_TEENY != . ${SHLIB_VERSION_FILE} ; echo $$teeny 17246149Ssjg.endif 18246149Ssjg 19321964Ssjg.for x in major minor teeny 20321964Ssjgprint-shlib-$x: 21321964Ssjg.if defined(SHLIB_${x:tu}) && ${MK_PIC} != "no" 22321964Ssjg @echo ${SHLIB_${x:tu}} 23246149Ssjg.else 24246149Ssjg @false 25246149Ssjg.endif 26321964Ssjg.endfor 27246149Ssjg 28246149SsjgSHLIB_FULLVERSION ?= ${${SHLIB_MAJOR} ${SHLIB_MINOR} ${SHLIB_TEENY}:L:ts.} 29246149SsjgSHLIB_FULLVERSION := ${SHLIB_FULLVERSION} 30246149Ssjg 31246149Ssjg# add additional suffixes not exported. 32246149Ssjg# .po is used for profiling object files. 33321964Ssjg# ${PICO} is used for PIC object files. 34321964SsjgPICO?= .pico 35321964Ssjg.SUFFIXES: .out .a .ln ${PICO} .po .o .s .S .c .cc .C .m .F .f .r .y .l .cl .p .h 36246149Ssjg.SUFFIXES: .sh .m4 .m 37246149Ssjg 38246149SsjgCFLAGS+= ${COPTS} 39246149Ssjg 40321964Ssjg# Originally derrived from NetBSD-1.6 41246149Ssjg 42246149Ssjg# Set PICFLAGS to cc flags for producing position-independent code, 43246149Ssjg# if not already set. Includes -DPIC, if required. 44246149Ssjg 45246149Ssjg# Data-driven table using make variables to control how shared libraries 46246149Ssjg# are built for different platforms and object formats. 47246149Ssjg# OBJECT_FMT: currently either "ELF" or "a.out", from <bsd.own.mk> 48246149Ssjg# SHLIB_SOVERSION: version number to be compiled into a shared library 49276305Sngie# via -soname. Usually ${SHLIB_MAJOR} on ELF. 50246149Ssjg# NetBSD/pmax used to use ${SHLIB_MAJOR}[.${SHLIB_MINOR} 51246149Ssjg# [.${SHLIB_TEENY}]] 52246149Ssjg# SHLIB_SHFLAGS: Flags to tell ${LD} to emit shared library. 53246149Ssjg# with ELF, also set shared-lib version for ld.so. 54246149Ssjg# SHLIB_LDSTARTFILE: support .o file, call C++ file-level constructors 55246149Ssjg# SHLIB_LDENDFILE: support .o file, call C++ file-level destructors 56321964Ssjg# FPICFLAGS: flags for ${FC} to compile .[fF] files to ${PICO} objects. 57246149Ssjg# CPPICFLAGS: flags for ${CPP} to preprocess .[sS] files for ${AS} 58321964Ssjg# CPICFLAGS: flags for ${CC} to compile .[cC] files to ${PICO} objects. 59246149Ssjg# CAPICFLAGS flags for {$CC} to compiling .[Ss] files 60246149Ssjg# (usually just ${CPPPICFLAGS} ${CPICFLAGS}) 61321964Ssjg# APICFLAGS: flags for ${AS} to assemble .[sS] to ${PICO} objects. 62246149Ssjg 63246149Ssjg.if ${TARGET_OSNAME} == "NetBSD" 64246149Ssjg.if ${MACHINE_ARCH} == "alpha" 65246149Ssjg # Alpha-specific shared library flags 66246149SsjgFPICFLAGS ?= -fPIC 67246149SsjgCPICFLAGS ?= -fPIC -DPIC 68246149SsjgCPPPICFLAGS?= -DPIC 69246149SsjgCAPICFLAGS?= ${CPPPICFLAGS} ${CPICFLAGS} 70246149SsjgAPICFLAGS ?= 71246149Ssjg.elif ${MACHINE_ARCH} == "mipsel" || ${MACHINE_ARCH} == "mipseb" 72246149Ssjg # mips-specific shared library flags 73246149Ssjg 74246149Ssjg# On mips, all libs are compiled with ABIcalls, not just sharedlibs. 75246149SsjgMKPICLIB= no 76246149Ssjg 77246149Ssjg# so turn shlib PIC flags on for ${AS}. 78246149SsjgAINC+=-DABICALLS 79246149SsjgAFLAGS+= -fPIC 80246149SsjgAS+= -KPIC 81246149Ssjg 82246149Ssjg.elif ${MACHINE_ARCH} == "vax" && ${OBJECT_FMT} == "ELF" 83246149Ssjg# On the VAX, all object are PIC by default, not just sharedlibs. 84246149SsjgMKPICLIB= no 85246149Ssjg 86246149Ssjg.elif (${MACHINE_ARCH} == "sparc" || ${MACHINE_ARCH} == "sparc64") && \ 87246149Ssjg ${OBJECT_FMT} == "ELF" 88246149Ssjg# If you use -fPIC you need to define BIGPIC to turn on 32-bit 89246149Ssjg# relocations in asm code 90246149SsjgFPICFLAGS ?= -fPIC 91246149SsjgCPICFLAGS ?= -fPIC -DPIC 92246149SsjgCPPPICFLAGS?= -DPIC -DBIGPIC 93246149SsjgCAPICFLAGS?= ${CPPPICFLAGS} ${CPICFLAGS} 94246149SsjgAPICFLAGS ?= -KPIC 95246149Ssjg 96246149Ssjg.else 97246149Ssjg 98246149Ssjg# Platform-independent flags for NetBSD a.out shared libraries 99246149SsjgSHLIB_SOVERSION=${SHLIB_FULLVERSION} 100246149SsjgSHLIB_SHFLAGS= 101246149SsjgFPICFLAGS ?= -fPIC 102246149SsjgCPICFLAGS?= -fPIC -DPIC 103246149SsjgCPPPICFLAGS?= -DPIC 104246149SsjgCAPICFLAGS?= ${CPPPICFLAGS} ${CPICFLAGS} 105246149SsjgAPICFLAGS?= -k 106246149Ssjg 107246149Ssjg.endif 108246149Ssjg 109246149Ssjg# Platform-independent linker flags for ELF shared libraries 110246149Ssjg.if ${OBJECT_FMT} == "ELF" 111246149SsjgSHLIB_SOVERSION= ${SHLIB_MAJOR} 112246149SsjgSHLIB_SHFLAGS= -soname lib${LIB}.so.${SHLIB_SOVERSION} 113246149SsjgSHLIB_LDSTARTFILE?= /usr/lib/crtbeginS.o 114246149SsjgSHLIB_LDENDFILE?= /usr/lib/crtendS.o 115246149Ssjg.endif 116246149Ssjg 117276305Sngie# for compatibility with the following 118246149SsjgCC_PIC?= ${CPICFLAGS} 119246149SsjgLD_shared=${SHLIB_SHFLAGS} 120246149Ssjg 121246149Ssjg.endif # NetBSD 122246149Ssjg 123246149Ssjg.if ${TARGET_OSNAME} == "FreeBSD" 124246149Ssjg.if ${OBJECT_FMT} == "ELF" 125246149SsjgSHLIB_SOVERSION= ${SHLIB_MAJOR} 126246149SsjgSHLIB_SHFLAGS= -soname lib${LIB}.so.${SHLIB_SOVERSION} 127246149Ssjg.else 128246149SsjgSHLIB_SHFLAGS= -assert pure-text 129246149Ssjg.endif 130246149SsjgSHLIB_LDSTARTFILE= 131246149SsjgSHLIB_LDENDFILE= 132246149SsjgCC_PIC?= -fpic 133246149SsjgLD_shared=${SHLIB_SHFLAGS} 134246149Ssjg 135246149Ssjg.endif # FreeBSD 136246149Ssjg 137246149SsjgMKPICLIB?= yes 138246149Ssjg 139246149Ssjg# sys.mk can override these 140246149SsjgLD_X?=-X 141246149SsjgLD_x?=-x 142246149SsjgLD_r?=-r 143246149Ssjg 144246149Ssjg# Non BSD machines will be using bmake. 145246149Ssjg.if ${TARGET_OSNAME} == "SunOS" 146246149SsjgLD_shared=-assert pure-text 147246149Ssjg.if ${OBJECT_FMT} == "ELF" || ${MACHINE} == "solaris" 148246149Ssjg# Solaris 149246149SsjgLD_shared=-h lib${LIB}.so.${SHLIB_MAJOR} -G 150246149Ssjg.endif 151246149Ssjg.elif ${TARGET_OSNAME} == "HP-UX" 152246149SsjgLD_shared=-b 153246149SsjgLD_so=sl 154246149SsjgDLLIB= 155246149Ssjg# HPsUX lorder does not grok anything but .o 156321964SsjgLD_sobjs=`${LORDER} ${OBJS} | ${TSORT} | sed 's,\.o,${PICO},'` 157246149SsjgLD_pobjs=`${LORDER} ${OBJS} | ${TSORT} | sed 's,\.o,.po,'` 158246149Ssjg.elif ${TARGET_OSNAME} == "OSF1" 159246149SsjgLD_shared= -msym -shared -expect_unresolved '*' 160246149SsjgLD_solib= -all lib${LIB}_pic.a 161246149SsjgDLLIB= 162246149Ssjg# lorder does not grok anything but .o 163321964SsjgLD_sobjs=`${LORDER} ${OBJS} | ${TSORT} | sed 's,\.o,${PICO},'` 164246149SsjgLD_pobjs=`${LORDER} ${OBJS} | ${TSORT} | sed 's,\.o,.po,'` 165246149SsjgAR_cq= -cqs 166246149Ssjg.elif ${TARGET_OSNAME} == "FreeBSD" 167246149SsjgLD_solib= lib${LIB}_pic.a 168246149Ssjg.elif ${TARGET_OSNAME} == "Linux" 169276305SngieSHLIB_LD = ${CC} 170246149Ssjg# this is ambiguous of course 171276305SngieLD_shared=-shared -Wl,"-h lib${LIB}.so.${SHLIB_MAJOR}" 172276305SngieLD_solib= -Wl,--whole-archive lib${LIB}_pic.a -Wl,--no-whole-archive 173246149Ssjg# Linux uses GNU ld, which is a multi-pass linker 174246149Ssjg# so we don't need to use lorder or tsort 175246149SsjgLD_objs = ${OBJS} 176246149SsjgLD_pobjs = ${POBJS} 177246149SsjgLD_sobjs = ${SOBJS} 178246149Ssjg.elif ${TARGET_OSNAME} == "Darwin" 179246149SsjgSHLIB_LD = ${CC} 180246149SsjgSHLIB_INSTALL_VERSION ?= ${SHLIB_MAJOR} 181246149SsjgSHLIB_COMPATABILITY_VERSION ?= ${SHLIB_MAJOR}.${SHLIB_MINOR:U0} 182246149SsjgSHLIB_COMPATABILITY ?= \ 183246149Ssjg -compatibility_version ${SHLIB_COMPATABILITY_VERSION} \ 184246149Ssjg -current_version ${SHLIB_FULLVERSION} 185246149SsjgLD_shared = -dynamiclib \ 186246149Ssjg -flat_namespace -undefined suppress \ 187246149Ssjg -install_name ${LIBDIR}/lib${LIB}.${SHLIB_INSTALL_VERSION}.${LD_solink} \ 188246149Ssjg ${SHLIB_COMPATABILITY} 189246149SsjgSHLIB_LINKS = 190246149Ssjg.for v in ${SHLIB_COMPATABILITY_VERSION} ${SHLIB_INSTALL_VERSION} 191246149Ssjg.if "$v" != "${SHLIB_FULLVERSION}" 192246149SsjgSHLIB_LINKS += lib${LIB}.$v.${LD_solink} 193246149Ssjg.endif 194246149Ssjg.endfor 195246149Ssjg.if ${MK_LINKLIB} != "no" 196246149SsjgSHLIB_LINKS += lib${LIB}.${LD_solink} 197246149Ssjg.endif 198246149Ssjg 199246149SsjgLD_so = ${SHLIB_FULLVERSION}.dylib 200246149SsjgLD_sobjs = ${SOBJS:O:u} 201246149SsjgLD_solib = ${LD_sobjs} 202246149SsjgSOLIB = ${LD_sobjs} 203246149SsjgLD_solink = dylib 204246149Ssjg.if ${MACHINE_ARCH} == "i386" 205246149SsjgPICFLAG ?= -fPIC 206246149Ssjg.else 207246149SsjgPICFLAG ?= -fPIC -fno-common 208246149Ssjg.endif 209246149SsjgRANLIB = : 210246149Ssjg.endif 211246149Ssjg 212246149SsjgSHLIB_LD ?= ${LD} 213246149Ssjg 214246149Ssjg.if !empty(SHLIB_MAJOR) 215246149Ssjg.if ${NEED_SOLINKS} && empty(SHLIB_LINKS) 216246149Ssjg.if ${MK_LINKLIB} != "no" 217246149SsjgSHLIB_LINKS = lib${LIB}.${LD_solink} 218246149Ssjg.endif 219246149Ssjg.if "${SHLIB_FULLVERSION}" != "${SHLIB_MAJOR}" 220246149SsjgSHLIB_LINKS += lib${LIB}.${LD_solink}.${SHLIB_MAJOR} 221246149Ssjg.endif 222246149Ssjg.endif 223246149Ssjg.endif 224246149Ssjg 225246149SsjgLIBTOOL?=libtool 226246149SsjgLD_shared ?= -Bshareable -Bforcearchive 227246149SsjgLD_so ?= so.${SHLIB_FULLVERSION} 228246149SsjgLD_solink ?= so 229246149Ssjg.if empty(LORDER) 230246149SsjgLD_objs ?= ${OBJS} 231246149SsjgLD_pobjs ?= ${POBJS} 232246149SsjgLD_sobjs ?= ${SOBJS} 233246149Ssjg.else 234246149SsjgLD_objs ?= `${LORDER} ${OBJS} | ${TSORT}` 235246149SsjgLD_sobjs ?= `${LORDER} ${SOBJS} | ${TSORT}` 236246149SsjgLD_pobjs ?= `${LORDER} ${POBJS} | ${TSORT}` 237246149Ssjg.endif 238246149SsjgLD_solib ?= ${LD_sobjs} 239246149SsjgAR_cq ?= cq 240246149Ssjg.if exists(/netbsd) && exists(${DESTDIR}/usr/lib/libdl.so) 241246149SsjgDLLIB ?= -ldl 242246149Ssjg.endif 243246149Ssjg 244321964Ssjg# some libs have lots of objects, and scanning all .o, .po and ${PICO} meta files 245246149Ssjg# is a waste of time, this tells meta.autodep.mk to just pick one 246321964Ssjg# (typically ${PICO}) 247246149Ssjg# yes, 42 is a random number. 248292068Ssjg.if ${MK_DIRDEPS_BUILD} == "yes" && ${SRCS:Uno:[\#]} > 42 249246149SsjgOPTIMIZE_OBJECT_META_FILES ?= yes 250246149Ssjg.endif 251246149Ssjg 252246149Ssjg 253246149Ssjg.if ${MK_LIBTOOL} == "yes" 254276305Sngie# because libtool is so fascist about naming the object files, 255246149Ssjg# we cannot (yet) build profiled libs 256246149SsjgMK_PROFILE=no 257246149Ssjg_LIBS=lib${LIB}.a 258246149Ssjg.if exists(${.CURDIR}/shlib_version) 259246149SsjgSHLIB_AGE != . ${.CURDIR}/shlib_version ; echo $$age 260246149Ssjg.endif 261246149Ssjg.else 262246149Ssjg# for the normal .a we do not want to strip symbols 263246149Ssjg.c.o: 264246149Ssjg ${COMPILE.c} ${.IMPSRC} 265246149Ssjg 266246149Ssjg# for the normal .a we do not want to strip symbols 267321964Ssjg${CXX_SUFFIXES:%=%.o}: 268246149Ssjg ${COMPILE.cc} ${.IMPSRC} 269246149Ssjg 270246149Ssjg.S.o .s.o: 271321964Ssjg ${COMPILE.S} ${CFLAGS:M-[ID]*} ${AINC} ${.IMPSRC} 272246149Ssjg 273246149Ssjg.if (${LD_X} == "") 274246149Ssjg.c.po: 275253883Ssjg ${COMPILE.c} ${CC_PG} ${PROFFLAGS} ${.IMPSRC} -o ${.TARGET} 276246149Ssjg 277321964Ssjg${CXX_SUFFIXES:%=%.po}: 278246149Ssjg ${COMPILE.cc} -pg ${.IMPSRC} -o ${.TARGET} 279246149Ssjg 280321964Ssjg.S${PICO} .s${PICO}: 281246149Ssjg ${COMPILE.S} ${PICFLAG} ${CC_PIC} ${CFLAGS:M-[ID]*} ${AINC} ${.IMPSRC} -o ${.TARGET} 282246149Ssjg.else 283246149Ssjg.c.po: 284321964Ssjg ${COMPILE.c} ${CC_PG} ${PROFFLAGS} ${.IMPSRC} -o ${.TARGET}.o 285246149Ssjg @${LD} ${LD_X} ${LD_r} ${.TARGET}.o -o ${.TARGET} 286246149Ssjg @rm -f ${.TARGET}.o 287246149Ssjg 288321964Ssjg${CXX_SUFFIXES:%=%.po}: 289321964Ssjg ${COMPILE.cc} ${CXX_PG} ${.IMPSRC} -o ${.TARGET}.o 290321964Ssjg ${LD} ${LD_X} ${LD_r} ${.TARGET}.o -o ${.TARGET} 291246149Ssjg @rm -f ${.TARGET}.o 292246149Ssjg 293321964Ssjg.S${PICO} .s${PICO}: 294321964Ssjg ${COMPILE.S} ${PICFLAG} ${CC_PIC} ${CFLAGS:M-[ID]*} ${AINC} ${.IMPSRC} -o ${.TARGET}.o 295321964Ssjg ${LD} ${LD_x} ${LD_r} ${.TARGET}.o -o ${.TARGET} 296246149Ssjg @rm -f ${.TARGET}.o 297246149Ssjg.endif 298246149Ssjg 299246149Ssjg.if (${LD_x} == "") 300321964Ssjg.c${PICO}: 301246149Ssjg ${COMPILE.c} ${PICFLAG} ${CC_PIC} ${.IMPSRC} -o ${.TARGET} 302246149Ssjg 303321964Ssjg${CXX_SUFFIXES:%=%${PICO}}: 304246149Ssjg ${COMPILE.cc} ${PICFLAG} ${CC_PIC} ${.IMPSRC} -o ${.TARGET} 305246149Ssjg 306246149Ssjg.S.po .s.po: 307253883Ssjg ${COMPILE.S} ${PROFFLAGS} ${CFLAGS:M-[ID]*} ${AINC} ${.IMPSRC} -o ${.TARGET} 308246149Ssjg.else 309246149Ssjg 310321964Ssjg.c${PICO}: 311321964Ssjg ${COMPILE.c} ${PICFLAG} ${CC_PIC} ${.IMPSRC} -o ${.TARGET}.o 312321964Ssjg ${LD} ${LD_x} ${LD_r} ${.TARGET}.o -o ${.TARGET} 313246149Ssjg @rm -f ${.TARGET}.o 314246149Ssjg 315321964Ssjg${CXX_SUFFIXES:%=%${PICO}}: 316321964Ssjg ${COMPILE.cc} ${PICFLAG} ${CC_PIC} ${.IMPSRC} -o ${.TARGET}.o 317321964Ssjg ${LD} ${LD_x} ${LD_r} ${.TARGET}.o -o ${.TARGET} 318246149Ssjg @rm -f ${.TARGET}.o 319246149Ssjg 320246149Ssjg.S.po .s.po: 321321964Ssjg ${COMPILE.S} ${PROFFLAGS} ${CFLAGS:M-[ID]*} ${AINC} ${.IMPSRC} -o ${.TARGET}.o 322321964Ssjg ${LD} ${LD_X} ${LD_r} ${.TARGET}.o -o ${.TARGET} 323246149Ssjg @rm -f ${.TARGET}.o 324246149Ssjg 325246149Ssjg.endif 326246149Ssjg.endif 327246149Ssjg 328246149Ssjg.c.ln: 329246149Ssjg ${LINT} ${LINTFLAGS} ${CFLAGS:M-[IDU]*} -i ${.IMPSRC} 330246149Ssjg 331246149Ssjg.if ${MK_LIBTOOL} != "yes" 332246149Ssjg 333246149Ssjg.if !defined(PICFLAG) 334246149SsjgPICFLAG=-fpic 335246149Ssjg.endif 336246149Ssjg 337246149Ssjg_LIBS= 338246149Ssjg 339246149Ssjg.if ${MK_ARCHIVE} != "no" 340246149Ssjg_LIBS += lib${LIB}.a 341246149Ssjg.endif 342246149Ssjg 343246149Ssjg.if ${MK_PROFILE} != "no" 344246149Ssjg_LIBS+=lib${LIB}_p.a 345246149SsjgPOBJS+=${OBJS:.o=.po} 346246149Ssjg.endif 347246149Ssjg 348246149Ssjg.if ${MK_PIC} != "no" 349246149Ssjg.if ${MK_PICLIB} == "no" 350246149SsjgSOLIB ?= lib${LIB}.a 351246149Ssjg.else 352246149SsjgSOLIB=lib${LIB}_pic.a 353246149Ssjg_LIBS+=${SOLIB} 354246149Ssjg.endif 355246149Ssjg.if !empty(SHLIB_FULLVERSION) 356246149Ssjg_LIBS+=lib${LIB}.${LD_so} 357246149Ssjg.endif 358246149Ssjg.endif 359246149Ssjg 360246149Ssjg.if ${MK_LINT} != "no" 361246149Ssjg_LIBS+=llib-l${LIB}.ln 362246149Ssjg.endif 363246149Ssjg 364246149Ssjg# here is where you can define what LIB* are 365246149Ssjg.-include <libnames.mk> 366246149Ssjg.if ${MK_DPADD_MK} == "yes" 367246149Ssjg# lots of cool magic, but might not suit everyone. 368246149Ssjg.include <dpadd.mk> 369246149Ssjg.endif 370246149Ssjg 371321964Ssjg.if empty(LIB) 372321964Ssjg_LIBS= 373321964Ssjg.endif 374321964Ssjg 375246149Ssjg.if !defined(_SKIP_BUILD) 376321964Ssjgrealbuild: ${_LIBS} 377246149Ssjg.endif 378321964Ssjg 379246149Ssjgall: _SUBDIRUSE 380246149Ssjg 381246149Ssjg.for s in ${SRCS:N*.h:M*/*} 382321964Ssjg${.o ${PICO} .po .lo:L:@o@${s:T:R}$o@}: $s 383246149Ssjg.endfor 384246149Ssjg 385246149SsjgOBJS+= ${SRCS:T:N*.h:R:S/$/.o/g} 386246149Ssjg.NOPATH: ${OBJS} 387246149Ssjg 388246149Ssjg.if ${MK_LIBTOOL} == "yes" 389246149Ssjg.if ${MK_PIC} == "no" 390246149SsjgLT_STATIC=-static 391246149Ssjg.else 392246149SsjgLT_STATIC= 393246149Ssjg.endif 394246149SsjgSHLIB_AGE?=0 395246149Ssjg 396246149Ssjg# .lo's are created as a side effect 397246149Ssjg.s.o .S.o .c.o: 398246149Ssjg ${LIBTOOL} --mode=compile ${CC} ${LT_STATIC} ${CFLAGS} ${CPPFLAGS} ${IMPFLAGS} -c ${.IMPSRC} 399246149Ssjg 400276305Sngie# can't really do profiled libs with libtool - its too fascist about 401246149Ssjg# naming the output... 402246149Ssjglib${LIB}.a:: ${OBJS} 403246149Ssjg @rm -f ${.TARGET} 404246149Ssjg ${LIBTOOL} --mode=link ${CC} ${LT_STATIC} -o ${.TARGET:.a=.la} ${OBJS:.o=.lo} -rpath ${SHLIBDIR}:/usr/lib -version-info ${SHLIB_MAJOR}:${SHLIB_MINOR}:${SHLIB_AGE} 405246149Ssjg @ln .libs/${.TARGET} . 406246149Ssjg 407246149Ssjglib${LIB}.${LD_so}:: lib${LIB}.a 408246149Ssjg @[ -s ${.TARGET}.${SHLIB_AGE} ] || { ln -s .libs/lib${LIB}.${LD_so}* . 2>/dev/null; : } 409246149Ssjg @[ -s ${.TARGET} ] || ln -s ${.TARGET}.${SHLIB_AGE} ${.TARGET} 410246149Ssjg 411246149Ssjg.else # MK_LIBTOOL=yes 412246149Ssjg 413246149Ssjglib${LIB}.a:: ${OBJS} 414321964Ssjg @${META_NOECHO} building standard ${LIB} library 415246149Ssjg @rm -f ${.TARGET} 416246149Ssjg @${AR} ${AR_cq} ${.TARGET} ${LD_objs} 417246149Ssjg ${RANLIB} ${.TARGET} 418246149Ssjg 419246149SsjgPOBJS+= ${OBJS:.o=.po} 420246149Ssjg.NOPATH: ${POBJS} 421246149Ssjglib${LIB}_p.a:: ${POBJS} 422321964Ssjg @${META_NOECHO} building profiled ${LIB} library 423246149Ssjg @rm -f ${.TARGET} 424246149Ssjg @${AR} ${AR_cq} ${.TARGET} ${LD_pobjs} 425246149Ssjg ${RANLIB} ${.TARGET} 426246149Ssjg 427321964SsjgSOBJS+= ${OBJS:.o=${PICO}} 428246149Ssjg.NOPATH: ${SOBJS} 429246149Ssjglib${LIB}_pic.a:: ${SOBJS} 430321964Ssjg @${META_NOECHO} building shared object ${LIB} library 431246149Ssjg @rm -f ${.TARGET} 432246149Ssjg @${AR} ${AR_cq} ${.TARGET} ${LD_sobjs} 433246149Ssjg ${RANLIB} ${.TARGET} 434246149Ssjg 435246149Ssjg#SHLIB_LDADD?= ${LDADD} 436246149Ssjg 437246149Ssjg# bound to be non-portable... 438246149Ssjg# this is known to work for NetBSD 1.6 and FreeBSD 4.2 439246149Ssjglib${LIB}.${LD_so}: ${SOLIB} ${DPADD} 440321964Ssjg @${META_NOECHO} building shared ${LIB} library \(version ${SHLIB_FULLVERSION}\) 441246149Ssjg @rm -f ${.TARGET} 442246149Ssjg.if ${TARGET_OSNAME} == "NetBSD" || ${TARGET_OSNAME} == "FreeBSD" 443246149Ssjg.if ${OBJECT_FMT} == "ELF" 444246149Ssjg ${SHLIB_LD} -x -shared ${SHLIB_SHFLAGS} -o ${.TARGET} \ 445246149Ssjg ${SHLIB_LDSTARTFILE} \ 446246149Ssjg --whole-archive ${SOLIB} --no-whole-archive ${SHLIB_LDADD} \ 447246149Ssjg ${SHLIB_LDENDFILE} 448246149Ssjg.else 449246149Ssjg ${SHLIB_LD} ${LD_x} ${LD_shared} \ 450246149Ssjg -o ${.TARGET} ${SOLIB} ${SHLIB_LDADD} 451246149Ssjg.endif 452246149Ssjg.else 453246149Ssjg ${SHLIB_LD} -o ${.TARGET} ${LD_shared} ${LD_solib} ${DLLIB} ${SHLIB_LDADD} 454246149Ssjg.endif 455246149Ssjg.endif 456246149Ssjg.if !empty(SHLIB_LINKS) 457246149Ssjg rm -f ${SHLIB_LINKS}; ${SHLIB_LINKS:O:u:@x@ln -s ${.TARGET} $x;@} 458246149Ssjg.endif 459246149Ssjg 460246149SsjgLOBJS+= ${LSRCS:.c=.ln} ${SRCS:M*.c:.c=.ln} 461246149Ssjg.NOPATH: ${LOBJS} 462246149SsjgLLIBS?= -lc 463246149Ssjgllib-l${LIB}.ln: ${LOBJS} 464321964Ssjg @${META_NOECHO} building llib-l${LIB}.ln 465246149Ssjg @rm -f llib-l${LIB}.ln 466246149Ssjg @${LINT} -C${LIB} ${LOBJS} ${LLIBS} 467246149Ssjg 468246149Ssjg.if !target(clean) 469246149Ssjgcleanlib: .PHONY 470246149Ssjg rm -f a.out [Ee]rrs mklog core *.core ${CLEANFILES} 471246149Ssjg rm -f lib${LIB}.a ${OBJS} 472246149Ssjg rm -f lib${LIB}_p.a ${POBJS} 473246149Ssjg rm -f lib${LIB}_pic.a lib${LIB}.so.*.* ${SOBJS} 474246149Ssjg rm -f llib-l${LIB}.ln ${LOBJS} 475246149Ssjg.if !empty(SHLIB_LINKS) 476246149Ssjg rm -f ${SHLIB_LINKS} 477246149Ssjg.endif 478246149Ssjg 479246149Ssjgclean: _SUBDIRUSE cleanlib 480246149Ssjgcleandir: _SUBDIRUSE cleanlib 481246149Ssjg.else 482246149Ssjgcleandir: _SUBDIRUSE clean 483246149Ssjg.endif 484246149Ssjg 485246149Ssjg.if defined(SRCS) && (!defined(MKDEP) || ${MKDEP} != autodep) 486246149Ssjgafterdepend: .depend 487246149Ssjg @(TMP=/tmp/_depend$$$$; \ 488321964Ssjg sed -e 's/^\([^\.]*\).o[ ]*:/\1.o \1.po \1${PICO} \1.ln:/' \ 489246149Ssjg < .depend > $$TMP; \ 490246149Ssjg mv $$TMP .depend) 491246149Ssjg.endif 492246149Ssjg 493246149Ssjg.if !target(install) 494246149Ssjg.if !target(beforeinstall) 495246149Ssjgbeforeinstall: 496246149Ssjg.endif 497246149Ssjg 498246149Ssjg.if !empty(LIBOWN) 499246149SsjgLIB_INSTALL_OWN ?= -o ${LIBOWN} -g ${LIBGRP} 500246149Ssjg.endif 501246149Ssjg 502246149Ssjg.include <links.mk> 503246149Ssjg 504321964Ssjg.if !target(libinstall) && !empty(LIB) 505246149Ssjgrealinstall: libinstall 506246149Ssjglibinstall: 507246149Ssjg [ -d ${DESTDIR}/${LIBDIR} ] || \ 508246149Ssjg ${INSTALL} -d ${LIB_INSTALL_OWN} -m 775 ${DESTDIR}${LIBDIR} 509246149Ssjg.if ${MK_ARCHIVE} != "no" 510246149Ssjg ${INSTALL} ${COPY} ${LIB_INSTALL_OWN} -m 600 lib${LIB}.a \ 511246149Ssjg ${DESTDIR}${LIBDIR} 512246149Ssjg ${RANLIB} ${DESTDIR}${LIBDIR}/lib${LIB}.a 513246149Ssjg chmod ${LIBMODE} ${DESTDIR}${LIBDIR}/lib${LIB}.a 514246149Ssjg.endif 515246149Ssjg.if ${MK_PROFILE} != "no" 516246149Ssjg ${INSTALL} ${COPY} ${LIB_INSTALL_OWN} -m 600 \ 517246149Ssjg lib${LIB}_p.a ${DESTDIR}${LIBDIR} 518246149Ssjg ${RANLIB} ${DESTDIR}${LIBDIR}/lib${LIB}_p.a 519246149Ssjg chmod ${LIBMODE} ${DESTDIR}${LIBDIR}/lib${LIB}_p.a 520246149Ssjg.endif 521246149Ssjg.if ${MK_PIC} != "no" 522246149Ssjg.if ${MK_PICLIB} != "no" 523246149Ssjg ${INSTALL} ${COPY} ${LIB_INSTALL_OWN} -m 600 \ 524246149Ssjg lib${LIB}_pic.a ${DESTDIR}${LIBDIR} 525246149Ssjg ${RANLIB} ${DESTDIR}${LIBDIR}/lib${LIB}_pic.a 526246149Ssjg chmod ${LIBMODE} ${DESTDIR}${LIBDIR}/lib${LIB}_pic.a 527246149Ssjg.endif 528246149Ssjg.if !empty(SHLIB_MAJOR) 529246149Ssjg ${INSTALL} ${COPY} ${LIB_INSTALL_OWN} -m ${LIBMODE} \ 530246149Ssjg lib${LIB}.${LD_so} ${DESTDIR}${LIBDIR} 531246149Ssjg.if !empty(SHLIB_LINKS) 532246149Ssjg (cd ${DESTDIR}${LIBDIR} && { rm -f ${SHLIB_LINKS}; ${SHLIB_LINKS:O:u:@x@ln -s lib${LIB}.${LD_so} $x;@} }) 533246149Ssjg.endif 534246149Ssjg.endif 535246149Ssjg.endif 536246149Ssjg.if ${MK_LINT} != "no" && ${MK_LINKLIB} != "no" && !empty(LOBJS) 537246149Ssjg ${INSTALL} ${COPY} ${LIB_INSTALL_OWN} -m ${LIBMODE} \ 538246149Ssjg llib-l${LIB}.ln ${DESTDIR}${LINTLIBDIR} 539246149Ssjg.endif 540246149Ssjg.if defined(LINKS) && !empty(LINKS) 541246149Ssjg @set ${LINKS}; ${_LINKS_SCRIPT} 542246149Ssjg.endif 543246149Ssjg.endif 544246149Ssjg 545321964Ssjg.if ${MK_MAN} != "no" 546246149Ssjginstall: maninstall _SUBDIRUSE 547246149Ssjgmaninstall: afterinstall 548321964Ssjg.endif 549246149Ssjgafterinstall: realinstall 550321964Ssjglibinstall: beforeinstall 551246149Ssjgrealinstall: beforeinstall 552246149Ssjg.endif 553246149Ssjg 554321964Ssjg.if defined(FILES) || defined(FILESGROUPS) 555321964Ssjg.include <files.mk> 556321964Ssjg.endif 557321964Ssjg 558246149Ssjg.if ${MK_MAN} != "no" 559246149Ssjg.include <man.mk> 560246149Ssjg.endif 561246149Ssjg 562246149Ssjg.if ${MK_NLS} != "no" 563246149Ssjg.include <nls.mk> 564246149Ssjg.endif 565246149Ssjg 566246149Ssjg.include <obj.mk> 567246149Ssjg.include <inc.mk> 568246149Ssjg.include <dep.mk> 569246149Ssjg.include <subdir.mk> 570246149Ssjg.endif 571246149Ssjg 572246149Ssjg# during building we usually need/want to install libs somewhere central 573246149Ssjg# note that we do NOT ch{own,grp} as that would likely fail at this point. 574246149Ssjg# otherwise it is the same as realinstall 575246149Ssjg# Note that we don't need this when using dpadd.mk 576246149Ssjg.libinstall: ${_LIBS} 577246149Ssjg test -d ${DESTDIR}${LIBDIR} || ${INSTALL} -d -m775 ${DESTDIR}${LIBDIR} 578246149Ssjg.for _lib in ${_LIBS:M*.a} 579246149Ssjg ${INSTALL} ${COPY} -m 644 ${_lib} ${DESTDIR}${LIBDIR} 580246149Ssjg ${RANLIB} ${DESTDIR}${LIBDIR}/${_lib} 581246149Ssjg.endfor 582246149Ssjg.for _lib in ${_LIBS:M*.${LD_solink}*:O:u} 583246149Ssjg ${INSTALL} ${COPY} -m ${LIBMODE} ${_lib} ${DESTDIR}${LIBDIR} 584246149Ssjg.if !empty(SHLIB_LINKS) 585246149Ssjg (cd ${DESTDIR}${LIBDIR} && { ${SHLIB_LINKS:O:u:@x@ln -sf ${_lib} $x;@}; }) 586246149Ssjg.endif 587246149Ssjg.endfor 588246149Ssjg @touch ${.TARGET} 589246149Ssjg 590321964Ssjg.if !empty(LIB) 591321964SsjgSTAGE_LIBDIR?= ${STAGE_OBJTOP}${LIBDIR} 592321964Ssjgstage_libs: ${_LIBS} 593321964Ssjg.endif 594321964Ssjg 595246149Ssjg.include <final.mk> 596246149Ssjg.endif 597