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