xref: /netbsd-src/share/mk/bsd.prog.mk (revision e6c7e151de239c49d2e38720a061ed9d1fa99309)
1#	$NetBSD: bsd.prog.mk,v 1.325 2020/03/03 02:25:03 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	bluetooth \
116	bsdmalloc \
117	bz2 \
118	c \
119	c_pic \
120	cbor \
121	com_err \
122	compat \
123	crypt \
124	crypto \
125	curses \
126	cxx \
127	des \
128	dns \
129	edit \
130	event \
131	event_openssl \
132	event_pthreads \
133	execinfo \
134	expat \
135	fetch \
136	fl \
137	fido2 \
138	form \
139	gcc \
140	gnumalloc \
141	gssapi \
142	hdb \
143	heimbase \
144	heimntlm \
145	hx509 \
146	intl \
147	ipsec \
148	isc \
149	isccc \
150	isccfg \
151	kadm5clnt \
152	kadm5srv \
153	kafs \
154	krb5 \
155	kvm \
156	l \
157	lber \
158	ldap \
159	ldap_r \
160	lua \
161	m \
162	magic \
163	menu \
164	netpgpverify \
165	ns \
166	objc \
167	ossaudio \
168	panel \
169	pam \
170	pcap \
171	pci \
172	posix \
173	pthread \
174	puffs \
175	quota \
176	radius \
177	refuse \
178	resolv \
179	rmt \
180	roken \
181	rpcsvc \
182	rt \
183	rump \
184	rumpfs_cd9660 \
185	rumpfs_efs \
186	rumpfs_ext2fs \
187	rumpfs_ffs \
188	rumpfs_hfs \
189	rumpfs_lfs \
190	rumpfs_msdos \
191	rumpfs_nfs \
192	rumpfs_ntfs \
193	rumpfs_syspuffs \
194	rumpfs_tmpfs \
195	rumpfs_udf \
196	rumpuser \
197	saslc \
198	skey \
199	sl \
200	sqlite3 \
201	ssh \
202	ssl \
203	stdc++ \
204	supc++ \
205	terminfo \
206	tre \
207	unbound \
208	usbhid \
209	util \
210	wind \
211	wrap \
212	y \
213	z
214
215.for _lib in ${_LIBLIST}
216.ifndef LIB${_lib:tu}
217LIB${_lib:tu}=	${DESTDIR}/usr/lib/lib${_lib:S/xx/++/:S/atf_c/atf-c/}.a
218.MADE:		${LIB${_lib:tu}}	# Note: ${DESTDIR} will be expanded
219.endif
220.endfor
221
222.if (${MKKERBEROS} != "no")
223LIBKRB5_LDADD+= -lkrb5
224LIBKRB5_DPADD+= ${LIBKRB5}
225# Kerberos5 applications, if linked statically, need more libraries
226LIBKRB5_STATIC_LDADD+= \
227	-lhx509 -lcrypto -lasn1 -lcom_err -lroken \
228	-lwind -lheimbase -lsqlite3 -lcrypt -lutil
229LIBKRB5_STATIC_DPADD+= \
230	${LIBHX509} ${LIBCRYPTO} ${LIBASN1} ${LIBCOM_ERR} ${LIBROKEN} \
231	${LIBWIND} ${LIBHEIMBASE} ${LIBSQLITE3} ${LIBCRYPT}  ${LIBUTIL}
232. if (${MKPIC} == "no")
233LIBKRB5_LDADD+= ${LIBKRB5_STATIC_LDADD}
234LIBKRB5_DPADD+= ${LIBKRB5_STATIC_DPADD}
235. endif
236.endif
237
238# PAM applications, if linked statically, need more libraries
239.if (${MKPIC} == "no")
240PAM_STATIC_LDADD+= -lssh
241PAM_STATIC_DPADD+= ${LIBSSH}
242.if (${MKKERBEROS} != "no")
243PAM_STATIC_LDADD+= -lkafs -lkrb5 -lhx509 -lwind -lasn1 \
244	-lroken -lcom_err -lheimbase -lcrypto -lsqlite3
245PAM_STATIC_DPADD+= ${LIBKAFS} ${LIBKRB5} ${LIBHX509} ${LIBWIND} ${LIBASN1} \
246	${LIBROKEN} ${LIBCOM_ERR} ${LIBHEIMBASE} ${LIBCRYPTO} ${LIBSQLITE3}
247.endif
248.if (${MKSKEY} != "no")
249PAM_STATIC_LDADD+= -lskey
250PAM_STATIC_DPADD+= ${LIBSKEY}
251.endif
252PAM_STATIC_LDADD+= -lradius -lcrypt -lrpcsvc -lutil
253PAM_STATIC_DPADD+= ${LIBRADIUS} ${LIBCRYPT} ${LIBRPCSVC} ${LIBUTIL}
254.else
255PAM_STATIC_LDADD=
256PAM_STATIC_DPADD=
257.endif
258
259#	NB:	If you are a library here, add it in bsd.README
260#	This list is sorted with -f so that it matches the order in bsd.README
261_X11LIBLIST= dps fntstubs fontcache fontconfig fontenc freetype FS GL GLU \
262    ICE lbxutil SM X11 X11_xcb Xau Xaw xcb Xdmcp Xext Xfont Xfont2 Xft Xi \
263    Xinerama xkbfile Xmu Xmuu Xpm Xrandr Xrender Xss Xt XTrap Xtst Xv Xxf86dga \
264    Xxf86misc Xxf86vm
265
266.for _lib in ${_X11LIBLIST}
267.ifndef LIB${_lib:tu}
268LIB${_lib:tu}=	${DESTDIR}${X11USRLIBDIR}/lib${_lib}.a
269.MADE:		${LIB${_lib:tu}}	# Note: ${DESTDIR} will be expanded
270.endif
271.endfor
272
273# Ugly one-offs
274LIBX11_XCB=	${DESTDIR}${X11USRLIBDIR}/libX11-xcb.a
275LIBXCB=	${DESTDIR}${X11USRLIBDIR}/libxcb.a
276
277.if defined(RESCUEDIR)
278CPPFLAGS+=	-DRESCUEDIR=\"${RESCUEDIR}\"
279.endif
280
281_PROGLDOPTS=
282.if ${SHLINKDIR} != "/usr/libexec"	# XXX: change or remove if ld.so moves
283_PROGLDOPTS+=	-Wl,-dynamic-linker=${_SHLINKER}
284.endif
285.if ${SHLIBDIR} != "/usr/lib"
286_PROGLDOPTS+=	-Wl,-rpath,${SHLIBDIR} \
287		-L=${SHLIBDIR}
288.elif ${SHLIBINSTALLDIR} != "/usr/lib"
289_PROGLDOPTS+=	-Wl,-rpath-link,${DESTDIR}${SHLIBINSTALLDIR} \
290		-L=${SHLIBINSTALLDIR}
291.endif
292
293__proginstall: .USE
294	${_MKTARGET_INSTALL}
295	${INSTALL_FILE} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \
296		${STRIPFLAG} ${.ALLSRC} ${.TARGET}
297
298__progrumpinstall: .USE
299	${_MKTARGET_INSTALL}
300	${INSTALL_FILE} -o ${RUMPBINOWN} -g ${RUMPBINGRP} -m ${RUMPBINMODE} \
301		${STRIPFLAG} ${.ALLSRC} ${.TARGET}
302
303__progdebuginstall: .USE
304	${_MKTARGET_INSTALL}
305	${INSTALL_FILE} -o ${DEBUGOWN} -g ${DEBUGGRP} -m ${DEBUGMODE} \
306		${.ALLSRC} ${.TARGET}
307
308
309
310#
311# Backwards compatibility with Makefiles that assume that bsd.prog.mk
312# can only build a single binary.
313#
314
315_APPEND_MANS=yes
316_APPEND_SRCS=yes
317
318_CCLINKFLAGS=
319
320.if defined(PROG_CXX)
321PROG=		${PROG_CXX}
322_CCLINK=	${CXX} ${_CCLINKFLAGS}
323.endif
324
325.if defined(RUMPPRG)
326CPPFLAGS+=	-D_KERNTYPES
327PROG=			${RUMPPRG}
328. ifndef CRUNCHEDPROG
329.  if (${MKRUMP} != "no")
330PROGS=			${RUMPPRG} rump.${RUMPPRG}
331.  else
332PROGS=			${RUMPPRG}
333.  endif
334.  if defined(SRCS)
335.   if (${MKRUMP} != "no")
336SRCS.rump.${PROG}:=	${SRCS} ${PROG}_rumpops.c ${RUMPSRCS}
337.   endif
338SRCS+=			${PROG}_hostops.c
339.  else
340SRCS=			${PROG}.c ${PROG}_hostops.c
341.   if (${MKRUMP} != "no")
342SRCS.rump.${PROG}=	${PROG}.c ${PROG}_rumpops.c ${RUMPSRCS}
343.   endif
344.  endif
345.   if (${MKRUMP} != "no")
346DPSRCS+=		${PROG}_rumpops.c ${RUMPSRCS}
347LDADD.rump.${PROG}+=	${LDADD.rump} -lrumpclient
348DPADD.rump.${PROG}+=	${DPADD.rump} ${LIBRUMPCLIENT}
349MAN.rump.${PROG}=	# defined but feeling empty
350_RUMPINSTALL.rump.${PROG}=# defined
351.   endif
352. else # CRUNCHEDPROG
353PROGS=			${PROG}
354CPPFLAGS+=		-DCRUNCHOPS
355. endif
356.endif
357
358.if defined(PROG)
359_CCLINK?=	${CC} ${_CCLINKFLAGS}
360.  if defined(MAN)
361MAN.${PROG}=	${MAN}
362_APPEND_MANS=	no
363.  endif
364.  if !defined(OBJS)
365OBJS=		${OBJS.${PROG}}
366.  endif
367.  if defined(PROGNAME)
368PROGNAME.${PROG}=	${PROGNAME}
369.  endif
370.  if defined(SRCS)
371SRCS.${PROG}=	${SRCS}
372_APPEND_SRCS=	no
373.  endif
374.endif
375
376# Turn the single-program PROG and PROG_CXX variables into their multi-word
377# counterparts, PROGS and PROGS_CXX.
378.if !defined(RUMPPRG)
379.  if defined(PROG_CXX) && !defined(PROGS_CXX)
380PROGS_CXX=	${PROG_CXX}
381.  elif defined(PROG) && !defined(PROGS)
382PROGS=		${PROG}
383.  endif
384.endif
385
386##### Libraries that this may depend upon.
387.if defined(PROGDPLIBS) 						# {
388.for _lib _dir in ${PROGDPLIBS}
389.if !defined(BINDO.${_lib})
390PROGDO.${_lib}!=	cd "${_dir}" && ${PRINTOBJDIR}
391.MAKEOVERRIDES+=PROGDO.${_lib}
392.endif
393LDADD+=		-L${PROGDO.${_lib}} -l${_lib}
394.if exists(${PROGDO.${_lib}}/lib${_lib}_pic.a)
395DPADD+=		${PROGDO.${_lib}}/lib${_lib}_pic.a
396.elif exists(${PROGDO.${_lib}}/lib${_lib}.so)
397DPADD+=		${PROGDO.${_lib}}/lib${_lib}.so
398.else
399DPADD+=		${PROGDO.${_lib}}/lib${_lib}.a
400.endif
401.endfor
402.endif									# }
403#
404# Per-program definitions and targets.
405#
406
407_CCLINK.CDEFAULT= ${CC} ${_CCLINKFLAGS}
408# Definitions specific to C programs.
409.for _P in ${PROGS}
410SRCS.${_P}?=	${_P}.c
411_CCLINK.${_P}=	${CC} ${_CCLINKFLAGS}
412_CFLAGS.${_P}=	${CFLAGS} ${CPUFLAGS}
413_CPPFLAGS.${_P}=	${CPPFLAGS}
414_COPTS.${_P}=	${COPTS}
415.endfor
416
417_CCLINK.CXXDEFAULT= ${CXX} ${_CCLINKFLAGS}
418# Definitions specific to C++ programs.
419.for _P in ${PROGS_CXX}
420SRCS.${_P}?=	${_P}.cc
421_CCLINK.${_P}=	${CXX} ${_CCLINKFLAGS}
422.endfor
423
424# Language-independent definitions.
425.for _P in ${PROGS} ${PROGS_CXX}					# {
426
427BINDIR.${_P}?=		${BINDIR}
428PROGNAME.${_P}?=	${_P}
429
430.if ${MKDEBUG:Uno} != "no" && !defined(NODEBUG) && !commands(${_P}) && \
431    empty(SRCS.${_P}:M*.sh)
432_PROGDEBUG.${_P}:=	${PROGNAME.${_P}}.debug
433.endif
434
435# paxctl specific arguments
436
437.if defined(PAXCTL_FLAGS)
438PAXCTL_FLAGS.${_P}?= ${PAXCTL_FLAGS}
439.endif
440
441.if ${MKSANITIZER:Uno} == "yes" && \
442	(${USE_SANITIZER} == "address" || ${USE_SANITIZER} == "thread" || \
443	${USE_SANITIZER} == "memory")
444PAXCTL_FLAGS.${_P}= +a
445.endif
446
447##### PROG specific flags.
448
449_DPADD.${_P}=		${DPADD}    ${DPADD.${_P}}
450_LDADD.${_P}=		${LDADD}    ${LDADD.${_P}}
451_LDFLAGS.${_P}=		${LDFLAGS}  ${LDFLAGS.${_P}}
452.if ${MKSANITIZER} != "yes"
453# Sanitizers don't support static build.
454_LDSTATIC.${_P}=	${LDSTATIC} ${LDSTATIC.${_P}}
455.endif
456
457##### Build and install rules
458.if !empty(_APPEND_SRCS:M[Yy][Ee][Ss])
459SRCS+=		${SRCS.${_P}}	# For bsd.dep.mk
460.endif
461
462_YPSRCS.${_P}=	${SRCS.${_P}:M*.[ly]:C/\..$/.c/} ${YHEADER:D${SRCS.${_P}:M*.y:.y=.h}}
463
464DPSRCS+=		${_YPSRCS.${_P}}
465CLEANFILES+=		${_YPSRCS.${_P}}
466
467.if !empty(SRCS.${_P}:N*.h:N*.sh:N*.fth)
468OBJS.${_P}+=	${SRCS.${_P}:N*.h:N*.sh:N*.fth:R:S/$/.o/g}
469LOBJS.${_P}+=	${LSRCS:.c=.ln} ${SRCS.${_P}:M*.c:.c=.ln}
470.endif
471
472.if defined(OBJS.${_P}) && !empty(OBJS.${_P})			# {
473.NOPATH: ${OBJS.${_P}} ${_P} ${_YPSRCS.${_P}}
474
475.if (defined(USE_COMBINE) && ${USE_COMBINE} != "no" && !commands(${_P}) \
476   && (${_CCLINK.${_P}} == ${_CCLINK.CDEFAULT} \
477       || ${_CCLINK.${_P}} == ${_CCLINK.CXXDEFAULT}) \
478   && !defined(NOCOMBINE.${_P}) && !defined(NOCOMBINE))
479.for f in ${SRCS.${_P}:N*.h:N*.sh:N*.fth:C/\.[yl]$/.c/g}
480#_XFLAGS.$f := ${CPPFLAGS.$f:D1} ${CPUFLAGS.$f:D2} \
481#     ${COPTS.$f:D3} ${OBJCOPTS.$f:D4} ${CXXFLAGS.$f:D5}
482.if (${CPPFLAGS.$f:D1} == "1" || ${CPUFLAGS.$f:D2} == "2" \
483     || ${COPTS.$f:D3} == "3" || ${OBJCOPTS.$f:D4} == "4" \
484     || ${CXXFLAGS.$f:D5} == "5") \
485    || ("${f:M*.[cyl]}" == "" || commands(${f:R:S/$/.o/}))
486XOBJS.${_P}+=	${f:R:S/$/.o/}
487.else
488XSRCS.${_P}+=	${f}
489NODPSRCS+=	${f}
490.endif
491.endfor
492
493${_P}: .gdbinit ${LIBCRT0} ${LIBCRTI} ${XOBJS.${_P}} ${SRCS.${_P}} \
494    ${DPSRCS} ${LIBC} ${LIBCRTBEGIN} ${LIBCRTEND} ${_DPADD.${_P}}
495	${_MKTARGET_LINK}
496.if defined(DESTDIR)
497	${_CCLINK.${_P}} -Wl,-nostdlib \
498	    ${_LDFLAGS.${_P}} ${_LDSTATIC.${_P}} -o ${.TARGET} ${_PROGLDOPTS} \
499	    -B${_GCC_CRTDIR}/ -B${DESTDIR}/usr/lib/ \
500	    -MD --combine ${_CPPFLAGS.${_P}} ${_CFLAGS.${_P}} ${_COPTS.${_P}} \
501	    ${XSRCS.${_P}:@.SRC.@${.ALLSRC:M*.c:M*${.SRC.}}@:O:u} ${XOBJS.${_P}} \
502	    ${_LDADD.${_P}} -L${_GCC_LIBGCCDIR} -L${DESTDIR}/usr/lib
503.else
504	${_CCLINK.${_P}} ${_LDFLAGS.${_P}} ${_LDSTATIC.${_P}} -o ${.TARGET} ${_PROGLDOPTS} \
505	    -MD --combine ${_CPPFLAGS.${_P}} ${_COPTS.${_P}}
506	    ${XSRCS.${_P}:@.SRC.@${.ALLSRC:M*.c:M*${.SRC.}}@:O:u} ${XOBJS.${_P}} \
507	    ${_LDADD.${_P}}
508.endif	# defined(DESTDIR)
509.if defined(CTFMERGE)
510	${CTFMERGE} ${CTFMFLAGS} -o ${.TARGET} ${OBJS.${_P}}
511.endif
512.if defined(PAXCTL_FLAGS.${_P})
513	${PAXCTL} ${PAXCTL_FLAGS.${_P}} ${.TARGET}
514.endif
515.if ${MKSTRIPIDENT} != "no"
516	${OBJCOPY} -R .ident ${.TARGET}
517.endif
518
519CLEANFILES+=	${_P}.d
520.if exists(${_P}.d)
521.include "${_P}.d"		# include -MD depend for program.
522.endif
523.else	# USE_COMBINE
524
525${OBJS.${_P}} ${LOBJS.${_P}}: ${DPSRCS}
526
527${_P}: .gdbinit ${LIBCRT0} ${LIBCRTI} ${OBJS.${_P}} ${LIBC} ${LIBCRTBEGIN} \
528    ${LIBCRTEND} ${_DPADD.${_P}}
529.if !commands(${_P})
530	${_MKTARGET_LINK}
531	${_CCLINK.${_P}} \
532	    ${_LDFLAGS.${_P}} ${_LDSTATIC.${_P}} -o ${.TARGET} \
533	    ${OBJS.${_P}} ${_PROGLDOPTS} ${_LDADD.${_P}}
534.if defined(CTFMERGE)
535	${CTFMERGE} ${CTFMFLAGS} -o ${.TARGET} ${OBJS.${_P}}
536.endif
537.if defined(PAXCTL_FLAGS.${_P})
538	${PAXCTL} ${PAXCTL_FLAGS.${_P}} ${.TARGET}
539.endif
540.if ${MKSTRIPIDENT} != "no"
541	${OBJCOPY} -R .ident ${.TARGET}
542.endif
543.endif	# !commands(${_P})
544.endif	# USE_COMBINE
545
546${_P}.ro: ${OBJS.${_P}} ${_DPADD.${_P}}
547	${_MKTARGET_LINK}
548	${CC} ${LDFLAGS:N-pie} -nostdlib -r -Wl,-dc -o ${.TARGET} ${OBJS.${_P}}
549
550.if defined(_PROGDEBUG.${_P})
551${_PROGDEBUG.${_P}}: ${_P}
552	${_MKTARGET_CREATE}
553	(  ${OBJCOPY} --only-keep-debug ${_P} ${_PROGDEBUG.${_P}} \
554	&& ${OBJCOPY} --strip-debug -p -R .gnu_debuglink \
555		--add-gnu-debuglink=${_PROGDEBUG.${_P}} ${_P} \
556	) || (rm -f ${_PROGDEBUG.${_P}}; false)
557.endif
558
559.endif	# defined(OBJS.${_P}) && !empty(OBJS.${_P})			# }
560
561.if !defined(MAN.${_P})
562MAN.${_P}=	${_P}.1
563.endif	# !defined(MAN.${_P})
564.if !empty(_APPEND_MANS:M[Yy][Ee][Ss])
565MAN+=		${MAN.${_P}}
566.endif
567
568realall: ${_P} ${_PROGDEBUG.${_P}}
569
570CLEANFILES+= ${_P} ${_PROGDEBUG.${_P}}
571
572.if defined(OBJS.${_P}) && !empty(OBJS.${_P})
573CLEANFILES+= ${OBJS.${_P}} ${LOBJS.${_P}}
574.endif
575
576_PROG_INSTALL+=	proginstall-${_P}
577
578.if !target(proginstall-${_P})						# {
579proginstall-${_P}::	${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}} \
580		${_PROGDEBUG.${_P}:D${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}}
581.PRECIOUS:	${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}} \
582		${_PROGDEBUG.${_P}:D${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}}
583
584.if ${MKUPDATE} == "no"
585.if defined(_RUMPINSTALL.${_P})
586${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}! ${_P} __progrumpinstall
587.else
588${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}! ${_P} __proginstall
589.endif
590.if !defined(BUILD) && !make(all) && !make(${_P})
591${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}! .MADE
592.endif
593.if defined(_PROGDEBUG.${_P})
594${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}! ${_PROGDEBUG.${_P}} __progdebuginstall
595.if !defined(BUILD) && !make(all) && !make(${_P})
596${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}! .MADE
597.endif
598.endif	#  define(_PROGDEBUG.${_P})
599.else	# MKUPDATE != no
600.if defined(_RUMPINSTALL.${_P})
601${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}: ${_P} __progrumpinstall
602.else
603${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}: ${_P} __proginstall
604.endif
605.if !defined(BUILD) && !make(all) && !make(${_P})
606${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}: .MADE
607.endif
608.if defined(_PROGDEBUG.${_P})
609${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}: ${_PROGDEBUG.${_P}} __progdebuginstall
610.if !defined(BUILD) && !make(all) && !make(${_P})
611${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}: .MADE
612.endif
613.endif	#  defined(_PROGDEBUG.${_P})
614.endif	# MKUPDATE != no
615
616.endif	# !target(proginstall-${_P})					# }
617
618lint: lint-${_P}
619lint-${_P}: ${LOBJS.${_P}}
620.if defined(LOBJS.${_P}) && !empty(LOBJS.${_P})
621	${LINT} ${LINTFLAGS} ${_LDFLAGS.${_P}:C/-L[  ]*/-L/Wg:M-L*} ${LOBJS.${_P}} ${_LDADD.${_P}}
622.endif
623
624.endfor # _P in ${PROGS} ${PROGS_CXX}					# }
625
626.if defined(OBJS) && !empty(OBJS) && \
627    (empty(PROGS) && empty(PROGS_CXX))
628CLEANFILES+= ${OBJS} ${LOBJS}
629.endif
630
631.if !target(proginstall)
632proginstall:: ${_PROG_INSTALL}
633.endif
634.PHONY:		proginstall
635
636
637
638realall: ${SCRIPTS}
639.if defined(SCRIPTS) && !target(scriptsinstall)				# {
640SCRIPTSDIR?=${BINDIR}
641SCRIPTSOWN?=${BINOWN}
642SCRIPTSGRP?=${BINGRP}
643SCRIPTSMODE?=${BINMODE}
644
645scriptsinstall:: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@}
646.PRECIOUS: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@}
647
648__scriptinstall: .USE
649	${_MKTARGET_INSTALL}
650	${INSTALL_FILE} \
651	    -o ${SCRIPTSOWN_${.ALLSRC:T}:U${SCRIPTSOWN}} \
652	    -g ${SCRIPTSGRP_${.ALLSRC:T}:U${SCRIPTSGRP}} \
653	    -m ${SCRIPTSMODE_${.ALLSRC:T}:U${SCRIPTSMODE}} \
654	    ${.ALLSRC} ${.TARGET}
655
656.for S in ${SCRIPTS:O:u}
657.if ${MKUPDATE} == "no"
658${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! ${S} __scriptinstall
659.if !defined(BUILD) && !make(all) && !make(${S})
660${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! .MADE
661.endif
662.else
663${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: ${S} __scriptinstall
664.if !defined(BUILD) && !make(all) && !make(${S})
665${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: .MADE
666.endif
667.endif
668.endfor
669.endif									# }
670
671.if !target(scriptsinstall)
672scriptsinstall::
673.endif
674.PHONY:		scriptsinstall
675
676##### Pull in related .mk logic
677LINKSOWN?= ${BINOWN}
678LINKSGRP?= ${BINGRP}
679LINKSMODE?= ${BINMODE}
680.include <bsd.man.mk>
681.include <bsd.nls.mk>
682.include <bsd.files.mk>
683.include <bsd.inc.mk>
684.include <bsd.links.mk>
685.include <bsd.sys.mk>
686.include <bsd.dep.mk>
687.include <bsd.clang-analyze.mk>
688.include <bsd.clean.mk>
689
690${TARGETS}:	# ensure existence
691
692.endif	# HOSTPROG
693