xref: /netbsd-src/share/mk/bsd.prog.mk (revision 9c33d0a32e02582d209daedaa0c74e920b195b0b)
1#	$NetBSD: bsd.prog.mk,v 1.354 2025/01/14 19:45:53 riastradh 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	-lcrypt -lutil
210LIBKRB5_DPADD+= ${LIBKRB5} ${LIBCOM_ERR} \
211	${LIBHX509} ${LIBCRYPTO} ${LIBASN1} \
212	${LIBWIND} ${LIBHEIMBASE} ${LIBCOM_ERR} ${LIBROKEN} \
213	${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 EGL fntstubs fontcache fontconfig fontenc freetype FS GL GLU \
248    GLw I810XvMC  ICE IntelXvMC lbxutil SM X11 X11_xcb Xres Xau Xau7 Xaw xcb \
249    Xcomposite Xcursor xcvt Xdamage Xdmcp Xext Xfixes Xfont Xfont2 Xft Xi \
250    Xinerama xkbfile Xmu Xmuu Xpm Xrandr Xrender Xss Xt XTrap Xtst Xv Xxf86dga \
251    Xxf86misc Xxf86vm
252_XCBLIBLIST= \
253    atom aux composite damage dpms dri2 dri3 event glx icccm image keysyms \
254    present property randr record render_util render reply res screensaver \
255    shape shm sync xf86dri xfixes xinerama xinput xkb xtest xv xvmc
256
257# Ugly one-offs
258LIBX11_XCB=	${DESTDIR}${X11USRLIBDIR}/libX11-xcb.a
259LIBXCB=	${DESTDIR}${X11USRLIBDIR}/libxcb.a
260
261.for _lib in ${_X11LIBLIST}
262.ifndef LIB${_lib:tu}
263LIB${_lib:tu}=	${DESTDIR}${X11USRLIBDIR}/lib${_lib}.a
264.MADE:		${LIB${_lib:tu}}	# Note: ${DESTDIR} will be expanded
265.endif
266.endfor
267
268# These ones have "_" in the variable name and "-" in the path.
269.for _lib in ${_XCBLIBLIST}
270.ifndef LIBXCB_${_lib:tu}
271LIBXCB_${_lib:tu}=	${DESTDIR}${X11USRLIBDIR}/libxcb-${_lib}.a
272.MADE:		${LIBXCB_${_lib:tu}}	# Note: ${DESTDIR} will be expanded
273.endif
274.endfor
275
276.if defined(RESCUEDIR)
277CPPFLAGS+=	-DRESCUEDIR=\"${RESCUEDIR}\"
278.endif
279
280_PROGLDOPTS=
281.if ${SHLINKDIR} != "/usr/libexec"	# XXX: change or remove if ld.so moves
282_PROGLDOPTS+=	-Wl,-dynamic-linker=${_SHLINKER}
283.endif
284.if ${SHLIBDIR} != "/usr/lib"
285_PROGLDOPTS+=	-Wl,-rpath,${SHLIBDIR} \
286		-L=${SHLIBDIR}
287.elif ${SHLIBINSTALLDIR} != "/usr/lib"
288_PROGLDOPTS+=	-Wl,-rpath-link,${DESTDIR}${SHLIBINSTALLDIR} \
289		-L=${SHLIBINSTALLDIR}
290.endif
291
292__proginstall: .USE
293	${_MKTARGET_INSTALL}
294	${INSTALL_FILE} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \
295		${STRIPFLAG} ${.ALLSRC} ${.TARGET}
296
297__progrumpinstall: .USE
298	${_MKTARGET_INSTALL}
299	${INSTALL_FILE} -o ${RUMPBINOWN} -g ${RUMPBINGRP} -m ${RUMPBINMODE} \
300		${STRIPFLAG} ${.ALLSRC} ${.TARGET}
301
302__progdebuginstall: .USE
303	${_MKTARGET_INSTALL}
304	${INSTALL_FILE} -o ${DEBUGOWN} -g ${DEBUGGRP} -m ${DEBUGMODE} \
305		${.ALLSRC} ${.TARGET}
306
307
308
309#
310# Backwards compatibility with Makefiles that assume that bsd.prog.mk
311# can only build a single binary.
312#
313
314_APPEND_MANS=yes
315_APPEND_SRCS=yes
316
317_CCLINKFLAGS=
318
319.if defined(PROG_CXX)
320PROG=		${PROG_CXX}
321_CCLINK=	${CXX} ${_CCLINKFLAGS}
322.endif
323
324.if defined(RUMPPRG)
325CPPFLAGS+=	-D_KERNTYPES
326PROG=			${RUMPPRG}
327. ifndef CRUNCHEDPROG
328.  if (${MKRUMP} != "no")
329PROGS=			${RUMPPRG} rump.${RUMPPRG}
330.  else
331PROGS=			${RUMPPRG}
332.  endif
333.  if defined(SRCS)
334.   if (${MKRUMP} != "no")
335SRCS.rump.${PROG}:=	${SRCS} ${PROG}_rumpops.c ${RUMPSRCS}
336.   endif
337SRCS+=			${PROG}_hostops.c
338.  else
339SRCS=			${PROG}.c ${PROG}_hostops.c
340.   if (${MKRUMP} != "no")
341SRCS.rump.${PROG}=	${PROG}.c ${PROG}_rumpops.c ${RUMPSRCS}
342.   endif
343.  endif
344.   if (${MKRUMP} != "no")
345DPSRCS+=		${PROG}_rumpops.c ${RUMPSRCS}
346LDADD.rump.${PROG}+=	${LDADD.rump} -lrumpclient
347DPADD.rump.${PROG}+=	${DPADD.rump} ${LIBRUMPCLIENT}
348MAN.rump.${PROG}=	# defined but feeling empty
349_RUMPINSTALL.rump.${PROG}=# defined
350.   endif
351. else # CRUNCHEDPROG
352PROGS=			${PROG}
353CPPFLAGS+=		-DCRUNCHOPS
354. endif
355.endif
356
357.if defined(PROG)
358_CCLINK?=	${CC} ${_CCLINKFLAGS}
359.  if defined(MAN)
360MAN.${PROG}=	${MAN}
361_APPEND_MANS=	no
362.  endif
363.  if !defined(OBJS)
364OBJS=		${OBJS.${PROG}}
365.  endif
366.  if defined(PROGNAME)
367PROGNAME.${PROG}=	${PROGNAME}
368.  endif
369.  if defined(SRCS)
370SRCS.${PROG}=	${SRCS}
371_APPEND_SRCS=	no
372.  endif
373.endif
374
375# Turn the single-program PROG and PROG_CXX variables into their multi-word
376# counterparts, PROGS and PROGS_CXX.
377.if !defined(RUMPPRG)
378.  if defined(PROG_CXX) && !defined(PROGS_CXX)
379PROGS_CXX=	${PROG_CXX}
380.  elif defined(PROG) && !defined(PROGS)
381PROGS=		${PROG}
382.  endif
383.endif
384
385##### Libraries that this may depend upon.
386.if defined(PROGDPLIBS) 						# {
387.  for _lib _dir in ${PROGDPLIBS}
388.    if !defined(LIBDO.${_lib})
389LIBDO.${_lib}!=	cd "${_dir}" && ${PRINTOBJDIR}
390.MAKEOVERRIDES+=LIBDO.${_lib}
391.    endif
392.    if defined(PROGDPLIBSSTATIC)
393DPADD+=		${LIBDO.${_lib}}/lib${_lib}.a
394LDADD+=		${LIBDO.${_lib}}/lib${_lib}.a
395.    else
396LDADD+=		-L${LIBDO.${_lib}} -l${_lib}
397.      if exists(${LIBDO.${_lib}}/lib${_lib}_pic.a)
398DPADD+=		${LIBDO.${_lib}}/lib${_lib}_pic.a
399.      elif exists(${LIBDO.${_lib}}/lib${_lib}.so)
400DPADD+=		${LIBDO.${_lib}}/lib${_lib}.so
401.      else
402DPADD+=		${LIBDO.${_lib}}/lib${_lib}.a
403.      endif
404.    endif
405.  endfor
406.endif									# }
407
408LDADD+=${LDADD_AFTER}
409DPADD+=${DPADD_AFTER}
410
411#
412# Per-program definitions and targets.
413#
414
415_CCLINK.CDEFAULT= ${CC} ${_CCLINKFLAGS}
416# Definitions specific to C programs.
417.for _P in ${PROGS}
418SRCS.${_P}?=	${_P}.c
419_CCLINK.${_P}=	${CC} ${_CCLINKFLAGS}
420_CFLAGS.${_P}=	${CFLAGS} ${CPUFLAGS}
421_CPPFLAGS.${_P}=	${CPPFLAGS}
422_COPTS.${_P}=	${COPTS}
423.endfor
424
425_CCLINK.CXXDEFAULT= ${CXX} ${_CCLINKFLAGS}
426# Definitions specific to C++ programs.
427.for _P in ${PROGS_CXX}
428SRCS.${_P}?=	${_P}.cc
429_CCLINK.${_P}=	${CXX} ${_CCLINKFLAGS}
430.endfor
431
432# Language-independent definitions.
433.for _P in ${PROGS} ${PROGS_CXX}					# {
434
435BINDIR.${_P}?=		${BINDIR}
436PROGNAME.${_P}?=	${_P}
437
438.if ${MKDEBUG:Uno} != "no" && !defined(NODEBUG) && !commands(${_P}) && \
439    empty(SRCS.${_P}:M*.sh)
440_PROGDEBUG.${_P}:=	${PROGNAME.${_P}}.debug
441.endif
442
443# paxctl specific arguments
444
445.if defined(PAXCTL_FLAGS)
446PAXCTL_FLAGS.${_P}?= ${PAXCTL_FLAGS}
447.endif
448
449.if ${MKSANITIZER:Uno} == "yes" && \
450	(${USE_SANITIZER} == "address" || ${USE_SANITIZER} == "thread" || \
451	${USE_SANITIZER} == "memory")
452PAXCTL_FLAGS.${_P}= +a
453.endif
454
455##### PROG specific flags.
456
457_DPADD.${_P}=		${DPADD}    ${DPADD.${_P}}
458_LDADD.${_P}=		${LDADD}    ${LDADD.${_P}}
459_LDFLAGS.${_P}=		${LDFLAGS}  ${LDFLAGS.${_P}}
460.if ${MKSANITIZER} != "yes"
461# Sanitizers don't support static build.
462_LDSTATIC.${_P}=	${LDSTATIC} ${LDSTATIC.${_P}}
463.endif
464
465##### Build and install rules
466.if !empty(_APPEND_SRCS:M[Yy][Ee][Ss])
467SRCS+=		${SRCS.${_P}}	# For bsd.dep.mk
468.endif
469
470_YPSRCS.${_P}=	${SRCS.${_P}:M*.[ly]:C/\..$/.c/} ${YHEADER:D${SRCS.${_P}:M*.y:.y=.h}}
471
472DPSRCS+=		${_YPSRCS.${_P}}
473CLEANFILES+=		${_YPSRCS.${_P}}
474
475.if !empty(SRCS.${_P}:N*.h:N*.sh:N*.fth)
476OBJS.${_P}+=	${SRCS.${_P}:N*.h:N*.sh:N*.fth:R:S/$/.o/g}
477LOBJS.${_P}+=	${LSRCS:.c=.ln} ${SRCS.${_P}:M*.c:.c=.ln}
478.endif
479
480.if defined(OBJS.${_P}) && !empty(OBJS.${_P})			# {
481.NOPATH: ${OBJS.${_P}} ${_P} ${_YPSRCS.${_P}}
482
483${OBJS.${_P}} ${LOBJS.${_P}}: ${DPSRCS}
484
485${_P}: .gdbinit ${LIBCRT0} ${LIBCRTI} ${OBJS.${_P}} ${LIBC} ${LIBCRTBEGIN} \
486    ${LIBCRTEND} ${_DPADD.${_P}}
487.if !commands(${_P})
488	${_MKTARGET_LINK}
489	${_CCLINK.${_P}} \
490	    ${_LDFLAGS.${_P}} ${_LDSTATIC.${_P}} -o ${.TARGET} \
491	    ${OBJS.${_P}} ${_PROGLDOPTS} ${_LDADD.${_P}}
492.if defined(CTFMERGE)
493	${CTFMERGE} ${CTFMFLAGS} -o ${.TARGET} ${OBJS.${_P}}
494.endif
495.if defined(PAXCTL_FLAGS.${_P})
496	${PAXCTL} ${PAXCTL_FLAGS.${_P}} ${.TARGET}
497.endif
498.if ${MKSTRIPIDENT} != "no"
499	${OBJCOPY} -R .ident ${.TARGET}
500.endif
501.endif	# !commands(${_P})
502
503${_P}.ro: ${OBJS.${_P}} ${_DPADD.${_P}}
504	${_MKTARGET_LINK}
505	${CC} ${LDFLAGS:N-pie} -nostdlib -r -Wl,-dc -o ${.TARGET} ${OBJS.${_P}}
506
507.if defined(_PROGDEBUG.${_P})
508${_PROGDEBUG.${_P}}: ${_P}
509	${_MKTARGET_CREATE}
510	( ${OBJCOPY} --only-keep-debug --compress-debug-sections \
511	    ${_P} ${_PROGDEBUG.${_P}} && \
512	  ${OBJCOPY} --strip-debug -p -R .gnu_debuglink \
513		--add-gnu-debuglink=${_PROGDEBUG.${_P}} ${_P} \
514	) || (rm -f ${_PROGDEBUG.${_P}}; false)
515.endif
516
517.endif	# defined(OBJS.${_P}) && !empty(OBJS.${_P})			# }
518
519.if !defined(MAN.${_P})
520MAN.${_P}=	${_P}.1
521.endif	# !defined(MAN.${_P})
522.if !empty(_APPEND_MANS:M[Yy][Ee][Ss])
523MAN+=		${MAN.${_P}}
524.endif
525
526realall: ${_P} ${_PROGDEBUG.${_P}}
527
528CLEANFILES+= ${_P} ${_PROGDEBUG.${_P}}
529
530.if defined(OBJS.${_P}) && !empty(OBJS.${_P})
531CLEANFILES+= ${OBJS.${_P}} ${LOBJS.${_P}}
532.endif
533
534_PROG_INSTALL+=	proginstall-${_P}
535
536.if !target(proginstall-${_P})						# {
537proginstall-${_P}::	${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}} \
538		${_PROGDEBUG.${_P}:D${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}}
539.PRECIOUS:	${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}} \
540		${_PROGDEBUG.${_P}:D${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}}
541
542.if ${MKUPDATE} == "no"
543.if defined(_RUMPINSTALL.${_P})
544${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}! ${_P} __progrumpinstall
545.else
546${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}! ${_P} __proginstall
547.endif
548.if !defined(BUILD) && !make(all) && !make(${_P})
549${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}! .MADE
550.endif
551.if defined(_PROGDEBUG.${_P})
552${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}! ${_PROGDEBUG.${_P}} __progdebuginstall
553.if !defined(BUILD) && !make(all) && !make(${_P})
554${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}! .MADE
555.endif
556.endif	#  define(_PROGDEBUG.${_P})
557.else	# MKUPDATE != no
558.if defined(_RUMPINSTALL.${_P})
559${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}: ${_P} __progrumpinstall
560.else
561${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}: ${_P} __proginstall
562.endif
563.if !defined(BUILD) && !make(all) && !make(${_P})
564${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}: .MADE
565.endif
566.if defined(_PROGDEBUG.${_P})
567${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}: ${_PROGDEBUG.${_P}} __progdebuginstall
568.if !defined(BUILD) && !make(all) && !make(${_P})
569${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}: .MADE
570.endif
571.endif	#  defined(_PROGDEBUG.${_P})
572.endif	# MKUPDATE != no
573
574.endif	# !target(proginstall-${_P})					# }
575
576lint: lint-${_P}
577lint-${_P}: ${LOBJS.${_P}}
578.if defined(LOBJS.${_P}) && !empty(LOBJS.${_P})
579.if defined(DESTDIR)
580	${LINT} ${LINTFLAGS} ${_LDFLAGS.${_P}:C/-L[  ]*/-L/Wg:M-L*} -L${DESTDIR}/usr/libdata/lint ${LOBJS.${_P}} ${_LDADD.${_P}}
581.else
582	${LINT} ${LINTFLAGS} ${_LDFLAGS.${_P}:C/-L[  ]*/-L/Wg:M-L*} ${LOBJS.${_P}} ${_LDADD.${_P}}
583.endif
584.endif
585
586.endfor # _P in ${PROGS} ${PROGS_CXX}					# }
587
588.if defined(OBJS) && !empty(OBJS) && \
589    (empty(PROGS) && empty(PROGS_CXX))
590CLEANFILES+= ${OBJS} ${LOBJS}
591.endif
592
593.if !target(proginstall)
594proginstall:: ${_PROG_INSTALL}
595.endif
596.PHONY:		proginstall
597
598
599
600realall: ${SCRIPTS}
601.if defined(SCRIPTS) && !target(scriptsinstall)				# {
602SCRIPTSDIR?=${BINDIR}
603SCRIPTSOWN?=${BINOWN}
604SCRIPTSGRP?=${BINGRP}
605SCRIPTSMODE?=${BINMODE}
606
607scriptsinstall:: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@}
608.PRECIOUS: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@}
609
610__scriptinstall: .USE
611	${_MKTARGET_INSTALL}
612	${INSTALL_FILE} \
613	    -o ${SCRIPTSOWN_${.ALLSRC:T}:U${SCRIPTSOWN}} \
614	    -g ${SCRIPTSGRP_${.ALLSRC:T}:U${SCRIPTSGRP}} \
615	    -m ${SCRIPTSMODE_${.ALLSRC:T}:U${SCRIPTSMODE}} \
616	    ${.ALLSRC} ${.TARGET}
617
618.for S in ${SCRIPTS:O:u}
619.if ${MKUPDATE} == "no"
620${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! ${S} __scriptinstall
621.if !defined(BUILD) && !make(all) && !make(${S})
622${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! .MADE
623.endif
624.else
625${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: ${S} __scriptinstall
626.if !defined(BUILD) && !make(all) && !make(${S})
627${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: .MADE
628.endif
629.endif
630.endfor
631.endif									# }
632
633.if !target(scriptsinstall)
634scriptsinstall::
635.endif
636.PHONY:		scriptsinstall
637
638##### Pull in related .mk logic
639LINKSOWN?= ${BINOWN}
640LINKSGRP?= ${BINGRP}
641LINKSMODE?= ${BINMODE}
642.include <bsd.man.mk>
643.include <bsd.nls.mk>
644.include <bsd.files.mk>
645.include <bsd.inc.mk>
646.include <bsd.links.mk>
647.include <bsd.sys.mk>
648.include <bsd.dep.mk>
649.include <bsd.clang-analyze.mk>
650.include <bsd.clean.mk>
651
652${TARGETS}:	# ensure existence
653
654.endif	# HOSTPROG
655