xref: /netbsd-src/share/mk/bsd.prog.mk (revision 181254a7b1bdde6873432bffef2d2decc4b5c22f)
1#	$NetBSD: bsd.prog.mk,v 1.331 2020/06/15 01:57:31 christos 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(SHAREDSTRINGS)
39CLEANFILES+=strings
40.c.o:
41	${CC} -E ${CPPFLAGS} ${CFLAGS} ${.IMPSRC} | xstr -c -
42	@${CC} ${CPPFLAGS} ${CFLAGS} -c x.c -o ${.TARGET}
43.if defined(CTFCONVERT)
44	${CTFCONVERT} ${CTFFLAGS} ${.TARGET}
45.endif
46	@rm -f x.c
47
48.cc.o .cpp.o .cxx.o .C.o:
49	${CXX} -E ${CPPFLAGS} ${CXXFLAGS} ${.IMPSRC} | xstr -c -
50	@${MV} x.c x.cc
51	@${CXX} ${CPPFLAGS} ${CXXFLAGS} -c x.cc -o ${.TARGET}
52.if defined(CTFCONVERT)
53	${CTFCONVERT} ${CTFFLAGS} ${.TARGET}
54.endif
55	@rm -f x.cc
56.endif
57
58.if defined(MKPIE) && (${MKPIE} != "no") && !defined(NOPIE)
59CFLAGS+=	${PIE_CFLAGS}
60AFLAGS+=	${PIE_AFLAGS}
61LDFLAGS+=	${"${LDSTATIC.${.TARGET}}" == "-static" :? : ${PIE_LDFLAGS}}
62.endif
63
64CFLAGS+=	${COPTS}
65.if ${MKDEBUG:Uno} != "no" && !defined(NODEBUG)
66CFLAGS+=	-g
67.endif
68OBJCFLAGS+=	${OBJCOPTS}
69MKDEP_SUFFIXES?=	.o .ln .d
70
71# CTF preserve debug symbols
72.if (${MKCTF:Uno} != "no") && (${CFLAGS:M-g} != "")
73CTFFLAGS+= -g
74CTFMFLAGS+= -g
75.if defined(HAVE_GCC)
76#CFLAGS+=-gdwarf-2
77.endif
78.endif
79
80# ELF platforms depend on crti.o, crtbegin.o, crtend.o, and crtn.o
81.ifndef LIBCRTBEGIN
82LIBCRTBEGIN=	${DESTDIR}/usr/lib/${MLIBDIR:D${MLIBDIR}/}crti.o ${_GCC_CRTBEGIN}
83.MADE: ${LIBCRTBEGIN}
84.endif
85.ifndef LIBCRTEND
86LIBCRTEND=	${_GCC_CRTEND} ${DESTDIR}/usr/lib/${MLIBDIR:D${MLIBDIR}/}crtn.o
87.MADE: ${LIBCRTEND}
88.endif
89_SHLINKER=	${SHLINKDIR}/ld.elf_so
90
91.ifndef LIBCRT0
92LIBCRT0=	${DESTDIR}/usr/lib/${MLIBDIR:D${MLIBDIR}/}crt0.o
93.MADE: ${LIBCRT0}
94.endif
95
96.ifndef LIBCRTI
97LIBCRTI=	${DESTDIR}/usr/lib/${MLIBDIR:D${MLIBDIR}/}crti.o
98.MADE: ${LIBCRTI}
99.endif
100
101##### Installed system library definitions
102#
103#	E.g.
104#		LIBC?=${DESTDIR}/usr/lib/libc.a
105#		LIBX11?=${DESTDIR}/usr/X11R7/lib/libX11.a
106#	etc..
107#	NB:	If you are a library here, add it in bsd.README
108
109_LIBLIST=\
110	archive \
111	asn1 \
112	atf_c \
113	atf_cxx \
114	bind9 \
115	blocklist \
116	bluetooth \
117	bsdmalloc \
118	bz2 \
119	c \
120	c_pic \
121	cbor \
122	com_err \
123	compat \
124	crypt \
125	crypto \
126	curses \
127	cxx \
128	des \
129	dns \
130	edit \
131	event \
132	event_openssl \
133	event_pthreads \
134	execinfo \
135	expat \
136	fetch \
137	fl \
138	fido2 \
139	form \
140	gcc \
141	gnuctf \
142	gnumalloc \
143	gssapi \
144	hdb \
145	heimbase \
146	heimntlm \
147	hx509 \
148	intl \
149	ipsec \
150	isc \
151	isccc \
152	isccfg \
153	kadm5clnt \
154	kadm5srv \
155	kafs \
156	krb5 \
157	kvm \
158	l \
159	lber \
160	ldap \
161	ldap_r \
162	lua \
163	m \
164	magic \
165	menu \
166	netpgpverify \
167	ns \
168	objc \
169	ossaudio \
170	panel \
171	pam \
172	pcap \
173	pci \
174	posix \
175	pthread \
176	puffs \
177	quota \
178	radius \
179	refuse \
180	resolv \
181	rmt \
182	roken \
183	rpcsvc \
184	rt \
185	rump \
186	rumpfs_cd9660 \
187	rumpfs_efs \
188	rumpfs_ext2fs \
189	rumpfs_ffs \
190	rumpfs_hfs \
191	rumpfs_lfs \
192	rumpfs_msdos \
193	rumpfs_nfs \
194	rumpfs_ntfs \
195	rumpfs_syspuffs \
196	rumpfs_tmpfs \
197	rumpfs_udf \
198	rumpuser \
199	saslc \
200	skey \
201	sl \
202	sqlite3 \
203	ssh \
204	ssl \
205	stdc++ \
206	supc++ \
207	terminfo \
208	tre \
209	unbound \
210	usbhid \
211	util \
212	wind \
213	wrap \
214	y \
215	z
216
217.for _lib in ${_LIBLIST}
218.ifndef LIB${_lib:tu}
219LIB${_lib:tu}=	${DESTDIR}/usr/lib/lib${_lib:S/xx/++/:S/atf_c/atf-c/}.a
220.MADE:		${LIB${_lib:tu}}	# Note: ${DESTDIR} will be expanded
221.endif
222.endfor
223
224.if (${MKKERBEROS} != "no")
225# Kerberos5 applications
226LIBKRB5_LDADD+= -lkrb5 -lcom_err \
227	-lhx509 -lcrypto -lasn1 \
228	-lwind -lheimbase -lcom_err -lroken \
229	-lsqlite3 -lcrypt -lutil
230LIBKRB5_DPADD+= ${LIBKRB5} ${LIBCOM_ERR} \
231	${LIBHX509} ${LIBCRYPTO} ${LIBASN1} \
232	${LIBWIND} ${LIBHEIMBASE} ${LIBCOM_ERR} ${LIBROKEN} \
233	${LIBSQLITE3} ${LIBCRYPT}  ${LIBUTIL}
234.endif
235
236# PAM applications, if linked statically, need more libraries
237.if (${MKPIC} == "no")
238PAM_STATIC_LDADD+= -lssh
239PAM_STATIC_DPADD+= ${LIBSSH}
240.if (${MKKERBEROS} != "no")
241PAM_STATIC_LDADD+= -lkafs -lkrb5 -lhx509 -lwind -lasn1 \
242	-lroken -lcom_err -lheimbase -lcrypto -lsqlite3
243PAM_STATIC_DPADD+= ${LIBKAFS} ${LIBKRB5} ${LIBHX509} ${LIBWIND} ${LIBASN1} \
244	${LIBROKEN} ${LIBCOM_ERR} ${LIBHEIMBASE} ${LIBCRYPTO} ${LIBSQLITE3}
245.endif
246.if (${MKSKEY} != "no")
247PAM_STATIC_LDADD+= -lskey
248PAM_STATIC_DPADD+= ${LIBSKEY}
249.endif
250PAM_STATIC_LDADD+= -lradius -lcrypt -lrpcsvc -lutil
251PAM_STATIC_DPADD+= ${LIBRADIUS} ${LIBCRYPT} ${LIBRPCSVC} ${LIBUTIL}
252.else
253PAM_STATIC_LDADD=
254PAM_STATIC_DPADD=
255.endif
256
257#	NB:	If you are a library here, add it in bsd.README
258#	This list is sorted with -f so that it matches the order in bsd.README
259_X11LIBLIST= dps fntstubs fontcache fontconfig fontenc freetype FS GL GLU \
260    ICE lbxutil SM X11 X11_xcb Xau Xaw xcb Xdmcp Xext Xfont Xfont2 Xft Xi \
261    Xinerama xkbfile Xmu Xmuu Xpm Xrandr Xrender Xss Xt XTrap Xtst Xv Xxf86dga \
262    Xxf86misc Xxf86vm
263
264.for _lib in ${_X11LIBLIST}
265.ifndef LIB${_lib:tu}
266LIB${_lib:tu}=	${DESTDIR}${X11USRLIBDIR}/lib${_lib}.a
267.MADE:		${LIB${_lib:tu}}	# Note: ${DESTDIR} will be expanded
268.endif
269.endfor
270
271# Ugly one-offs
272LIBX11_XCB=	${DESTDIR}${X11USRLIBDIR}/libX11-xcb.a
273LIBXCB=	${DESTDIR}${X11USRLIBDIR}/libxcb.a
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
391LDADD+=		-L${PROGDO.${_lib}} -l${_lib}
392.if exists(${PROGDO.${_lib}}/lib${_lib}_pic.a)
393DPADD+=		${PROGDO.${_lib}}/lib${_lib}_pic.a
394.elif exists(${PROGDO.${_lib}}/lib${_lib}.so)
395DPADD+=		${PROGDO.${_lib}}/lib${_lib}.so
396.else
397DPADD+=		${PROGDO.${_lib}}/lib${_lib}.a
398.endif
399.endfor
400.endif									# }
401#
402# Per-program definitions and targets.
403#
404
405_CCLINK.CDEFAULT= ${CC} ${_CCLINKFLAGS}
406# Definitions specific to C programs.
407.for _P in ${PROGS}
408SRCS.${_P}?=	${_P}.c
409_CCLINK.${_P}=	${CC} ${_CCLINKFLAGS}
410_CFLAGS.${_P}=	${CFLAGS} ${CPUFLAGS}
411_CPPFLAGS.${_P}=	${CPPFLAGS}
412_COPTS.${_P}=	${COPTS}
413.endfor
414
415_CCLINK.CXXDEFAULT= ${CXX} ${_CCLINKFLAGS}
416# Definitions specific to C++ programs.
417.for _P in ${PROGS_CXX}
418SRCS.${_P}?=	${_P}.cc
419_CCLINK.${_P}=	${CXX} ${_CCLINKFLAGS}
420.endfor
421
422# Language-independent definitions.
423.for _P in ${PROGS} ${PROGS_CXX}					# {
424
425BINDIR.${_P}?=		${BINDIR}
426PROGNAME.${_P}?=	${_P}
427
428.if ${MKDEBUG:Uno} != "no" && !defined(NODEBUG) && !commands(${_P}) && \
429    empty(SRCS.${_P}:M*.sh)
430_PROGDEBUG.${_P}:=	${PROGNAME.${_P}}.debug
431.endif
432
433# paxctl specific arguments
434
435.if defined(PAXCTL_FLAGS)
436PAXCTL_FLAGS.${_P}?= ${PAXCTL_FLAGS}
437.endif
438
439.if ${MKSANITIZER:Uno} == "yes" && \
440	(${USE_SANITIZER} == "address" || ${USE_SANITIZER} == "thread" || \
441	${USE_SANITIZER} == "memory")
442PAXCTL_FLAGS.${_P}= +a
443.endif
444
445##### PROG specific flags.
446
447_DPADD.${_P}=		${DPADD}    ${DPADD.${_P}}
448_LDADD.${_P}=		${LDADD}    ${LDADD.${_P}}
449_LDFLAGS.${_P}=		${LDFLAGS}  ${LDFLAGS.${_P}}
450.if ${MKSANITIZER} != "yes"
451# Sanitizers don't support static build.
452_LDSTATIC.${_P}=	${LDSTATIC} ${LDSTATIC.${_P}}
453.endif
454
455##### Build and install rules
456.if !empty(_APPEND_SRCS:M[Yy][Ee][Ss])
457SRCS+=		${SRCS.${_P}}	# For bsd.dep.mk
458.endif
459
460_YPSRCS.${_P}=	${SRCS.${_P}:M*.[ly]:C/\..$/.c/} ${YHEADER:D${SRCS.${_P}:M*.y:.y=.h}}
461
462DPSRCS+=		${_YPSRCS.${_P}}
463CLEANFILES+=		${_YPSRCS.${_P}}
464
465.if !empty(SRCS.${_P}:N*.h:N*.sh:N*.fth)
466OBJS.${_P}+=	${SRCS.${_P}:N*.h:N*.sh:N*.fth:R:S/$/.o/g}
467LOBJS.${_P}+=	${LSRCS:.c=.ln} ${SRCS.${_P}:M*.c:.c=.ln}
468.endif
469
470.if defined(OBJS.${_P}) && !empty(OBJS.${_P})			# {
471.NOPATH: ${OBJS.${_P}} ${_P} ${_YPSRCS.${_P}}
472
473.if (defined(USE_COMBINE) && ${USE_COMBINE} != "no" && !commands(${_P}) \
474   && (${_CCLINK.${_P}} == ${_CCLINK.CDEFAULT} \
475       || ${_CCLINK.${_P}} == ${_CCLINK.CXXDEFAULT}) \
476   && !defined(NOCOMBINE.${_P}) && !defined(NOCOMBINE))
477.for f in ${SRCS.${_P}:N*.h:N*.sh:N*.fth:C/\.[yl]$/.c/g}
478#_XFLAGS.$f := ${CPPFLAGS.$f:D1} ${CPUFLAGS.$f:D2} \
479#     ${COPTS.$f:D3} ${OBJCOPTS.$f:D4} ${CXXFLAGS.$f:D5}
480.if (${CPPFLAGS.$f:D1} == "1" || ${CPUFLAGS.$f:D2} == "2" \
481     || ${COPTS.$f:D3} == "3" || ${OBJCOPTS.$f:D4} == "4" \
482     || ${CXXFLAGS.$f:D5} == "5") \
483    || ("${f:M*.[cyl]}" == "" || commands(${f:R:S/$/.o/}))
484XOBJS.${_P}+=	${f:R:S/$/.o/}
485.else
486XSRCS.${_P}+=	${f}
487NODPSRCS+=	${f}
488.endif
489.endfor
490
491${_P}: .gdbinit ${LIBCRT0} ${LIBCRTI} ${XOBJS.${_P}} ${SRCS.${_P}} \
492    ${DPSRCS} ${LIBC} ${LIBCRTBEGIN} ${LIBCRTEND} ${_DPADD.${_P}}
493	${_MKTARGET_LINK}
494.if defined(DESTDIR)
495	${_CCLINK.${_P}} -Wl,-nostdlib \
496	    ${_LDFLAGS.${_P}} ${_LDSTATIC.${_P}} -o ${.TARGET} ${_PROGLDOPTS} \
497	    -B${_GCC_CRTDIR}/ -B${DESTDIR}/usr/lib/ \
498	    -MD --combine ${_CPPFLAGS.${_P}} ${_CFLAGS.${_P}} ${_COPTS.${_P}} \
499	    ${XSRCS.${_P}:@.SRC.@${.ALLSRC:M*.c:M*${.SRC.}}@:O:u} ${XOBJS.${_P}} \
500	    ${_LDADD.${_P}} -L${_GCC_LIBGCCDIR} -L${DESTDIR}/usr/lib
501.else
502	${_CCLINK.${_P}} ${_LDFLAGS.${_P}} ${_LDSTATIC.${_P}} -o ${.TARGET} ${_PROGLDOPTS} \
503	    -MD --combine ${_CPPFLAGS.${_P}} ${_COPTS.${_P}}
504	    ${XSRCS.${_P}:@.SRC.@${.ALLSRC:M*.c:M*${.SRC.}}@:O:u} ${XOBJS.${_P}} \
505	    ${_LDADD.${_P}}
506.endif	# defined(DESTDIR)
507.if defined(CTFMERGE)
508	${CTFMERGE} ${CTFMFLAGS} -o ${.TARGET} ${OBJS.${_P}}
509.endif
510.if defined(PAXCTL_FLAGS.${_P})
511	${PAXCTL} ${PAXCTL_FLAGS.${_P}} ${.TARGET}
512.endif
513.if ${MKSTRIPIDENT} != "no"
514	${OBJCOPY} -R .ident ${.TARGET}
515.endif
516
517CLEANFILES+=	${_P}.d
518.if exists(${_P}.d)
519.include "${_P}.d"		# include -MD depend for program.
520.endif
521.else	# USE_COMBINE
522
523${OBJS.${_P}} ${LOBJS.${_P}}: ${DPSRCS}
524
525${_P}: .gdbinit ${LIBCRT0} ${LIBCRTI} ${OBJS.${_P}} ${LIBC} ${LIBCRTBEGIN} \
526    ${LIBCRTEND} ${_DPADD.${_P}}
527.if !commands(${_P})
528	${_MKTARGET_LINK}
529	${_CCLINK.${_P}} \
530	    ${_LDFLAGS.${_P}} ${_LDSTATIC.${_P}} -o ${.TARGET} \
531	    ${OBJS.${_P}} ${_PROGLDOPTS} ${_LDADD.${_P}}
532.if defined(CTFMERGE)
533	${CTFMERGE} ${CTFMFLAGS} -o ${.TARGET} ${OBJS.${_P}}
534.endif
535.if defined(PAXCTL_FLAGS.${_P})
536	${PAXCTL} ${PAXCTL_FLAGS.${_P}} ${.TARGET}
537.endif
538.if ${MKSTRIPIDENT} != "no"
539	${OBJCOPY} -R .ident ${.TARGET}
540.endif
541.endif	# !commands(${_P})
542.endif	# USE_COMBINE
543
544${_P}.ro: ${OBJS.${_P}} ${_DPADD.${_P}}
545	${_MKTARGET_LINK}
546	${CC} ${LDFLAGS:N-pie} -nostdlib -r -Wl,-dc -o ${.TARGET} ${OBJS.${_P}}
547
548.if defined(_PROGDEBUG.${_P})
549${_PROGDEBUG.${_P}}: ${_P}
550	${_MKTARGET_CREATE}
551	(  ${OBJCOPY} --only-keep-debug ${_P} ${_PROGDEBUG.${_P}} \
552	&& ${OBJCOPY} --strip-debug -p -R .gnu_debuglink \
553		--add-gnu-debuglink=${_PROGDEBUG.${_P}} ${_P} \
554	) || (rm -f ${_PROGDEBUG.${_P}}; false)
555.endif
556
557.endif	# defined(OBJS.${_P}) && !empty(OBJS.${_P})			# }
558
559.if !defined(MAN.${_P})
560MAN.${_P}=	${_P}.1
561.endif	# !defined(MAN.${_P})
562.if !empty(_APPEND_MANS:M[Yy][Ee][Ss])
563MAN+=		${MAN.${_P}}
564.endif
565
566realall: ${_P} ${_PROGDEBUG.${_P}}
567
568CLEANFILES+= ${_P} ${_PROGDEBUG.${_P}}
569
570.if defined(OBJS.${_P}) && !empty(OBJS.${_P})
571CLEANFILES+= ${OBJS.${_P}} ${LOBJS.${_P}}
572.endif
573
574_PROG_INSTALL+=	proginstall-${_P}
575
576.if !target(proginstall-${_P})						# {
577proginstall-${_P}::	${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}} \
578		${_PROGDEBUG.${_P}:D${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}}
579.PRECIOUS:	${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}} \
580		${_PROGDEBUG.${_P}:D${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}}
581
582.if ${MKUPDATE} == "no"
583.if defined(_RUMPINSTALL.${_P})
584${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}! ${_P} __progrumpinstall
585.else
586${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}! ${_P} __proginstall
587.endif
588.if !defined(BUILD) && !make(all) && !make(${_P})
589${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}! .MADE
590.endif
591.if defined(_PROGDEBUG.${_P})
592${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}! ${_PROGDEBUG.${_P}} __progdebuginstall
593.if !defined(BUILD) && !make(all) && !make(${_P})
594${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}! .MADE
595.endif
596.endif	#  define(_PROGDEBUG.${_P})
597.else	# MKUPDATE != no
598.if defined(_RUMPINSTALL.${_P})
599${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}: ${_P} __progrumpinstall
600.else
601${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}: ${_P} __proginstall
602.endif
603.if !defined(BUILD) && !make(all) && !make(${_P})
604${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}: .MADE
605.endif
606.if defined(_PROGDEBUG.${_P})
607${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}: ${_PROGDEBUG.${_P}} __progdebuginstall
608.if !defined(BUILD) && !make(all) && !make(${_P})
609${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}: .MADE
610.endif
611.endif	#  defined(_PROGDEBUG.${_P})
612.endif	# MKUPDATE != no
613
614.endif	# !target(proginstall-${_P})					# }
615
616lint: lint-${_P}
617lint-${_P}: ${LOBJS.${_P}}
618.if defined(LOBJS.${_P}) && !empty(LOBJS.${_P})
619	${LINT} ${LINTFLAGS} ${_LDFLAGS.${_P}:C/-L[  ]*/-L/Wg:M-L*} ${LOBJS.${_P}} ${_LDADD.${_P}}
620.endif
621
622.endfor # _P in ${PROGS} ${PROGS_CXX}					# }
623
624.if defined(OBJS) && !empty(OBJS) && \
625    (empty(PROGS) && empty(PROGS_CXX))
626CLEANFILES+= ${OBJS} ${LOBJS}
627.endif
628
629.if !target(proginstall)
630proginstall:: ${_PROG_INSTALL}
631.endif
632.PHONY:		proginstall
633
634
635
636realall: ${SCRIPTS}
637.if defined(SCRIPTS) && !target(scriptsinstall)				# {
638SCRIPTSDIR?=${BINDIR}
639SCRIPTSOWN?=${BINOWN}
640SCRIPTSGRP?=${BINGRP}
641SCRIPTSMODE?=${BINMODE}
642
643scriptsinstall:: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@}
644.PRECIOUS: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@}
645
646__scriptinstall: .USE
647	${_MKTARGET_INSTALL}
648	${INSTALL_FILE} \
649	    -o ${SCRIPTSOWN_${.ALLSRC:T}:U${SCRIPTSOWN}} \
650	    -g ${SCRIPTSGRP_${.ALLSRC:T}:U${SCRIPTSGRP}} \
651	    -m ${SCRIPTSMODE_${.ALLSRC:T}:U${SCRIPTSMODE}} \
652	    ${.ALLSRC} ${.TARGET}
653
654.for S in ${SCRIPTS:O:u}
655.if ${MKUPDATE} == "no"
656${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! ${S} __scriptinstall
657.if !defined(BUILD) && !make(all) && !make(${S})
658${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! .MADE
659.endif
660.else
661${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: ${S} __scriptinstall
662.if !defined(BUILD) && !make(all) && !make(${S})
663${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: .MADE
664.endif
665.endif
666.endfor
667.endif									# }
668
669.if !target(scriptsinstall)
670scriptsinstall::
671.endif
672.PHONY:		scriptsinstall
673
674##### Pull in related .mk logic
675LINKSOWN?= ${BINOWN}
676LINKSGRP?= ${BINGRP}
677LINKSMODE?= ${BINMODE}
678.include <bsd.man.mk>
679.include <bsd.nls.mk>
680.include <bsd.files.mk>
681.include <bsd.inc.mk>
682.include <bsd.links.mk>
683.include <bsd.sys.mk>
684.include <bsd.dep.mk>
685.include <bsd.clang-analyze.mk>
686.include <bsd.clean.mk>
687
688${TARGETS}:	# ensure existence
689
690.endif	# HOSTPROG
691