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