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