xref: /netbsd-src/share/mk/bsd.prog.mk (revision 9c33d0a32e02582d209daedaa0c74e920b195b0b)
1*9c33d0a3Sriastradh#	$NetBSD: bsd.prog.mk,v 1.354 2025/01/14 19:45:53 riastradh Exp $
276cfd073Smikel#	@(#)bsd.prog.mk	8.2 (Berkeley) 4/2/94
361f28255Scgd
403a26b2cSlukem.ifndef HOSTPROG
503a26b2cSlukem
61129ed4aStv.include <bsd.init.mk>
709a0767aSthorpej.include <bsd.shlib.mk>
8000836e0Sthorpej.include <bsd.gcc.mk>
91a5f018bSkamil.include <bsd.sanitizer.mk>
101e9e9266Smycroft
1164a497deSkamil##### Sanitizer specific flags.
1264a497deSkamil
13031cfa7fSkamilCFLAGS+=	${SANITIZERFLAGS} ${LIBCSANITIZERFLAGS}
14031cfa7fSkamilCXXFLAGS+=	${SANITIZERFLAGS} ${LIBCSANITIZERFLAGS}
1564a497deSkamilLDFLAGS+=	${SANITIZERFLAGS}
1664a497deSkamil
1712408017Sjmmv#
1812408017Sjmmv# Definitions and targets shared among all programs built by a single
1912408017Sjmmv# Makefile.
2012408017Sjmmv#
21fef715f4Schristos
221129ed4aStv##### Basic targets
234e5d05c9Smycroftrealinstall:	proginstall scriptsinstall
24bb8827f7Smycroft
2512408017Sjmmv.gdbinit:
2612408017Sjmmv	rm -f .gdbinit
2712408017Sjmmv.if defined(DESTDIR) && !empty(DESTDIR)
2812408017Sjmmv	echo "set solib-absolute-prefix ${DESTDIR}" > .gdbinit
2912408017Sjmmv.else
3012408017Sjmmv	touch .gdbinit
3112408017Sjmmv.endif
3212408017Sjmmv.for __gdbinit in ${GDBINIT}
3312408017Sjmmv	echo "source ${__gdbinit}" >> .gdbinit
3412408017Sjmmv.endfor
3512408017Sjmmv
36386a389aSapbCLEANFILES+= a.out [Ee]rrs mklog core *.core .gdbinit
3712408017Sjmmv
38dc084e40Schristos.if defined(MKPIE) && (${MKPIE} != "no") && !defined(NOPIE)
3918c51ff0SchristosCFLAGS+=	${PIE_CFLAGS}
4081dd08dfSchristosAFLAGS+=	${PIE_AFLAGS}
41a3bc99b8SjoergLDFLAGS+=	${"${LDSTATIC.${.TARGET}}" == "-static" :? : ${PIE_LDFLAGS}}
421269d9a5Schristos.endif
431269d9a5Schristos
4461f28255ScgdCFLAGS+=	${COPTS}
456c0101deSchristos.if ${MKDEBUG:Uno} != "no" && !defined(NODEBUG)
46aa675a73SchristosCFLAGS+=	-g
47aa675a73Schristos.endif
481ed40e7cSmrgOBJCFLAGS+=	${OBJCOPTS}
496830ef87SerhMKDEP_SUFFIXES?=	.o .ln .d
5061f28255Scgd
5161fb3737Sdarran# CTF preserve debug symbols
521339b2ccSozaki-r.if (${MKCTF:Uno} != "no") && (${CFLAGS:M-g} != "")
5361fb3737SdarranCTFFLAGS+= -g
5461fb3737SdarranCTFMFLAGS+= -g
55e2bee468Smrg.if defined(HAVE_GCC)
56199409cfSchristos#CFLAGS+=-gdwarf-2
57aca5beabSchristos.endif
5861fb3737Sdarran.endif
5961fb3737Sdarran
606dba3a74Sthorpej# ELF platforms depend on crti.o, crtbegin.o, crtend.o, and crtn.o
619d602b9cSpk.ifndef LIBCRTBEGIN
626811dc67SmattLIBCRTBEGIN=	${DESTDIR}/usr/lib/${MLIBDIR:D${MLIBDIR}/}crti.o ${_GCC_CRTBEGIN}
63e7f0a978Schristos.MADE: ${LIBCRTBEGIN}
649d602b9cSpk.endif
659d602b9cSpk.ifndef LIBCRTEND
666811dc67SmattLIBCRTEND=	${_GCC_CRTEND} ${DESTDIR}/usr/lib/${MLIBDIR:D${MLIBDIR}/}crtn.o
67e7f0a978Schristos.MADE: ${LIBCRTEND}
689d602b9cSpk.endif
69efcc9a4cSlukem_SHLINKER=	${SHLINKDIR}/ld.elf_so
70985170dbSthorpej
719d602b9cSpk.ifndef LIBCRT0
726811dc67SmattLIBCRT0=	${DESTDIR}/usr/lib/${MLIBDIR:D${MLIBDIR}/}crt0.o
73e7f0a978Schristos.MADE: ${LIBCRT0}
749d602b9cSpk.endif
7508d3e70eSross
76d0f0da0fSjoerg.ifndef LIBCRTI
776811dc67SmattLIBCRTI=	${DESTDIR}/usr/lib/${MLIBDIR:D${MLIBDIR}/}crti.o
78d0f0da0fSjoerg.MADE: ${LIBCRTI}
79d0f0da0fSjoerg.endif
80d0f0da0fSjoerg
81a606b4afSlukem##### Installed system library definitions
82a606b4afSlukem#
83a606b4afSlukem#	E.g.
84a606b4afSlukem#		LIBC?=${DESTDIR}/usr/lib/libc.a
856f734b82Smrg#		LIBX11?=${DESTDIR}/usr/X11R7/lib/libX11.a
86a606b4afSlukem#	etc..
87fa86ae90Schristos#	NB:	If you are a library here, add it in bsd.README
88a606b4afSlukem
899b2c7d65Schristos_LIBLIST=\
90c4fb05f7Schristos	archive \
91c4fb05f7Schristos	asn1 \
92fa86ae90Schristos	atf_c \
93fa86ae90Schristos	atf_cxx \
94c4fb05f7Schristos	bind9 \
952f0bfbf3Schristos	blocklist \
96c4fb05f7Schristos	bluetooth \
97c4fb05f7Schristos	bsdmalloc \
98c4fb05f7Schristos	bz2 \
99c4fb05f7Schristos	c \
100c4fb05f7Schristos	c_pic \
1017acab15bSchristos	cbor \
102c4fb05f7Schristos	com_err \
103c4fb05f7Schristos	compat \
104c4fb05f7Schristos	crypt \
105c4fb05f7Schristos	crypto \
106c4fb05f7Schristos	curses \
1070b097c4bSrin	cxx \
108c4fb05f7Schristos	des \
109c4fb05f7Schristos	dns \
110c4fb05f7Schristos	edit \
111c4fb05f7Schristos	event \
1129b2c7d65Schristos	event_openssl \
1139b2c7d65Schristos	event_pthreads \
1140bc53a58Sjoerg	execinfo \
1159b2c7d65Schristos	expat \
116c4fb05f7Schristos	fetch \
117c4fb05f7Schristos	fl \
1187acab15bSchristos	fido2 \
119c4fb05f7Schristos	form \
120c4fb05f7Schristos	gcc \
1210916a772Schristos	gnuctf \
122c4fb05f7Schristos	gnumalloc \
123c4fb05f7Schristos	gssapi \
124c4fb05f7Schristos	hdb \
125c4fb05f7Schristos	heimbase \
126c4fb05f7Schristos	heimntlm \
127c4fb05f7Schristos	hx509 \
128c4fb05f7Schristos	intl \
129c4fb05f7Schristos	ipsec \
130c4fb05f7Schristos	isc \
131c4fb05f7Schristos	isccc \
132c4fb05f7Schristos	isccfg \
133c4fb05f7Schristos	kadm5clnt \
134c4fb05f7Schristos	kadm5srv \
135c4fb05f7Schristos	kafs \
136c4fb05f7Schristos	krb5 \
137c4fb05f7Schristos	kvm \
138c4fb05f7Schristos	l \
139c4fb05f7Schristos	lber \
140c4fb05f7Schristos	ldap \
141c4fb05f7Schristos	ldap_r \
142c4fb05f7Schristos	lua \
143c4fb05f7Schristos	m \
144c4fb05f7Schristos	magic \
145c4fb05f7Schristos	menu \
1466a14b8a2Sjoerg	netpgpverify \
1479b2c7d65Schristos	ns \
148c4fb05f7Schristos	objc \
149c4fb05f7Schristos	ossaudio \
1509b2c7d65Schristos	panel \
151c4fb05f7Schristos	pam \
152c4fb05f7Schristos	pcap \
153c4fb05f7Schristos	pci \
154c4fb05f7Schristos	posix \
155c4fb05f7Schristos	pthread \
156c4fb05f7Schristos	puffs \
157c4fb05f7Schristos	quota \
158c4fb05f7Schristos	radius \
1599b2c7d65Schristos	refuse \
160c4fb05f7Schristos	resolv \
161c4fb05f7Schristos	rmt \
162c4fb05f7Schristos	roken \
163c4fb05f7Schristos	rpcsvc \
164c4fb05f7Schristos	rt \
165c4fb05f7Schristos	rump \
1664d3961b8Schristos	rumpfs_cd9660 \
167c4fb05f7Schristos	rumpfs_efs \
168c4fb05f7Schristos	rumpfs_ext2fs \
169c4fb05f7Schristos	rumpfs_ffs \
170c4fb05f7Schristos	rumpfs_hfs \
171c4fb05f7Schristos	rumpfs_lfs \
1724d3961b8Schristos	rumpfs_msdos \
173c4fb05f7Schristos	rumpfs_nfs \
174c4fb05f7Schristos	rumpfs_ntfs \
175c4fb05f7Schristos	rumpfs_syspuffs \
176c4fb05f7Schristos	rumpfs_tmpfs \
177c4fb05f7Schristos	rumpfs_udf \
178c4fb05f7Schristos	rumpuser \
179c4fb05f7Schristos	saslc \
180c4fb05f7Schristos	skey \
181c4fb05f7Schristos	sl \
182c4fb05f7Schristos	sqlite3 \
183c4fb05f7Schristos	ssh \
184c4fb05f7Schristos	ssl \
1859b2c7d65Schristos	stdc++ \
1869b2c7d65Schristos	supc++ \
187c4fb05f7Schristos	terminfo \
18850a5b513Schristos	tre \
189c90b9921Schristos	unbound \
190c4fb05f7Schristos	usbhid \
191c4fb05f7Schristos	util \
192c4fb05f7Schristos	wind \
193c4fb05f7Schristos	wrap \
194c4fb05f7Schristos	y \
1953ade096cSchristos	z
1969b2c7d65Schristos
1979b2c7d65Schristos.for _lib in ${_LIBLIST}
198a606b4afSlukem.ifndef LIB${_lib:tu}
199fa86ae90SchristosLIB${_lib:tu}=	${DESTDIR}/usr/lib/lib${_lib:S/xx/++/:S/atf_c/atf-c/}.a
200a606b4afSlukem.MADE:		${LIB${_lib:tu}}	# Note: ${DESTDIR} will be expanded
201a606b4afSlukem.endif
202a606b4afSlukem.endfor
203fa86ae90Schristos
2042e193233Smrg.if (${MKKERBEROS} != "no")
205e9be03e6Schristos# Kerberos5 applications
206e9be03e6SchristosLIBKRB5_LDADD+= -lkrb5 -lcom_err \
207a4770732Schristos	-lhx509 -lcrypto -lasn1 \
208a4770732Schristos	-lwind -lheimbase -lcom_err -lroken \
209fa838d7cSriastradh	-lcrypt -lutil
210e9be03e6SchristosLIBKRB5_DPADD+= ${LIBKRB5} ${LIBCOM_ERR} \
211a4770732Schristos	${LIBHX509} ${LIBCRYPTO} ${LIBASN1} \
212a4770732Schristos	${LIBWIND} ${LIBHEIMBASE} ${LIBCOM_ERR} ${LIBROKEN} \
213fa838d7cSriastradh	${LIBCRYPT} ${LIBUTIL}
2149aa9806aSchristosLIBGSSAPI_LDADD+= -lgssapi -lheimntlm ${LIBKRB5_LDADD}
2159aa9806aSchristosLIBGSSAPI_DPADD+= ${LIBGSSAPI} ${LIBHEIMNTLM} ${LIBKRB5_DPADD}
2162e193233Smrg.endif
2172e193233Smrg
2187377d9deSchristos.if (${MKLDAP} != "no")
2199aa9806aSchristosLIBLDAP_LDADD+= -lldap -llber ${LIBGSSAPI_LDADD} -lssl -lcrypto
2209aa9806aSchristosLIBLDAP_DPADD+= ${LIBLDAP} ${LIBLBER} ${LIBGSSAPI_DPADD} ${LIBSSL} ${LIBCRYPTO}
2217377d9deSchristos.endif
2227377d9deSchristos
2238e8728c4She# PAM applications, if linked statically, need more libraries
2248e8728c4She.if (${MKPIC} == "no")
225a8243f1cSchristosPAM_STATIC_LDADD+= -lssh
226a8243f1cSchristosPAM_STATIC_DPADD+= ${LIBSSH}
227a8243f1cSchristos.if (${MKKERBEROS} != "no")
228ae7d1665ShePAM_STATIC_LDADD+= -lkafs -lkrb5 -lhx509 -lwind -lasn1 \
229a42fc114Snia	-lroken -lcom_err -lheimbase -lcrypto -lsqlite3 -lm
230ae7d1665ShePAM_STATIC_DPADD+= ${LIBKAFS} ${LIBKRB5} ${LIBHX509} ${LIBWIND} ${LIBASN1} \
2315d507f2dSmartin	${LIBROKEN} ${LIBCOM_ERR} ${LIBHEIMBASE} ${LIBCRYPTO} ${LIBSQLITE3} \
232a42fc114Snia	${LIBM}
233a8243f1cSchristos.endif
234a8243f1cSchristos.if (${MKSKEY} != "no")
235a8243f1cSchristosPAM_STATIC_LDADD+= -lskey
236a8243f1cSchristosPAM_STATIC_DPADD+= ${LIBSKEY}
237a8243f1cSchristos.endif
238a8243f1cSchristosPAM_STATIC_LDADD+= -lradius -lcrypt -lrpcsvc -lutil
239a8243f1cSchristosPAM_STATIC_DPADD+= ${LIBRADIUS} ${LIBCRYPT} ${LIBRPCSVC} ${LIBUTIL}
2408e8728c4She.else
2418e8728c4ShePAM_STATIC_LDADD=
2428e8728c4ShePAM_STATIC_DPADD=
2438e8728c4She.endif
2448e8728c4She
245fa86ae90Schristos#	NB:	If you are a library here, add it in bsd.README
2469b5a96cdSchristos#	This list is sorted with -f so that it matches the order in bsd.README
247d966a326Schristos_X11LIBLIST= dps EGL fntstubs fontcache fontconfig fontenc freetype FS GL GLU \
248d966a326Schristos    GLw I810XvMC  ICE IntelXvMC lbxutil SM X11 X11_xcb Xres Xau Xau7 Xaw xcb \
249d966a326Schristos    Xcomposite Xcursor xcvt Xdamage Xdmcp Xext Xfixes Xfont Xfont2 Xft Xi \
2509b5a96cdSchristos    Xinerama xkbfile Xmu Xmuu Xpm Xrandr Xrender Xss Xt XTrap Xtst Xv Xxf86dga \
251d966a326Schristos    Xxf86misc Xxf86vm
2522fa41703Smrg_XCBLIBLIST= \
2532fa41703Smrg    atom aux composite damage dpms dri2 dri3 event glx icccm image keysyms \
2542fa41703Smrg    present property randr record render_util render reply res screensaver \
2552fa41703Smrg    shape shm sync xf86dri xfixes xinerama xinput xkb xtest xv xvmc
2562fa41703Smrg
2572fa41703Smrg# Ugly one-offs
2582fa41703SmrgLIBX11_XCB=	${DESTDIR}${X11USRLIBDIR}/libX11-xcb.a
2592fa41703SmrgLIBXCB=	${DESTDIR}${X11USRLIBDIR}/libxcb.a
2609b5a96cdSchristos
2619b5a96cdSchristos.for _lib in ${_X11LIBLIST}
262a606b4afSlukem.ifndef LIB${_lib:tu}
26344c3e543SrtrLIB${_lib:tu}=	${DESTDIR}${X11USRLIBDIR}/lib${_lib}.a
264a606b4afSlukem.MADE:		${LIB${_lib:tu}}	# Note: ${DESTDIR} will be expanded
265a606b4afSlukem.endif
266a606b4afSlukem.endfor
267a606b4afSlukem
2682fa41703Smrg# These ones have "_" in the variable name and "-" in the path.
2692fa41703Smrg.for _lib in ${_XCBLIBLIST}
2702fa41703Smrg.ifndef LIBXCB_${_lib:tu}
2712fa41703SmrgLIBXCB_${_lib:tu}=	${DESTDIR}${X11USRLIBDIR}/libxcb-${_lib}.a
2722fa41703Smrg.MADE:		${LIBXCB_${_lib:tu}}	# Note: ${DESTDIR} will be expanded
2732fa41703Smrg.endif
2742fa41703Smrg.endfor
275f8cebe2aSmrg
276aa8cb2a4Slukem.if defined(RESCUEDIR)
277aa8cb2a4SlukemCPPFLAGS+=	-DRESCUEDIR=\"${RESCUEDIR}\"
278aa8cb2a4Slukem.endif
279aa8cb2a4Slukem
280efcc9a4cSlukem_PROGLDOPTS=
281efcc9a4cSlukem.if ${SHLINKDIR} != "/usr/libexec"	# XXX: change or remove if ld.so moves
282efcc9a4cSlukem_PROGLDOPTS+=	-Wl,-dynamic-linker=${_SHLINKER}
283efcc9a4cSlukem.endif
284e71fc1ccSlukem.if ${SHLIBDIR} != "/usr/lib"
2855e3fd2e0Sjoerg_PROGLDOPTS+=	-Wl,-rpath,${SHLIBDIR} \
286c28ff146Sjoerg		-L=${SHLIBDIR}
287067600c8Sjoerg.elif ${SHLIBINSTALLDIR} != "/usr/lib"
288067600c8Sjoerg_PROGLDOPTS+=	-Wl,-rpath-link,${DESTDIR}${SHLIBINSTALLDIR} \
289067600c8Sjoerg		-L=${SHLIBINSTALLDIR}
290efcc9a4cSlukem.endif
291efcc9a4cSlukem
292b124cdf1Smycroft__proginstall: .USE
293130ab733Slukem	${_MKTARGET_INSTALL}
2940812154eStv	${INSTALL_FILE} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \
2958bc0f5daSjwise		${STRIPFLAG} ${.ALLSRC} ${.TARGET}
296b124cdf1Smycroft
29784d9317cSpooka__progrumpinstall: .USE
29884d9317cSpooka	${_MKTARGET_INSTALL}
29984d9317cSpooka	${INSTALL_FILE} -o ${RUMPBINOWN} -g ${RUMPBINGRP} -m ${RUMPBINMODE} \
30084d9317cSpooka		${STRIPFLAG} ${.ALLSRC} ${.TARGET}
30184d9317cSpooka
302cacf5bfaSlukem__progdebuginstall: .USE
303cacf5bfaSlukem	${_MKTARGET_INSTALL}
304cacf5bfaSlukem	${INSTALL_FILE} -o ${DEBUGOWN} -g ${DEBUGGRP} -m ${DEBUGMODE} \
305cacf5bfaSlukem		${.ALLSRC} ${.TARGET}
306cacf5bfaSlukem
30712408017Sjmmv
30812408017Sjmmv
30912408017Sjmmv#
31012408017Sjmmv# Backwards compatibility with Makefiles that assume that bsd.prog.mk
31112408017Sjmmv# can only build a single binary.
31212408017Sjmmv#
31312408017Sjmmv
31412408017Sjmmv_APPEND_MANS=yes
31512408017Sjmmv_APPEND_SRCS=yes
31612408017Sjmmv
3176cedae18Slukem_CCLINKFLAGS=
3186cedae18Slukem
31912408017Sjmmv.if defined(PROG_CXX)
32012408017SjmmvPROG=		${PROG_CXX}
3216cedae18Slukem_CCLINK=	${CXX} ${_CCLINKFLAGS}
32212408017Sjmmv.endif
32312408017Sjmmv
32484d9317cSpooka.if defined(RUMPPRG)
325ffeb8dbfSchristosCPPFLAGS+=	-D_KERNTYPES
32684d9317cSpookaPROG=			${RUMPPRG}
32743673c5eSpooka. ifndef CRUNCHEDPROG
328eda981fcSchristos.  if (${MKRUMP} != "no")
32984d9317cSpookaPROGS=			${RUMPPRG} rump.${RUMPPRG}
330eda981fcSchristos.  else
331eda981fcSchristosPROGS=			${RUMPPRG}
332eda981fcSchristos.  endif
33384d9317cSpooka.  if defined(SRCS)
334eda981fcSchristos.   if (${MKRUMP} != "no")
33584d9317cSpookaSRCS.rump.${PROG}:=	${SRCS} ${PROG}_rumpops.c ${RUMPSRCS}
336eda981fcSchristos.   endif
33784d9317cSpookaSRCS+=			${PROG}_hostops.c
33884d9317cSpooka.  else
33984d9317cSpookaSRCS=			${PROG}.c ${PROG}_hostops.c
340eda981fcSchristos.   if (${MKRUMP} != "no")
34184d9317cSpookaSRCS.rump.${PROG}=	${PROG}.c ${PROG}_rumpops.c ${RUMPSRCS}
34284d9317cSpooka.   endif
343eda981fcSchristos.  endif
344eda981fcSchristos.   if (${MKRUMP} != "no")
34514c8789bSpookaDPSRCS+=		${PROG}_rumpops.c ${RUMPSRCS}
346e480d58dSchristosLDADD.rump.${PROG}+=	${LDADD.rump} -lrumpclient
347e480d58dSchristosDPADD.rump.${PROG}+=	${DPADD.rump} ${LIBRUMPCLIENT}
34884d9317cSpookaMAN.rump.${PROG}=	# defined but feeling empty
34984d9317cSpooka_RUMPINSTALL.rump.${PROG}=# defined
350eda981fcSchristos.   endif
35143673c5eSpooka. else # CRUNCHEDPROG
35243673c5eSpookaPROGS=			${PROG}
35343673c5eSpookaCPPFLAGS+=		-DCRUNCHOPS
35443673c5eSpooka. endif
35584d9317cSpooka.endif
35684d9317cSpooka
35712408017Sjmmv.if defined(PROG)
3586cedae18Slukem_CCLINK?=	${CC} ${_CCLINKFLAGS}
35912408017Sjmmv.  if defined(MAN)
36012408017SjmmvMAN.${PROG}=	${MAN}
36112408017Sjmmv_APPEND_MANS=	no
36212408017Sjmmv.  endif
36312408017Sjmmv.  if !defined(OBJS)
36412408017SjmmvOBJS=		${OBJS.${PROG}}
36512408017Sjmmv.  endif
36612408017Sjmmv.  if defined(PROGNAME)
36712408017SjmmvPROGNAME.${PROG}=	${PROGNAME}
36812408017Sjmmv.  endif
36912408017Sjmmv.  if defined(SRCS)
37012408017SjmmvSRCS.${PROG}=	${SRCS}
37112408017Sjmmv_APPEND_SRCS=	no
37212408017Sjmmv.  endif
37312408017Sjmmv.endif
37412408017Sjmmv
37512408017Sjmmv# Turn the single-program PROG and PROG_CXX variables into their multi-word
37612408017Sjmmv# counterparts, PROGS and PROGS_CXX.
37784d9317cSpooka.if !defined(RUMPPRG)
37812408017Sjmmv.  if defined(PROG_CXX) && !defined(PROGS_CXX)
37912408017SjmmvPROGS_CXX=	${PROG_CXX}
3808de5cd33Sjmmv.  elif defined(PROG) && !defined(PROGS)
38112408017SjmmvPROGS=		${PROG}
38212408017Sjmmv.  endif
38384d9317cSpooka.endif
38412408017Sjmmv
3854880aaedSchristos##### Libraries that this may depend upon.
3864880aaedSchristos.if defined(PROGDPLIBS) 						# {
3874880aaedSchristos.  for _lib _dir in ${PROGDPLIBS}
3889f8fb6acSriastradh.    if !defined(LIBDO.${_lib})
3899f8fb6acSriastradhLIBDO.${_lib}!=	cd "${_dir}" && ${PRINTOBJDIR}
3909f8fb6acSriastradh.MAKEOVERRIDES+=LIBDO.${_lib}
3914880aaedSchristos.    endif
39279f27b9dSchristos.    if defined(PROGDPLIBSSTATIC)
3939f8fb6acSriastradhDPADD+=		${LIBDO.${_lib}}/lib${_lib}.a
3949f8fb6acSriastradhLDADD+=		${LIBDO.${_lib}}/lib${_lib}.a
39579f27b9dSchristos.    else
3969f8fb6acSriastradhLDADD+=		-L${LIBDO.${_lib}} -l${_lib}
3979f8fb6acSriastradh.      if exists(${LIBDO.${_lib}}/lib${_lib}_pic.a)
3989f8fb6acSriastradhDPADD+=		${LIBDO.${_lib}}/lib${_lib}_pic.a
3999f8fb6acSriastradh.      elif exists(${LIBDO.${_lib}}/lib${_lib}.so)
4009f8fb6acSriastradhDPADD+=		${LIBDO.${_lib}}/lib${_lib}.so
4014880aaedSchristos.      else
4029f8fb6acSriastradhDPADD+=		${LIBDO.${_lib}}/lib${_lib}.a
4034880aaedSchristos.      endif
40479f27b9dSchristos.    endif
4054880aaedSchristos.  endfor
4064880aaedSchristos.endif									# }
4077743e8c9Schristos
4087743e8c9SchristosLDADD+=${LDADD_AFTER}
4097743e8c9SchristosDPADD+=${DPADD_AFTER}
4107743e8c9Schristos
41112408017Sjmmv#
41212408017Sjmmv# Per-program definitions and targets.
41312408017Sjmmv#
41412408017Sjmmv
41547c982a3Smatt_CCLINK.CDEFAULT= ${CC} ${_CCLINKFLAGS}
41612408017Sjmmv# Definitions specific to C programs.
41712408017Sjmmv.for _P in ${PROGS}
41812408017SjmmvSRCS.${_P}?=	${_P}.c
4196cedae18Slukem_CCLINK.${_P}=	${CC} ${_CCLINKFLAGS}
42047c982a3Smatt_CFLAGS.${_P}=	${CFLAGS} ${CPUFLAGS}
42147c982a3Smatt_CPPFLAGS.${_P}=	${CPPFLAGS}
42247c982a3Smatt_COPTS.${_P}=	${COPTS}
42312408017Sjmmv.endfor
42412408017Sjmmv
42547c982a3Smatt_CCLINK.CXXDEFAULT= ${CXX} ${_CCLINKFLAGS}
42612408017Sjmmv# Definitions specific to C++ programs.
42712408017Sjmmv.for _P in ${PROGS_CXX}
42812408017SjmmvSRCS.${_P}?=	${_P}.cc
4296cedae18Slukem_CCLINK.${_P}=	${CXX} ${_CCLINKFLAGS}
43012408017Sjmmv.endfor
43112408017Sjmmv
43212408017Sjmmv# Language-independent definitions.
43312408017Sjmmv.for _P in ${PROGS} ${PROGS_CXX}					# {
43412408017Sjmmv
43512408017SjmmvBINDIR.${_P}?=		${BINDIR}
43612408017SjmmvPROGNAME.${_P}?=	${_P}
43712408017Sjmmv
4380c050843Schristos.if ${MKDEBUG:Uno} != "no" && !defined(NODEBUG) && !commands(${_P}) && \
439c7928288Schristos    empty(SRCS.${_P}:M*.sh)
44012408017Sjmmv_PROGDEBUG.${_P}:=	${PROGNAME.${_P}}.debug
44112408017Sjmmv.endif
44212408017Sjmmv
44392253c77Skamil# paxctl specific arguments
44492253c77Skamil
44512408017Sjmmv.if defined(PAXCTL_FLAGS)
44612408017SjmmvPAXCTL_FLAGS.${_P}?= ${PAXCTL_FLAGS}
44712408017Sjmmv.endif
44812408017Sjmmv
44992253c77Skamil.if ${MKSANITIZER:Uno} == "yes" && \
45092253c77Skamil	(${USE_SANITIZER} == "address" || ${USE_SANITIZER} == "thread" || \
45192253c77Skamil	${USE_SANITIZER} == "memory")
45292253c77SkamilPAXCTL_FLAGS.${_P}= +a
45392253c77Skamil.endif
45492253c77Skamil
45512408017Sjmmv##### PROG specific flags.
45612408017Sjmmv
457fcb81e1fSjmmv_DPADD.${_P}=		${DPADD}    ${DPADD.${_P}}
45812408017Sjmmv_LDADD.${_P}=		${LDADD}    ${LDADD.${_P}}
45912408017Sjmmv_LDFLAGS.${_P}=		${LDFLAGS}  ${LDFLAGS.${_P}}
460d0972049Schristos.if ${MKSANITIZER} != "yes"
461d0972049Schristos# Sanitizers don't support static build.
46212408017Sjmmv_LDSTATIC.${_P}=	${LDSTATIC} ${LDSTATIC.${_P}}
463d0972049Schristos.endif
46412408017Sjmmv
46512408017Sjmmv##### Build and install rules
46612408017Sjmmv.if !empty(_APPEND_SRCS:M[Yy][Ee][Ss])
46712408017SjmmvSRCS+=		${SRCS.${_P}}	# For bsd.dep.mk
46812408017Sjmmv.endif
46912408017Sjmmv
47012408017Sjmmv_YPSRCS.${_P}=	${SRCS.${_P}:M*.[ly]:C/\..$/.c/} ${YHEADER:D${SRCS.${_P}:M*.y:.y=.h}}
47112408017Sjmmv
47212408017SjmmvDPSRCS+=		${_YPSRCS.${_P}}
47312408017SjmmvCLEANFILES+=		${_YPSRCS.${_P}}
47412408017Sjmmv
47512408017Sjmmv.if !empty(SRCS.${_P}:N*.h:N*.sh:N*.fth)
47612408017SjmmvOBJS.${_P}+=	${SRCS.${_P}:N*.h:N*.sh:N*.fth:R:S/$/.o/g}
47712408017SjmmvLOBJS.${_P}+=	${LSRCS:.c=.ln} ${SRCS.${_P}:M*.c:.c=.ln}
47812408017Sjmmv.endif
47912408017Sjmmv
48012408017Sjmmv.if defined(OBJS.${_P}) && !empty(OBJS.${_P})			# {
48112408017Sjmmv.NOPATH: ${OBJS.${_P}} ${_P} ${_YPSRCS.${_P}}
48212408017Sjmmv
48312408017Sjmmv${OBJS.${_P}} ${LOBJS.${_P}}: ${DPSRCS}
48412408017Sjmmv
485d0f0da0fSjoerg${_P}: .gdbinit ${LIBCRT0} ${LIBCRTI} ${OBJS.${_P}} ${LIBC} ${LIBCRTBEGIN} \
486d0f0da0fSjoerg    ${LIBCRTEND} ${_DPADD.${_P}}
48712408017Sjmmv.if !commands(${_P})
48812408017Sjmmv	${_MKTARGET_LINK}
4896cedae18Slukem	${_CCLINK.${_P}} \
4909614d5d9Slukem	    ${_LDFLAGS.${_P}} ${_LDSTATIC.${_P}} -o ${.TARGET} \
49107a6c807Schristos	    ${OBJS.${_P}} ${_PROGLDOPTS} ${_LDADD.${_P}}
49261fb3737Sdarran.if defined(CTFMERGE)
49361fb3737Sdarran	${CTFMERGE} ${CTFMFLAGS} -o ${.TARGET} ${OBJS.${_P}}
49461fb3737Sdarran.endif
49512408017Sjmmv.if defined(PAXCTL_FLAGS.${_P})
49612408017Sjmmv	${PAXCTL} ${PAXCTL_FLAGS.${_P}} ${.TARGET}
49712408017Sjmmv.endif
4985af38558Sjoerg.if ${MKSTRIPIDENT} != "no"
4995af38558Sjoerg	${OBJCOPY} -R .ident ${.TARGET}
5005af38558Sjoerg.endif
50112408017Sjmmv.endif	# !commands(${_P})
50212408017Sjmmv
503fcb81e1fSjmmv${_P}.ro: ${OBJS.${_P}} ${_DPADD.${_P}}
50412408017Sjmmv	${_MKTARGET_LINK}
505cb4d6b86Smartin	${CC} ${LDFLAGS:N-pie} -nostdlib -r -Wl,-dc -o ${.TARGET} ${OBJS.${_P}}
50612408017Sjmmv
50712408017Sjmmv.if defined(_PROGDEBUG.${_P})
508ac0bd149Sjmmv${_PROGDEBUG.${_P}}: ${_P}
50912408017Sjmmv	${_MKTARGET_CREATE}
510b1d1e928Smrg	( ${OBJCOPY} --only-keep-debug --compress-debug-sections \
511b1d1e928Smrg	    ${_P} ${_PROGDEBUG.${_P}} && \
512b1d1e928Smrg	  ${OBJCOPY} --strip-debug -p -R .gnu_debuglink \
51344f36b23Slukem		--add-gnu-debuglink=${_PROGDEBUG.${_P}} ${_P} \
51444f36b23Slukem	) || (rm -f ${_PROGDEBUG.${_P}}; false)
51512408017Sjmmv.endif
51612408017Sjmmv
51712408017Sjmmv.endif	# defined(OBJS.${_P}) && !empty(OBJS.${_P})			# }
51812408017Sjmmv
51912408017Sjmmv.if !defined(MAN.${_P})
52012408017SjmmvMAN.${_P}=	${_P}.1
52112408017Sjmmv.endif	# !defined(MAN.${_P})
52212408017Sjmmv.if !empty(_APPEND_MANS:M[Yy][Ee][Ss])
52312408017SjmmvMAN+=		${MAN.${_P}}
52412408017Sjmmv.endif
52512408017Sjmmv
52612408017Sjmmvrealall: ${_P} ${_PROGDEBUG.${_P}}
52712408017Sjmmv
528386a389aSapbCLEANFILES+= ${_P} ${_PROGDEBUG.${_P}}
52912408017Sjmmv
53012408017Sjmmv.if defined(OBJS.${_P}) && !empty(OBJS.${_P})
531386a389aSapbCLEANFILES+= ${OBJS.${_P}} ${LOBJS.${_P}}
53212408017Sjmmv.endif
53312408017Sjmmv
53412408017Sjmmv_PROG_INSTALL+=	proginstall-${_P}
53512408017Sjmmv
53612408017Sjmmv.if !target(proginstall-${_P})						# {
53712408017Sjmmvproginstall-${_P}::	${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}} \
53812408017Sjmmv		${_PROGDEBUG.${_P}:D${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}}
53912408017Sjmmv.PRECIOUS:	${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}} \
54012408017Sjmmv		${_PROGDEBUG.${_P}:D${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}}
54112408017Sjmmv
542f134f3dcSlukem.if ${MKUPDATE} == "no"
54384d9317cSpooka.if defined(_RUMPINSTALL.${_P})
54484d9317cSpooka${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}! ${_P} __progrumpinstall
54584d9317cSpooka.else
54612408017Sjmmv${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}! ${_P} __proginstall
54784d9317cSpooka.endif
54812408017Sjmmv.if !defined(BUILD) && !make(all) && !make(${_P})
54912408017Sjmmv${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}! .MADE
55009819b05Smycroft.endif
55112408017Sjmmv.if defined(_PROGDEBUG.${_P})
55212408017Sjmmv${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}! ${_PROGDEBUG.${_P}} __progdebuginstall
55312408017Sjmmv.if !defined(BUILD) && !make(all) && !make(${_P})
55412408017Sjmmv${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}! .MADE
555cacf5bfaSlukem.endif
55612408017Sjmmv.endif	#  define(_PROGDEBUG.${_P})
557cacf5bfaSlukem.else	# MKUPDATE != no
55884d9317cSpooka.if defined(_RUMPINSTALL.${_P})
55984d9317cSpooka${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}: ${_P} __progrumpinstall
56084d9317cSpooka.else
56112408017Sjmmv${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}: ${_P} __proginstall
56284d9317cSpooka.endif
56312408017Sjmmv.if !defined(BUILD) && !make(all) && !make(${_P})
56412408017Sjmmv${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}: .MADE
56525f6ec74Schristos.endif
56612408017Sjmmv.if defined(_PROGDEBUG.${_P})
56712408017Sjmmv${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}: ${_PROGDEBUG.${_P}} __progdebuginstall
56812408017Sjmmv.if !defined(BUILD) && !make(all) && !make(${_P})
56912408017Sjmmv${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}: .MADE
57009819b05Smycroft.endif
57112408017Sjmmv.endif	#  defined(_PROGDEBUG.${_P})
572cacf5bfaSlukem.endif	# MKUPDATE != no
573cacf5bfaSlukem
57412408017Sjmmv.endif	# !target(proginstall-${_P})					# }
57512408017Sjmmv
57612408017Sjmmvlint: lint-${_P}
57712408017Sjmmvlint-${_P}: ${LOBJS.${_P}}
57812408017Sjmmv.if defined(LOBJS.${_P}) && !empty(LOBJS.${_P})
579c207dc67Schristos.if defined(DESTDIR)
580c207dc67Schristos	${LINT} ${LINTFLAGS} ${_LDFLAGS.${_P}:C/-L[  ]*/-L/Wg:M-L*} -L${DESTDIR}/usr/libdata/lint ${LOBJS.${_P}} ${_LDADD.${_P}}
581c207dc67Schristos.else
58212408017Sjmmv	${LINT} ${LINTFLAGS} ${_LDFLAGS.${_P}:C/-L[  ]*/-L/Wg:M-L*} ${LOBJS.${_P}} ${_LDADD.${_P}}
58312408017Sjmmv.endif
584c207dc67Schristos.endif
58512408017Sjmmv
58612408017Sjmmv.endfor # _P in ${PROGS} ${PROGS_CXX}					# }
58728e6c71eSmycroft
5880287baacSjmmv.if defined(OBJS) && !empty(OBJS) && \
5890287baacSjmmv    (empty(PROGS) && empty(PROGS_CXX))
590386a389aSapbCLEANFILES+= ${OBJS} ${LOBJS}
5910287baacSjmmv.endif
5920287baacSjmmv
593bb8827f7Smycroft.if !target(proginstall)
59412408017Sjmmvproginstall:: ${_PROG_INSTALL}
595bb8827f7Smycroft.endif
59684a47486Slukem.PHONY:		proginstall
597bb8827f7Smycroft
59812408017Sjmmv
59912408017Sjmmv
60012408017Sjmmvrealall: ${SCRIPTS}
601cacf5bfaSlukem.if defined(SCRIPTS) && !target(scriptsinstall)				# {
6025fa188a2SmycroftSCRIPTSDIR?=${BINDIR}
6035fa188a2SmycroftSCRIPTSOWN?=${BINOWN}
6045fa188a2SmycroftSCRIPTSGRP?=${BINGRP}
6055fa188a2SmycroftSCRIPTSMODE?=${BINMODE}
60625f6ec74Schristos
60734e1bda4Smycroftscriptsinstall:: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@}
608befa5650Smycroft.PRECIOUS: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@}
60934e1bda4Smycroft
610b124cdf1Smycroft__scriptinstall: .USE
611130ab733Slukem	${_MKTARGET_INSTALL}
6120812154eStv	${INSTALL_FILE} \
613750b27b8Smycroft	    -o ${SCRIPTSOWN_${.ALLSRC:T}:U${SCRIPTSOWN}} \
614750b27b8Smycroft	    -g ${SCRIPTSGRP_${.ALLSRC:T}:U${SCRIPTSGRP}} \
615750b27b8Smycroft	    -m ${SCRIPTSMODE_${.ALLSRC:T}:U${SCRIPTSMODE}} \
6168bc0f5daSjwise	    ${.ALLSRC} ${.TARGET}
617b124cdf1Smycroft
618263f3e58Ssommerfeld.for S in ${SCRIPTS:O:u}
619f134f3dcSlukem.if ${MKUPDATE} == "no"
62009819b05Smycroft${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! ${S} __scriptinstall
62109819b05Smycroft.if !defined(BUILD) && !make(all) && !make(${S})
62209819b05Smycroft${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! .MADE
62309819b05Smycroft.endif
62409819b05Smycroft.else
62509819b05Smycroft${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: ${S} __scriptinstall
62634e1bda4Smycroft.if !defined(BUILD) && !make(all) && !make(${S})
62734e1bda4Smycroft${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: .MADE
62834e1bda4Smycroft.endif
62909819b05Smycroft.endif
63025f6ec74Schristos.endfor
631cacf5bfaSlukem.endif									# }
63225f6ec74Schristos
633bb8827f7Smycroft.if !target(scriptsinstall)
634bb8827f7Smycroftscriptsinstall::
63561f28255Scgd.endif
63684a47486Slukem.PHONY:		scriptsinstall
63761f28255Scgd
6381129ed4aStv##### Pull in related .mk logic
63991fe922fSapbLINKSOWN?= ${BINOWN}
64091fe922fSapbLINKSGRP?= ${BINGRP}
64191fe922fSapbLINKSMODE?= ${BINMODE}
64261f28255Scgd.include <bsd.man.mk>
643e3c663ebSjtc.include <bsd.nls.mk>
644cef52070Schristos.include <bsd.files.mk>
64525f6ec74Schristos.include <bsd.inc.mk>
646a9b9dbd4Smycroft.include <bsd.links.mk>
64770174eb6Schristos.include <bsd.sys.mk>
648a504cd29Slukem.include <bsd.dep.mk>
649ba5a5a11Sjoerg.include <bsd.clang-analyze.mk>
650386a389aSapb.include <bsd.clean.mk>
65133bcabe9Scube
6521129ed4aStv${TARGETS}:	# ensure existence
65303a26b2cSlukem
65403a26b2cSlukem.endif	# HOSTPROG
655