1#	$NetBSD: bsd.prog.mk,v 1.349 2024/05/06 08:43:37 mrg 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 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
407LDADD+=${LDADD_AFTER}
408DPADD+=${DPADD_AFTER}
409
410#
411# Per-program definitions and targets.
412#
413
414_CCLINK.CDEFAULT= ${CC} ${_CCLINKFLAGS}
415# Definitions specific to C programs.
416.for _P in ${PROGS}
417SRCS.${_P}?=	${_P}.c
418_CCLINK.${_P}=	${CC} ${_CCLINKFLAGS}
419_CFLAGS.${_P}=	${CFLAGS} ${CPUFLAGS}
420_CPPFLAGS.${_P}=	${CPPFLAGS}
421_COPTS.${_P}=	${COPTS}
422.endfor
423
424_CCLINK.CXXDEFAULT= ${CXX} ${_CCLINKFLAGS}
425# Definitions specific to C++ programs.
426.for _P in ${PROGS_CXX}
427SRCS.${_P}?=	${_P}.cc
428_CCLINK.${_P}=	${CXX} ${_CCLINKFLAGS}
429.endfor
430
431# Language-independent definitions.
432.for _P in ${PROGS} ${PROGS_CXX}					# {
433
434BINDIR.${_P}?=		${BINDIR}
435PROGNAME.${_P}?=	${_P}
436
437.if ${MKDEBUG:Uno} != "no" && !defined(NODEBUG) && !commands(${_P}) && \
438    empty(SRCS.${_P}:M*.sh)
439_PROGDEBUG.${_P}:=	${PROGNAME.${_P}}.debug
440.endif
441
442# paxctl specific arguments
443
444.if defined(PAXCTL_FLAGS)
445PAXCTL_FLAGS.${_P}?= ${PAXCTL_FLAGS}
446.endif
447
448.if ${MKSANITIZER:Uno} == "yes" && \
449	(${USE_SANITIZER} == "address" || ${USE_SANITIZER} == "thread" || \
450	${USE_SANITIZER} == "memory")
451PAXCTL_FLAGS.${_P}= +a
452.endif
453
454##### PROG specific flags.
455
456_DPADD.${_P}=		${DPADD}    ${DPADD.${_P}}
457_LDADD.${_P}=		${LDADD}    ${LDADD.${_P}}
458_LDFLAGS.${_P}=		${LDFLAGS}  ${LDFLAGS.${_P}}
459.if ${MKSANITIZER} != "yes"
460# Sanitizers don't support static build.
461_LDSTATIC.${_P}=	${LDSTATIC} ${LDSTATIC.${_P}}
462.endif
463
464##### Build and install rules
465.if !empty(_APPEND_SRCS:M[Yy][Ee][Ss])
466SRCS+=		${SRCS.${_P}}	# For bsd.dep.mk
467.endif
468
469_YPSRCS.${_P}=	${SRCS.${_P}:M*.[ly]:C/\..$/.c/} ${YHEADER:D${SRCS.${_P}:M*.y:.y=.h}}
470
471DPSRCS+=		${_YPSRCS.${_P}}
472CLEANFILES+=		${_YPSRCS.${_P}}
473
474.if !empty(SRCS.${_P}:N*.h:N*.sh:N*.fth)
475OBJS.${_P}+=	${SRCS.${_P}:N*.h:N*.sh:N*.fth:R:S/$/.o/g}
476LOBJS.${_P}+=	${LSRCS:.c=.ln} ${SRCS.${_P}:M*.c:.c=.ln}
477.endif
478
479.if defined(OBJS.${_P}) && !empty(OBJS.${_P})			# {
480.NOPATH: ${OBJS.${_P}} ${_P} ${_YPSRCS.${_P}}
481
482${OBJS.${_P}} ${LOBJS.${_P}}: ${DPSRCS}
483
484${_P}: .gdbinit ${LIBCRT0} ${LIBCRTI} ${OBJS.${_P}} ${LIBC} ${LIBCRTBEGIN} \
485    ${LIBCRTEND} ${_DPADD.${_P}}
486.if !commands(${_P})
487	${_MKTARGET_LINK}
488	${_CCLINK.${_P}} \
489	    ${_LDFLAGS.${_P}} ${_LDSTATIC.${_P}} -o ${.TARGET} \
490	    ${OBJS.${_P}} ${_PROGLDOPTS} ${_LDADD.${_P}}
491.if defined(CTFMERGE)
492	${CTFMERGE} ${CTFMFLAGS} -o ${.TARGET} ${OBJS.${_P}}
493.endif
494.if defined(PAXCTL_FLAGS.${_P})
495	${PAXCTL} ${PAXCTL_FLAGS.${_P}} ${.TARGET}
496.endif
497.if ${MKSTRIPIDENT} != "no"
498	${OBJCOPY} -R .ident ${.TARGET}
499.endif
500.endif	# !commands(${_P})
501
502${_P}.ro: ${OBJS.${_P}} ${_DPADD.${_P}}
503	${_MKTARGET_LINK}
504	${CC} ${LDFLAGS:N-pie} -nostdlib -r -Wl,-dc -o ${.TARGET} ${OBJS.${_P}}
505
506.if defined(_PROGDEBUG.${_P})
507${_PROGDEBUG.${_P}}: ${_P}
508	${_MKTARGET_CREATE}
509	( ${OBJCOPY} --only-keep-debug --compress-debug-sections \
510	    ${_P} ${_PROGDEBUG.${_P}} && \
511	  ${OBJCOPY} --strip-debug -p -R .gnu_debuglink \
512		--add-gnu-debuglink=${_PROGDEBUG.${_P}} ${_P} \
513	) || (rm -f ${_PROGDEBUG.${_P}}; false)
514.endif
515
516.endif	# defined(OBJS.${_P}) && !empty(OBJS.${_P})			# }
517
518.if !defined(MAN.${_P})
519MAN.${_P}=	${_P}.1
520.endif	# !defined(MAN.${_P})
521.if !empty(_APPEND_MANS:M[Yy][Ee][Ss])
522MAN+=		${MAN.${_P}}
523.endif
524
525realall: ${_P} ${_PROGDEBUG.${_P}}
526
527CLEANFILES+= ${_P} ${_PROGDEBUG.${_P}}
528
529.if defined(OBJS.${_P}) && !empty(OBJS.${_P})
530CLEANFILES+= ${OBJS.${_P}} ${LOBJS.${_P}}
531.endif
532
533_PROG_INSTALL+=	proginstall-${_P}
534
535.if !target(proginstall-${_P})						# {
536proginstall-${_P}::	${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}} \
537		${_PROGDEBUG.${_P}:D${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}}
538.PRECIOUS:	${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}} \
539		${_PROGDEBUG.${_P}:D${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}}
540
541.if ${MKUPDATE} == "no"
542.if defined(_RUMPINSTALL.${_P})
543${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}! ${_P} __progrumpinstall
544.else
545${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}! ${_P} __proginstall
546.endif
547.if !defined(BUILD) && !make(all) && !make(${_P})
548${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}! .MADE
549.endif
550.if defined(_PROGDEBUG.${_P})
551${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}! ${_PROGDEBUG.${_P}} __progdebuginstall
552.if !defined(BUILD) && !make(all) && !make(${_P})
553${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}! .MADE
554.endif
555.endif	#  define(_PROGDEBUG.${_P})
556.else	# MKUPDATE != no
557.if defined(_RUMPINSTALL.${_P})
558${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}: ${_P} __progrumpinstall
559.else
560${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}: ${_P} __proginstall
561.endif
562.if !defined(BUILD) && !make(all) && !make(${_P})
563${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}: .MADE
564.endif
565.if defined(_PROGDEBUG.${_P})
566${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}: ${_PROGDEBUG.${_P}} __progdebuginstall
567.if !defined(BUILD) && !make(all) && !make(${_P})
568${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}: .MADE
569.endif
570.endif	#  defined(_PROGDEBUG.${_P})
571.endif	# MKUPDATE != no
572
573.endif	# !target(proginstall-${_P})					# }
574
575lint: lint-${_P}
576lint-${_P}: ${LOBJS.${_P}}
577.if defined(LOBJS.${_P}) && !empty(LOBJS.${_P})
578.if defined(DESTDIR)
579	${LINT} ${LINTFLAGS} ${_LDFLAGS.${_P}:C/-L[  ]*/-L/Wg:M-L*} -L${DESTDIR}/usr/libdata/lint ${LOBJS.${_P}} ${_LDADD.${_P}}
580.else
581	${LINT} ${LINTFLAGS} ${_LDFLAGS.${_P}:C/-L[  ]*/-L/Wg:M-L*} ${LOBJS.${_P}} ${_LDADD.${_P}}
582.endif
583.endif
584
585.endfor # _P in ${PROGS} ${PROGS_CXX}					# }
586
587.if defined(OBJS) && !empty(OBJS) && \
588    (empty(PROGS) && empty(PROGS_CXX))
589CLEANFILES+= ${OBJS} ${LOBJS}
590.endif
591
592.if !target(proginstall)
593proginstall:: ${_PROG_INSTALL}
594.endif
595.PHONY:		proginstall
596
597
598
599realall: ${SCRIPTS}
600.if defined(SCRIPTS) && !target(scriptsinstall)				# {
601SCRIPTSDIR?=${BINDIR}
602SCRIPTSOWN?=${BINOWN}
603SCRIPTSGRP?=${BINGRP}
604SCRIPTSMODE?=${BINMODE}
605
606scriptsinstall:: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@}
607.PRECIOUS: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@}
608
609__scriptinstall: .USE
610	${_MKTARGET_INSTALL}
611	${INSTALL_FILE} \
612	    -o ${SCRIPTSOWN_${.ALLSRC:T}:U${SCRIPTSOWN}} \
613	    -g ${SCRIPTSGRP_${.ALLSRC:T}:U${SCRIPTSGRP}} \
614	    -m ${SCRIPTSMODE_${.ALLSRC:T}:U${SCRIPTSMODE}} \
615	    ${.ALLSRC} ${.TARGET}
616
617.for S in ${SCRIPTS:O:u}
618.if ${MKUPDATE} == "no"
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.else
624${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: ${S} __scriptinstall
625.if !defined(BUILD) && !make(all) && !make(${S})
626${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: .MADE
627.endif
628.endif
629.endfor
630.endif									# }
631
632.if !target(scriptsinstall)
633scriptsinstall::
634.endif
635.PHONY:		scriptsinstall
636
637##### Pull in related .mk logic
638LINKSOWN?= ${BINOWN}
639LINKSGRP?= ${BINGRP}
640LINKSMODE?= ${BINMODE}
641.include <bsd.man.mk>
642.include <bsd.nls.mk>
643.include <bsd.files.mk>
644.include <bsd.inc.mk>
645.include <bsd.links.mk>
646.include <bsd.sys.mk>
647.include <bsd.dep.mk>
648.include <bsd.clang-analyze.mk>
649.include <bsd.clean.mk>
650
651${TARGETS}:	# ensure existence
652
653.endif	# HOSTPROG
654