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