xref: /netbsd-src/share/mk/bsd.prog.mk (revision 7788a0781fe6ff2cce37368b4578a7ade0850cb1)
1#	$NetBSD: bsd.prog.mk,v 1.284 2013/05/31 06:48:43 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
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# Ugly one-offs
273LIBX11_XCB=	${DESTDIR}${X11USRLIBDIR}/libX11-xcb.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)
324PROG=			${RUMPPRG}
325. ifndef CRUNCHEDPROG
326.  if (${MKRUMP} != "no")
327PROGS=			${RUMPPRG} rump.${RUMPPRG}
328.  else
329PROGS=			${RUMPPRG}
330.  endif
331.  if defined(SRCS)
332.   if (${MKRUMP} != "no")
333SRCS.rump.${PROG}:=	${SRCS} ${PROG}_rumpops.c ${RUMPSRCS}
334.   endif
335SRCS+=			${PROG}_hostops.c
336.  else
337SRCS=			${PROG}.c ${PROG}_hostops.c
338.   if (${MKRUMP} != "no")
339SRCS.rump.${PROG}=	${PROG}.c ${PROG}_rumpops.c ${RUMPSRCS}
340.   endif
341.  endif
342.   if (${MKRUMP} != "no")
343DPSRCS+=		${PROG}_rumpops.c ${RUMPSRCS}
344LDADD.rump.${PROG}+=	-lrumpclient
345DPADD.rump.${PROG}+=	${LIBRUMPCLIENT}
346MAN.rump.${PROG}=	# defined but feeling empty
347_RUMPINSTALL.rump.${PROG}=# defined
348.   endif
349. else # CRUNCHEDPROG
350PROGS=			${PROG}
351CPPFLAGS+=		-DCRUNCHOPS
352. endif
353.endif
354
355.if defined(PROG)
356_CCLINK?=	${CC} ${_CCLINKFLAGS}
357.  if defined(MAN)
358MAN.${PROG}=	${MAN}
359_APPEND_MANS=	no
360.  endif
361.  if !defined(OBJS)
362OBJS=		${OBJS.${PROG}}
363.  endif
364.  if defined(PROGNAME)
365PROGNAME.${PROG}=	${PROGNAME}
366.  endif
367.  if defined(SRCS)
368SRCS.${PROG}=	${SRCS}
369_APPEND_SRCS=	no
370.  endif
371.endif
372
373# Turn the single-program PROG and PROG_CXX variables into their multi-word
374# counterparts, PROGS and PROGS_CXX.
375.if !defined(RUMPPRG)
376.  if defined(PROG_CXX) && !defined(PROGS_CXX)
377PROGS_CXX=	${PROG_CXX}
378.  elif defined(PROG) && !defined(PROGS)
379PROGS=		${PROG}
380.  endif
381.endif
382
383##### Libraries that this may depend upon.
384.if defined(PROGDPLIBS) 						# {
385.for _lib _dir in ${PROGDPLIBS}
386.if !defined(BINDO.${_lib})
387PROGDO.${_lib}!=	cd "${_dir}" && ${PRINTOBJDIR}
388.MAKEOVERRIDES+=PROGDO.${_lib}
389.endif
390LDADD+=		-L${PROGDO.${_lib}} -l${_lib}
391.if exists(${PROGDO.${_lib}}/lib${_lib}_pic.a)
392DPADD+=		${PROGDO.${_lib}}/lib${_lib}_pic.a
393.elif exists(${PROGDO.${_lib}}/lib${_lib}.so)
394DPADD+=		${PROGDO.${_lib}}/lib${_lib}.so
395.else
396DPADD+=		${PROGDO.${_lib}}/lib${_lib}.a
397.endif
398.endfor
399.endif									# }
400#
401# Per-program definitions and targets.
402#
403
404_CCLINK.CDEFAULT= ${CC} ${_CCLINKFLAGS}
405# Definitions specific to C programs.
406.for _P in ${PROGS}
407SRCS.${_P}?=	${_P}.c
408_CCLINK.${_P}=	${CC} ${_CCLINKFLAGS}
409_CFLAGS.${_P}=	${CFLAGS} ${CPUFLAGS}
410_CPPFLAGS.${_P}=	${CPPFLAGS}
411_COPTS.${_P}=	${COPTS}
412.endfor
413
414_CCLINK.CXXDEFAULT= ${CXX} ${_CCLINKFLAGS}
415# Definitions specific to C++ programs.
416.for _P in ${PROGS_CXX}
417SRCS.${_P}?=	${_P}.cc
418_CCLINK.${_P}=	${CXX} ${_CCLINKFLAGS}
419.endfor
420
421# Language-independent definitions.
422.for _P in ${PROGS} ${PROGS_CXX}					# {
423
424BINDIR.${_P}?=		${BINDIR}
425PROGNAME.${_P}?=	${_P}
426
427.if ${MKDEBUG} != "no" && !commands(${_P})
428_PROGDEBUG.${_P}:=	${PROGNAME.${_P}}.debug
429.endif
430
431.if defined(PAXCTL_FLAGS)
432PAXCTL_FLAGS.${_P}?= ${PAXCTL_FLAGS}
433.endif
434
435##### PROG specific flags.
436
437_DPADD.${_P}=		${DPADD}    ${DPADD.${_P}}
438_LDADD.${_P}=		${LDADD}    ${LDADD.${_P}}
439_LDFLAGS.${_P}=		${LDFLAGS}  ${LDFLAGS.${_P}}
440_LDSTATIC.${_P}=	${LDSTATIC} ${LDSTATIC.${_P}}
441
442##### Build and install rules
443.if !empty(_APPEND_SRCS:M[Yy][Ee][Ss])
444SRCS+=		${SRCS.${_P}}	# For bsd.dep.mk
445.endif
446
447_YPSRCS.${_P}=	${SRCS.${_P}:M*.[ly]:C/\..$/.c/} ${YHEADER:D${SRCS.${_P}:M*.y:.y=.h}}
448
449DPSRCS+=		${_YPSRCS.${_P}}
450CLEANFILES+=		${_YPSRCS.${_P}}
451
452.if !empty(SRCS.${_P}:N*.h:N*.sh:N*.fth)
453OBJS.${_P}+=	${SRCS.${_P}:N*.h:N*.sh:N*.fth:R:S/$/.o/g}
454LOBJS.${_P}+=	${LSRCS:.c=.ln} ${SRCS.${_P}:M*.c:.c=.ln}
455.endif
456
457.if defined(OBJS.${_P}) && !empty(OBJS.${_P})			# {
458.NOPATH: ${OBJS.${_P}} ${_P} ${_YPSRCS.${_P}}
459
460.if (defined(USE_COMBINE) && ${USE_COMBINE} != "no" && !commands(${_P}) \
461   && (${_CCLINK.${_P}} == ${_CCLINK.CDEFAULT} \
462       || ${_CCLINK.${_P}} == ${_CCLINK.CXXDEFAULT}) \
463   && !defined(NOCOMBINE.${_P}) && !defined(NOCOMBINE))
464.for f in ${SRCS.${_P}:N*.h:N*.sh:N*.fth:C/\.[yl]$/.c/g}
465#_XFLAGS.$f := ${CPPFLAGS.$f:D1} ${CPUFLAGS.$f:D2} \
466#     ${COPTS.$f:D3} ${OBJCOPTS.$f:D4} ${CXXFLAGS.$f:D5}
467.if (${CPPFLAGS.$f:D1} == "1" || ${CPUFLAGS.$f:D2} == "2" \
468     || ${COPTS.$f:D3} == "3" || ${OBJCOPTS.$f:D4} == "4" \
469     || ${CXXFLAGS.$f:D5} == "5") \
470    || ("${f:M*.[cyl]}" == "" || commands(${f:R:S/$/.o/}))
471XOBJS.${_P}+=	${f:R:S/$/.o/}
472.else
473XSRCS.${_P}+=	${f}
474NODPSRCS+=	${f}
475.endif
476.endfor
477
478${_P}: .gdbinit ${LIBCRT0} ${XOBJS.${_P}} ${SRCS.${_P}} ${DPSRCS} ${LIBC} ${LIBCRTBEGIN} ${LIBCRTEND} ${_DPADD.${_P}}
479	${_MKTARGET_LINK}
480.if defined(DESTDIR)
481	${_CCLINK.${_P}} -Wl,-nostdlib \
482	    ${_LDFLAGS.${_P}} ${_LDSTATIC.${_P}} -o ${.TARGET} ${_PROGLDOPTS} \
483	    -B${_GCC_CRTDIR}/ -B${DESTDIR}/usr/lib/ \
484	    -MD --combine ${_CPPFLAGS.${_P}} ${_CFLAGS.${_P}} ${_COPTS.${_P}} \
485	    ${XSRCS.${_P}:@.SRC.@${.ALLSRC:M*.c:M*${.SRC.}}@:O:u} ${XOBJS.${_P}} \
486	    ${_LDADD.${_P}} -L${_GCC_LIBGCCDIR} -L${DESTDIR}/usr/lib
487.else
488	${_CCLINK.${_P}} ${_LDFLAGS.${_P}} ${_LDSTATIC.${_P}} -o ${.TARGET} ${_PROGLDOPTS} \
489	    -MD --combine ${_CPPFLAGS.${_P}} ${_COPTS.${_P}}
490	    ${XSRCS.${_P}:@.SRC.@${.ALLSRC:M*.c:M*${.SRC.}}@:O:u} ${XOBJS.${_P}} \
491	    ${_LDADD.${_P}}
492.endif	# defined(DESTDIR)
493.if defined(CTFMERGE)
494	${CTFMERGE} ${CTFMFLAGS} -o ${.TARGET} ${OBJS.${_P}}
495.endif
496.if defined(PAXCTL_FLAGS.${_P})
497	${PAXCTL} ${PAXCTL_FLAGS.${_P}} ${.TARGET}
498.endif
499.if ${MKSTRIPIDENT} != "no"
500	${OBJCOPY} -R .ident ${.TARGET}
501.endif
502
503CLEANFILES+=	${_P}.d
504.if exists(${_P}.d)
505.include "${_P}.d"		# include -MD depend for program.
506.endif
507.else	# USE_COMBINE
508
509${OBJS.${_P}} ${LOBJS.${_P}}: ${DPSRCS}
510
511${_P}: .gdbinit ${LIBCRT0} ${OBJS.${_P}} ${LIBC} ${LIBCRTBEGIN} ${LIBCRTEND} ${_DPADD.${_P}}
512.if !commands(${_P})
513	${_MKTARGET_LINK}
514	${_CCLINK.${_P}} \
515	    ${_LDFLAGS.${_P}} ${_LDSTATIC.${_P}} -o ${.TARGET} \
516	    ${OBJS.${_P}} ${_PROGLDOPTS} ${_LDADD.${_P}}
517.if defined(CTFMERGE)
518	${CTFMERGE} ${CTFMFLAGS} -o ${.TARGET} ${OBJS.${_P}}
519.endif
520.if defined(PAXCTL_FLAGS.${_P})
521	${PAXCTL} ${PAXCTL_FLAGS.${_P}} ${.TARGET}
522.endif
523.if ${MKSTRIPIDENT} != "no"
524	${OBJCOPY} -R .ident ${.TARGET}
525.endif
526.endif	# !commands(${_P})
527.endif	# USE_COMBINE
528
529${_P}.ro: ${OBJS.${_P}} ${_DPADD.${_P}}
530	${_MKTARGET_LINK}
531	${CC} ${LDFLAGS} -nostdlib -r -Wl,-dc -o ${.TARGET} ${OBJS.${_P}}
532
533.if defined(_PROGDEBUG.${_P})
534${_PROGDEBUG.${_P}}: ${_P}
535	${_MKTARGET_CREATE}
536	(  ${OBJCOPY} --only-keep-debug ${_P} ${_PROGDEBUG.${_P}} \
537	&& ${OBJCOPY} --strip-debug -p -R .gnu_debuglink \
538		--add-gnu-debuglink=${_PROGDEBUG.${_P}} ${_P} \
539	) || (rm -f ${_PROGDEBUG.${_P}}; false)
540.endif
541
542.endif	# defined(OBJS.${_P}) && !empty(OBJS.${_P})			# }
543
544.if !defined(MAN.${_P})
545MAN.${_P}=	${_P}.1
546.endif	# !defined(MAN.${_P})
547.if !empty(_APPEND_MANS:M[Yy][Ee][Ss])
548MAN+=		${MAN.${_P}}
549.endif
550
551realall: ${_P} ${_PROGDEBUG.${_P}}
552
553CLEANFILES+= ${_P} ${_PROGDEBUG.${_P}}
554
555.if defined(OBJS.${_P}) && !empty(OBJS.${_P})
556CLEANFILES+= ${OBJS.${_P}} ${LOBJS.${_P}}
557.endif
558
559_PROG_INSTALL+=	proginstall-${_P}
560
561.if !target(proginstall-${_P})						# {
562proginstall-${_P}::	${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}} \
563		${_PROGDEBUG.${_P}:D${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}}
564.PRECIOUS:	${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}} \
565		${_PROGDEBUG.${_P}:D${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}}
566
567.if ${MKUPDATE} == "no"
568.if defined(_RUMPINSTALL.${_P})
569${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}! ${_P} __progrumpinstall
570.else
571${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}! ${_P} __proginstall
572.endif
573.if !defined(BUILD) && !make(all) && !make(${_P})
574${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}! .MADE
575.endif
576.if defined(_PROGDEBUG.${_P})
577${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}! ${_PROGDEBUG.${_P}} __progdebuginstall
578.if !defined(BUILD) && !make(all) && !make(${_P})
579${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}! .MADE
580.endif
581.endif	#  define(_PROGDEBUG.${_P})
582.else	# 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	#  defined(_PROGDEBUG.${_P})
597.endif	# MKUPDATE != no
598
599.endif	# !target(proginstall-${_P})					# }
600
601lint: lint-${_P}
602lint-${_P}: ${LOBJS.${_P}}
603.if defined(LOBJS.${_P}) && !empty(LOBJS.${_P})
604	${LINT} ${LINTFLAGS} ${_LDFLAGS.${_P}:C/-L[  ]*/-L/Wg:M-L*} ${LOBJS.${_P}} ${_LDADD.${_P}}
605.endif
606
607.endfor # _P in ${PROGS} ${PROGS_CXX}					# }
608
609.if defined(OBJS) && !empty(OBJS) && \
610    (empty(PROGS) && empty(PROGS_CXX))
611CLEANFILES+= ${OBJS} ${LOBJS}
612.endif
613
614.if !target(proginstall)
615proginstall:: ${_PROG_INSTALL}
616.endif
617.PHONY:		proginstall
618
619
620
621realall: ${SCRIPTS}
622.if defined(SCRIPTS) && !target(scriptsinstall)				# {
623SCRIPTSDIR?=${BINDIR}
624SCRIPTSOWN?=${BINOWN}
625SCRIPTSGRP?=${BINGRP}
626SCRIPTSMODE?=${BINMODE}
627
628scriptsinstall:: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@}
629.PRECIOUS: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@}
630
631__scriptinstall: .USE
632	${_MKTARGET_INSTALL}
633	${INSTALL_FILE} \
634	    -o ${SCRIPTSOWN_${.ALLSRC:T}:U${SCRIPTSOWN}} \
635	    -g ${SCRIPTSGRP_${.ALLSRC:T}:U${SCRIPTSGRP}} \
636	    -m ${SCRIPTSMODE_${.ALLSRC:T}:U${SCRIPTSMODE}} \
637	    ${.ALLSRC} ${.TARGET}
638
639.for S in ${SCRIPTS:O:u}
640.if ${MKUPDATE} == "no"
641${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! ${S} __scriptinstall
642.if !defined(BUILD) && !make(all) && !make(${S})
643${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! .MADE
644.endif
645.else
646${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: ${S} __scriptinstall
647.if !defined(BUILD) && !make(all) && !make(${S})
648${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: .MADE
649.endif
650.endif
651.endfor
652.endif									# }
653
654.if !target(scriptsinstall)
655scriptsinstall::
656.endif
657.PHONY:		scriptsinstall
658
659##### Pull in related .mk logic
660LINKSOWN?= ${BINOWN}
661LINKSGRP?= ${BINGRP}
662LINKSMODE?= ${BINMODE}
663.include <bsd.man.mk>
664.include <bsd.nls.mk>
665.include <bsd.files.mk>
666.include <bsd.inc.mk>
667.include <bsd.links.mk>
668.include <bsd.sys.mk>
669.include <bsd.dep.mk>
670.include <bsd.clang-analyze.mk>
671.include <bsd.clean.mk>
672
673${TARGETS}:	# ensure existence
674
675.endif	# HOSTPROG
676