xref: /netbsd/share/mk/bsd.prog.mk (revision 5979cdb2)
1#	$NetBSD: bsd.prog.mk,v 1.345 2023/05/28 10:33:13 lukem Exp $
2#	@(#)bsd.prog.mk	8.2 (Berkeley) 4/2/94
3
4.ifndef HOSTPROG
5
6.include <bsd.init.mk>
7.include <bsd.shlib.mk>
8.include <bsd.gcc.mk>
9.include <bsd.sanitizer.mk>
10
11##### Sanitizer specific flags.
12
13CFLAGS+=	${SANITIZERFLAGS} ${LIBCSANITIZERFLAGS}
14CXXFLAGS+=	${SANITIZERFLAGS} ${LIBCSANITIZERFLAGS}
15LDFLAGS+=	${SANITIZERFLAGS}
16
17#
18# Definitions and targets shared among all programs built by a single
19# Makefile.
20#
21
22##### Basic targets
23realinstall:	proginstall scriptsinstall
24
25.gdbinit:
26	rm -f .gdbinit
27.if defined(DESTDIR) && !empty(DESTDIR)
28	echo "set solib-absolute-prefix ${DESTDIR}" > .gdbinit
29.else
30	touch .gdbinit
31.endif
32.for __gdbinit in ${GDBINIT}
33	echo "source ${__gdbinit}" >> .gdbinit
34.endfor
35
36CLEANFILES+= a.out [Ee]rrs mklog core *.core .gdbinit
37
38.if defined(MKPIE) && (${MKPIE} != "no") && !defined(NOPIE)
39CFLAGS+=	${PIE_CFLAGS}
40AFLAGS+=	${PIE_AFLAGS}
41LDFLAGS+=	${"${LDSTATIC.${.TARGET}}" == "-static" :? : ${PIE_LDFLAGS}}
42.endif
43
44CFLAGS+=	${COPTS}
45.if ${MKDEBUG:Uno} != "no" && !defined(NODEBUG)
46CFLAGS+=	-g
47.endif
48OBJCFLAGS+=	${OBJCOPTS}
49MKDEP_SUFFIXES?=	.o .ln .d
50
51# CTF preserve debug symbols
52.if (${MKCTF:Uno} != "no") && (${CFLAGS:M-g} != "")
53CTFFLAGS+= -g
54CTFMFLAGS+= -g
55.if defined(HAVE_GCC)
56#CFLAGS+=-gdwarf-2
57.endif
58.endif
59
60# ELF platforms depend on crti.o, crtbegin.o, crtend.o, and crtn.o
61.ifndef LIBCRTBEGIN
62LIBCRTBEGIN=	${DESTDIR}/usr/lib/${MLIBDIR:D${MLIBDIR}/}crti.o ${_GCC_CRTBEGIN}
63.MADE: ${LIBCRTBEGIN}
64.endif
65.ifndef LIBCRTEND
66LIBCRTEND=	${_GCC_CRTEND} ${DESTDIR}/usr/lib/${MLIBDIR:D${MLIBDIR}/}crtn.o
67.MADE: ${LIBCRTEND}
68.endif
69_SHLINKER=	${SHLINKDIR}/ld.elf_so
70
71.ifndef LIBCRT0
72LIBCRT0=	${DESTDIR}/usr/lib/${MLIBDIR:D${MLIBDIR}/}crt0.o
73.MADE: ${LIBCRT0}
74.endif
75
76.ifndef LIBCRTI
77LIBCRTI=	${DESTDIR}/usr/lib/${MLIBDIR:D${MLIBDIR}/}crti.o
78.MADE: ${LIBCRTI}
79.endif
80
81##### Installed system library definitions
82#
83#	E.g.
84#		LIBC?=${DESTDIR}/usr/lib/libc.a
85#		LIBX11?=${DESTDIR}/usr/X11R7/lib/libX11.a
86#	etc..
87#	NB:	If you are a library here, add it in bsd.README
88
89_LIBLIST=\
90	archive \
91	asn1 \
92	atf_c \
93	atf_cxx \
94	bind9 \
95	blocklist \
96	bluetooth \
97	bsdmalloc \
98	bz2 \
99	c \
100	c_pic \
101	cbor \
102	com_err \
103	compat \
104	crypt \
105	crypto \
106	curses \
107	cxx \
108	des \
109	dns \
110	edit \
111	event \
112	event_openssl \
113	event_pthreads \
114	execinfo \
115	expat \
116	fetch \
117	fl \
118	fido2 \
119	form \
120	gcc \
121	gnuctf \
122	gnumalloc \
123	gssapi \
124	hdb \
125	heimbase \
126	heimntlm \
127	hx509 \
128	intl \
129	ipsec \
130	isc \
131	isccc \
132	isccfg \
133	kadm5clnt \
134	kadm5srv \
135	kafs \
136	krb5 \
137	kvm \
138	l \
139	lber \
140	ldap \
141	ldap_r \
142	lua \
143	m \
144	magic \
145	menu \
146	netpgpverify \
147	ns \
148	objc \
149	ossaudio \
150	panel \
151	pam \
152	pcap \
153	pci \
154	posix \
155	pthread \
156	puffs \
157	quota \
158	radius \
159	refuse \
160	resolv \
161	rmt \
162	roken \
163	rpcsvc \
164	rt \
165	rump \
166	rumpfs_cd9660 \
167	rumpfs_efs \
168	rumpfs_ext2fs \
169	rumpfs_ffs \
170	rumpfs_hfs \
171	rumpfs_lfs \
172	rumpfs_msdos \
173	rumpfs_nfs \
174	rumpfs_ntfs \
175	rumpfs_syspuffs \
176	rumpfs_tmpfs \
177	rumpfs_udf \
178	rumpuser \
179	saslc \
180	skey \
181	sl \
182	sqlite3 \
183	ssh \
184	ssl \
185	stdc++ \
186	supc++ \
187	terminfo \
188	tre \
189	unbound \
190	usbhid \
191	util \
192	wind \
193	wrap \
194	y \
195	z
196
197.for _lib in ${_LIBLIST}
198.ifndef LIB${_lib:tu}
199LIB${_lib:tu}=	${DESTDIR}/usr/lib/lib${_lib:S/xx/++/:S/atf_c/atf-c/}.a
200.MADE:		${LIB${_lib:tu}}	# Note: ${DESTDIR} will be expanded
201.endif
202.endfor
203
204.if (${MKKERBEROS} != "no")
205# Kerberos5 applications
206LIBKRB5_LDADD+= -lkrb5 -lcom_err \
207	-lhx509 -lcrypto -lasn1 \
208	-lwind -lheimbase -lcom_err -lroken \
209	-lsqlite3 -lm -lcrypt -lutil
210LIBKRB5_DPADD+= ${LIBKRB5} ${LIBCOM_ERR} \
211	${LIBHX509} ${LIBCRYPTO} ${LIBASN1} \
212	${LIBWIND} ${LIBHEIMBASE} ${LIBCOM_ERR} ${LIBROKEN} \
213	${LIBSQLITE3} ${LIBM} ${LIBCRYPT} ${LIBUTIL}
214LIBGSSAPI_LDADD+= -lgssapi -lheimntlm ${LIBKRB5_LDADD}
215LIBGSSAPI_DPADD+= ${LIBGSSAPI} ${LIBHEIMNTLM} ${LIBKRB5_DPADD}
216.endif
217
218.if (${MKLDAP} != "no")
219LIBLDAP_LDADD+= -lldap -llber ${LIBGSSAPI_LDADD} -lssl -lcrypto
220LIBLDAP_DPADD+= ${LIBLDAP} ${LIBLBER} ${LIBGSSAPI_DPADD} ${LIBSSL} ${LIBCRYPTO}
221.endif
222
223# PAM applications, if linked statically, need more libraries
224.if (${MKPIC} == "no")
225PAM_STATIC_LDADD+= -lssh
226PAM_STATIC_DPADD+= ${LIBSSH}
227.if (${MKKERBEROS} != "no")
228PAM_STATIC_LDADD+= -lkafs -lkrb5 -lhx509 -lwind -lasn1 \
229	-lroken -lcom_err -lheimbase -lcrypto -lsqlite3 -lm
230PAM_STATIC_DPADD+= ${LIBKAFS} ${LIBKRB5} ${LIBHX509} ${LIBWIND} ${LIBASN1} \
231	${LIBROKEN} ${LIBCOM_ERR} ${LIBHEIMBASE} ${LIBCRYPTO} ${LIBSQLITE3} \
232	${LIBM}
233.endif
234.if (${MKSKEY} != "no")
235PAM_STATIC_LDADD+= -lskey
236PAM_STATIC_DPADD+= ${LIBSKEY}
237.endif
238PAM_STATIC_LDADD+= -lradius -lcrypt -lrpcsvc -lutil
239PAM_STATIC_DPADD+= ${LIBRADIUS} ${LIBCRYPT} ${LIBRPCSVC} ${LIBUTIL}
240.else
241PAM_STATIC_LDADD=
242PAM_STATIC_DPADD=
243.endif
244
245#	NB:	If you are a library here, add it in bsd.README
246#	This list is sorted with -f so that it matches the order in bsd.README
247_X11LIBLIST= dps fntstubs fontcache fontconfig fontenc freetype FS GL GLU \
248    ICE lbxutil SM X11 X11_xcb Xau Xaw xcb xcvt Xdmcp Xext Xfont Xfont2 Xft Xi \
249    Xinerama xkbfile Xmu Xmuu Xpm Xrandr Xrender Xss Xt XTrap Xtst Xv Xxf86dga \
250    Xxf86misc Xxf86vm Xcomposite Xdamage Xfixes
251_XCBLIBLIST= \
252    atom aux composite damage dpms dri2 dri3 event glx icccm image keysyms \
253    present property randr record render_util render reply res screensaver \
254    shape shm sync xf86dri xfixes xinerama xinput xkb xtest xv xvmc
255
256# Ugly one-offs
257LIBX11_XCB=	${DESTDIR}${X11USRLIBDIR}/libX11-xcb.a
258LIBXCB=	${DESTDIR}${X11USRLIBDIR}/libxcb.a
259
260.for _lib in ${_X11LIBLIST}
261.ifndef LIB${_lib:tu}
262LIB${_lib:tu}=	${DESTDIR}${X11USRLIBDIR}/lib${_lib}.a
263.MADE:		${LIB${_lib:tu}}	# Note: ${DESTDIR} will be expanded
264.endif
265.endfor
266
267# These ones have "_" in the variable name and "-" in the path.
268.for _lib in ${_XCBLIBLIST}
269.ifndef LIBXCB_${_lib:tu}
270LIBXCB_${_lib:tu}=	${DESTDIR}${X11USRLIBDIR}/libxcb-${_lib}.a
271.MADE:		${LIBXCB_${_lib:tu}}	# Note: ${DESTDIR} will be expanded
272.endif
273.endfor
274
275.if defined(RESCUEDIR)
276CPPFLAGS+=	-DRESCUEDIR=\"${RESCUEDIR}\"
277.endif
278
279_PROGLDOPTS=
280.if ${SHLINKDIR} != "/usr/libexec"	# XXX: change or remove if ld.so moves
281_PROGLDOPTS+=	-Wl,-dynamic-linker=${_SHLINKER}
282.endif
283.if ${SHLIBDIR} != "/usr/lib"
284_PROGLDOPTS+=	-Wl,-rpath,${SHLIBDIR} \
285		-L=${SHLIBDIR}
286.elif ${SHLIBINSTALLDIR} != "/usr/lib"
287_PROGLDOPTS+=	-Wl,-rpath-link,${DESTDIR}${SHLIBINSTALLDIR} \
288		-L=${SHLIBINSTALLDIR}
289.endif
290
291__proginstall: .USE
292	${_MKTARGET_INSTALL}
293	${INSTALL_FILE} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \
294		${STRIPFLAG} ${.ALLSRC} ${.TARGET}
295
296__progrumpinstall: .USE
297	${_MKTARGET_INSTALL}
298	${INSTALL_FILE} -o ${RUMPBINOWN} -g ${RUMPBINGRP} -m ${RUMPBINMODE} \
299		${STRIPFLAG} ${.ALLSRC} ${.TARGET}
300
301__progdebuginstall: .USE
302	${_MKTARGET_INSTALL}
303	${INSTALL_FILE} -o ${DEBUGOWN} -g ${DEBUGGRP} -m ${DEBUGMODE} \
304		${.ALLSRC} ${.TARGET}
305
306
307
308#
309# Backwards compatibility with Makefiles that assume that bsd.prog.mk
310# can only build a single binary.
311#
312
313_APPEND_MANS=yes
314_APPEND_SRCS=yes
315
316_CCLINKFLAGS=
317
318.if defined(PROG_CXX)
319PROG=		${PROG_CXX}
320_CCLINK=	${CXX} ${_CCLINKFLAGS}
321.endif
322
323.if defined(RUMPPRG)
324CPPFLAGS+=	-D_KERNTYPES
325PROG=			${RUMPPRG}
326. ifndef CRUNCHEDPROG
327.  if (${MKRUMP} != "no")
328PROGS=			${RUMPPRG} rump.${RUMPPRG}
329.  else
330PROGS=			${RUMPPRG}
331.  endif
332.  if defined(SRCS)
333.   if (${MKRUMP} != "no")
334SRCS.rump.${PROG}:=	${SRCS} ${PROG}_rumpops.c ${RUMPSRCS}
335.   endif
336SRCS+=			${PROG}_hostops.c
337.  else
338SRCS=			${PROG}.c ${PROG}_hostops.c
339.   if (${MKRUMP} != "no")
340SRCS.rump.${PROG}=	${PROG}.c ${PROG}_rumpops.c ${RUMPSRCS}
341.   endif
342.  endif
343.   if (${MKRUMP} != "no")
344DPSRCS+=		${PROG}_rumpops.c ${RUMPSRCS}
345LDADD.rump.${PROG}+=	${LDADD.rump} -lrumpclient
346DPADD.rump.${PROG}+=	${DPADD.rump} ${LIBRUMPCLIENT}
347MAN.rump.${PROG}=	# defined but feeling empty
348_RUMPINSTALL.rump.${PROG}=# defined
349.   endif
350. else # CRUNCHEDPROG
351PROGS=			${PROG}
352CPPFLAGS+=		-DCRUNCHOPS
353. endif
354.endif
355
356.if defined(PROG)
357_CCLINK?=	${CC} ${_CCLINKFLAGS}
358.  if defined(MAN)
359MAN.${PROG}=	${MAN}
360_APPEND_MANS=	no
361.  endif
362.  if !defined(OBJS)
363OBJS=		${OBJS.${PROG}}
364.  endif
365.  if defined(PROGNAME)
366PROGNAME.${PROG}=	${PROGNAME}
367.  endif
368.  if defined(SRCS)
369SRCS.${PROG}=	${SRCS}
370_APPEND_SRCS=	no
371.  endif
372.endif
373
374# Turn the single-program PROG and PROG_CXX variables into their multi-word
375# counterparts, PROGS and PROGS_CXX.
376.if !defined(RUMPPRG)
377.  if defined(PROG_CXX) && !defined(PROGS_CXX)
378PROGS_CXX=	${PROG_CXX}
379.  elif defined(PROG) && !defined(PROGS)
380PROGS=		${PROG}
381.  endif
382.endif
383
384##### Libraries that this may depend upon.
385.if defined(PROGDPLIBS) 						# {
386.for _lib _dir in ${PROGDPLIBS}
387.if !defined(BINDO.${_lib})
388PROGDO.${_lib}!=	cd "${_dir}" && ${PRINTOBJDIR}
389.MAKEOVERRIDES+=PROGDO.${_lib}
390.endif
391.if defined(PROGDPLIBSSTATIC)
392DPADD+=		${PROGDO.${_lib}}/lib${_lib}.a
393LDADD+=		${PROGDO.${_lib}}/lib${_lib}.a
394.else
395LDADD+=		-L${PROGDO.${_lib}} -l${_lib}
396.if exists(${PROGDO.${_lib}}/lib${_lib}_pic.a)
397DPADD+=		${PROGDO.${_lib}}/lib${_lib}_pic.a
398.elif exists(${PROGDO.${_lib}}/lib${_lib}.so)
399DPADD+=		${PROGDO.${_lib}}/lib${_lib}.so
400.else
401DPADD+=		${PROGDO.${_lib}}/lib${_lib}.a
402.endif
403.endif
404.endfor
405.endif									# }
406#
407# Per-program definitions and targets.
408#
409
410_CCLINK.CDEFAULT= ${CC} ${_CCLINKFLAGS}
411# Definitions specific to C programs.
412.for _P in ${PROGS}
413SRCS.${_P}?=	${_P}.c
414_CCLINK.${_P}=	${CC} ${_CCLINKFLAGS}
415_CFLAGS.${_P}=	${CFLAGS} ${CPUFLAGS}
416_CPPFLAGS.${_P}=	${CPPFLAGS}
417_COPTS.${_P}=	${COPTS}
418.endfor
419
420_CCLINK.CXXDEFAULT= ${CXX} ${_CCLINKFLAGS}
421# Definitions specific to C++ programs.
422.for _P in ${PROGS_CXX}
423SRCS.${_P}?=	${_P}.cc
424_CCLINK.${_P}=	${CXX} ${_CCLINKFLAGS}
425.endfor
426
427# Language-independent definitions.
428.for _P in ${PROGS} ${PROGS_CXX}					# {
429
430BINDIR.${_P}?=		${BINDIR}
431PROGNAME.${_P}?=	${_P}
432
433.if ${MKDEBUG:Uno} != "no" && !defined(NODEBUG) && !commands(${_P}) && \
434    empty(SRCS.${_P}:M*.sh)
435_PROGDEBUG.${_P}:=	${PROGNAME.${_P}}.debug
436.endif
437
438# paxctl specific arguments
439
440.if defined(PAXCTL_FLAGS)
441PAXCTL_FLAGS.${_P}?= ${PAXCTL_FLAGS}
442.endif
443
444.if ${MKSANITIZER:Uno} == "yes" && \
445	(${USE_SANITIZER} == "address" || ${USE_SANITIZER} == "thread" || \
446	${USE_SANITIZER} == "memory")
447PAXCTL_FLAGS.${_P}= +a
448.endif
449
450##### PROG specific flags.
451
452_DPADD.${_P}=		${DPADD}    ${DPADD.${_P}}
453_LDADD.${_P}=		${LDADD}    ${LDADD.${_P}}
454_LDFLAGS.${_P}=		${LDFLAGS}  ${LDFLAGS.${_P}}
455.if ${MKSANITIZER} != "yes"
456# Sanitizers don't support static build.
457_LDSTATIC.${_P}=	${LDSTATIC} ${LDSTATIC.${_P}}
458.endif
459
460##### Build and install rules
461.if !empty(_APPEND_SRCS:M[Yy][Ee][Ss])
462SRCS+=		${SRCS.${_P}}	# For bsd.dep.mk
463.endif
464
465_YPSRCS.${_P}=	${SRCS.${_P}:M*.[ly]:C/\..$/.c/} ${YHEADER:D${SRCS.${_P}:M*.y:.y=.h}}
466
467DPSRCS+=		${_YPSRCS.${_P}}
468CLEANFILES+=		${_YPSRCS.${_P}}
469
470.if !empty(SRCS.${_P}:N*.h:N*.sh:N*.fth)
471OBJS.${_P}+=	${SRCS.${_P}:N*.h:N*.sh:N*.fth:R:S/$/.o/g}
472LOBJS.${_P}+=	${LSRCS:.c=.ln} ${SRCS.${_P}:M*.c:.c=.ln}
473.endif
474
475.if defined(OBJS.${_P}) && !empty(OBJS.${_P})			# {
476.NOPATH: ${OBJS.${_P}} ${_P} ${_YPSRCS.${_P}}
477
478${OBJS.${_P}} ${LOBJS.${_P}}: ${DPSRCS}
479
480${_P}: .gdbinit ${LIBCRT0} ${LIBCRTI} ${OBJS.${_P}} ${LIBC} ${LIBCRTBEGIN} \
481    ${LIBCRTEND} ${_DPADD.${_P}}
482.if !commands(${_P})
483	${_MKTARGET_LINK}
484	${_CCLINK.${_P}} \
485	    ${_LDFLAGS.${_P}} ${_LDSTATIC.${_P}} -o ${.TARGET} \
486	    ${OBJS.${_P}} ${_PROGLDOPTS} ${_LDADD.${_P}}
487.if defined(CTFMERGE)
488	${CTFMERGE} ${CTFMFLAGS} -o ${.TARGET} ${OBJS.${_P}}
489.endif
490.if defined(PAXCTL_FLAGS.${_P})
491	${PAXCTL} ${PAXCTL_FLAGS.${_P}} ${.TARGET}
492.endif
493.if ${MKSTRIPIDENT} != "no"
494	${OBJCOPY} -R .ident ${.TARGET}
495.endif
496.endif	# !commands(${_P})
497
498${_P}.ro: ${OBJS.${_P}} ${_DPADD.${_P}}
499	${_MKTARGET_LINK}
500	${CC} ${LDFLAGS:N-pie} -nostdlib -r -Wl,-dc -o ${.TARGET} ${OBJS.${_P}}
501
502.if defined(_PROGDEBUG.${_P})
503${_PROGDEBUG.${_P}}: ${_P}
504	${_MKTARGET_CREATE}
505	(  ${OBJCOPY} --only-keep-debug ${_P} ${_PROGDEBUG.${_P}} \
506	&& ${OBJCOPY} --strip-debug -p -R .gnu_debuglink \
507		--add-gnu-debuglink=${_PROGDEBUG.${_P}} ${_P} \
508	) || (rm -f ${_PROGDEBUG.${_P}}; false)
509.endif
510
511.endif	# defined(OBJS.${_P}) && !empty(OBJS.${_P})			# }
512
513.if !defined(MAN.${_P})
514MAN.${_P}=	${_P}.1
515.endif	# !defined(MAN.${_P})
516.if !empty(_APPEND_MANS:M[Yy][Ee][Ss])
517MAN+=		${MAN.${_P}}
518.endif
519
520realall: ${_P} ${_PROGDEBUG.${_P}}
521
522CLEANFILES+= ${_P} ${_PROGDEBUG.${_P}}
523
524.if defined(OBJS.${_P}) && !empty(OBJS.${_P})
525CLEANFILES+= ${OBJS.${_P}} ${LOBJS.${_P}}
526.endif
527
528_PROG_INSTALL+=	proginstall-${_P}
529
530.if !target(proginstall-${_P})						# {
531proginstall-${_P}::	${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}} \
532		${_PROGDEBUG.${_P}:D${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}}
533.PRECIOUS:	${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}} \
534		${_PROGDEBUG.${_P}:D${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}}
535
536.if ${MKUPDATE} == "no"
537.if defined(_RUMPINSTALL.${_P})
538${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}! ${_P} __progrumpinstall
539.else
540${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}! ${_P} __proginstall
541.endif
542.if !defined(BUILD) && !make(all) && !make(${_P})
543${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}! .MADE
544.endif
545.if defined(_PROGDEBUG.${_P})
546${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}! ${_PROGDEBUG.${_P}} __progdebuginstall
547.if !defined(BUILD) && !make(all) && !make(${_P})
548${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}! .MADE
549.endif
550.endif	#  define(_PROGDEBUG.${_P})
551.else	# MKUPDATE != no
552.if defined(_RUMPINSTALL.${_P})
553${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}: ${_P} __progrumpinstall
554.else
555${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}: ${_P} __proginstall
556.endif
557.if !defined(BUILD) && !make(all) && !make(${_P})
558${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}: .MADE
559.endif
560.if defined(_PROGDEBUG.${_P})
561${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}: ${_PROGDEBUG.${_P}} __progdebuginstall
562.if !defined(BUILD) && !make(all) && !make(${_P})
563${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}: .MADE
564.endif
565.endif	#  defined(_PROGDEBUG.${_P})
566.endif	# MKUPDATE != no
567
568.endif	# !target(proginstall-${_P})					# }
569
570lint: lint-${_P}
571lint-${_P}: ${LOBJS.${_P}}
572.if defined(LOBJS.${_P}) && !empty(LOBJS.${_P})
573.if defined(DESTDIR)
574	${LINT} ${LINTFLAGS} ${_LDFLAGS.${_P}:C/-L[  ]*/-L/Wg:M-L*} -L${DESTDIR}/usr/libdata/lint ${LOBJS.${_P}} ${_LDADD.${_P}}
575.else
576	${LINT} ${LINTFLAGS} ${_LDFLAGS.${_P}:C/-L[  ]*/-L/Wg:M-L*} ${LOBJS.${_P}} ${_LDADD.${_P}}
577.endif
578.endif
579
580.endfor # _P in ${PROGS} ${PROGS_CXX}					# }
581
582.if defined(OBJS) && !empty(OBJS) && \
583    (empty(PROGS) && empty(PROGS_CXX))
584CLEANFILES+= ${OBJS} ${LOBJS}
585.endif
586
587.if !target(proginstall)
588proginstall:: ${_PROG_INSTALL}
589.endif
590.PHONY:		proginstall
591
592
593
594realall: ${SCRIPTS}
595.if defined(SCRIPTS) && !target(scriptsinstall)				# {
596SCRIPTSDIR?=${BINDIR}
597SCRIPTSOWN?=${BINOWN}
598SCRIPTSGRP?=${BINGRP}
599SCRIPTSMODE?=${BINMODE}
600
601scriptsinstall:: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@}
602.PRECIOUS: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@}
603
604__scriptinstall: .USE
605	${_MKTARGET_INSTALL}
606	${INSTALL_FILE} \
607	    -o ${SCRIPTSOWN_${.ALLSRC:T}:U${SCRIPTSOWN}} \
608	    -g ${SCRIPTSGRP_${.ALLSRC:T}:U${SCRIPTSGRP}} \
609	    -m ${SCRIPTSMODE_${.ALLSRC:T}:U${SCRIPTSMODE}} \
610	    ${.ALLSRC} ${.TARGET}
611
612.for S in ${SCRIPTS:O:u}
613.if ${MKUPDATE} == "no"
614${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! ${S} __scriptinstall
615.if !defined(BUILD) && !make(all) && !make(${S})
616${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! .MADE
617.endif
618.else
619${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: ${S} __scriptinstall
620.if !defined(BUILD) && !make(all) && !make(${S})
621${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: .MADE
622.endif
623.endif
624.endfor
625.endif									# }
626
627.if !target(scriptsinstall)
628scriptsinstall::
629.endif
630.PHONY:		scriptsinstall
631
632##### Pull in related .mk logic
633LINKSOWN?= ${BINOWN}
634LINKSGRP?= ${BINGRP}
635LINKSMODE?= ${BINMODE}
636.include <bsd.man.mk>
637.include <bsd.nls.mk>
638.include <bsd.files.mk>
639.include <bsd.inc.mk>
640.include <bsd.links.mk>
641.include <bsd.sys.mk>
642.include <bsd.dep.mk>
643.include <bsd.clang-analyze.mk>
644.include <bsd.clean.mk>
645
646${TARGETS}:	# ensure existence
647
648.endif	# HOSTPROG
649