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