xref: /minix/share/mk/bsd.prog.mk (revision 84d9c625)
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	elf \
219	exec \
220	ddekit \
221	devman \
222	minc \
223	minlib \
224	netdriver \
225	sffs \
226	sys \
227	timers \
228	usb
229.ifndef LIB${_lib:tu}
230LIB${_lib:tu}=	${DESTDIR}/usr/lib/lib${_lib:S/xx/++/:S/atf_c/atf-c/}.a
231.MADE:		${LIB${_lib:tu}}	# Note: ${DESTDIR} will be expanded
232.endif
233.endfor
234
235# PAM applications, if linked statically, need more libraries
236.if (${MKPIC} == "no")
237.if (${MKCRYPTO} != "no")
238PAM_STATIC_LDADD+= -lssh
239PAM_STATIC_DPADD+= ${LIBSSH}
240.endif
241.if (${MKKERBEROS} != "no")
242PAM_STATIC_LDADD+= -lkafs -lkrb5 -lhx509 -lwind -lasn1 \
243	-lroken -lcom_err -lheimbase -lcrypto
244PAM_STATIC_DPADD+= ${LIBKAFS} ${LIBKRB5} ${LIBHX509} ${LIBWIND} ${LIBASN1} \
245	${LIBROKEN} ${LIBCOM_ERR} ${LIBHEIMBASE} ${LIBCRYPTO}
246.endif
247.if (${MKSKEY} != "no")
248PAM_STATIC_LDADD+= -lskey
249PAM_STATIC_DPADD+= ${LIBSKEY}
250.endif
251PAM_STATIC_LDADD+= -lradius -lcrypt -lrpcsvc -lutil
252PAM_STATIC_DPADD+= ${LIBRADIUS} ${LIBCRYPT} ${LIBRPCSVC} ${LIBUTIL}
253.else
254PAM_STATIC_LDADD=
255PAM_STATIC_DPADD=
256.endif
257
258.if defined(__MINIX) && ${MACHINE_ARCH} == "earm"
259# LSC: On ARM, when compiling statically, with gcc, lgcc_eh is required
260LDFLAGS+= ${${ACTIVE_CC} == "gcc":? -lgcc_eh:}
261.endif # defined(__MINIX) && ${MACHINE_ARCH} == "earm"
262
263#	NB:	If you are a library here, add it in bsd.README
264.for _lib in \
265	FS \
266	GL \
267	GLU \
268	ICE \
269	SM \
270	X11 \
271	XTrap \
272	Xau \
273	Xaw \
274	Xdmcp \
275	Xext \
276	Xfont \
277	Xft \
278	Xi \
279	Xinerama \
280	Xmu \
281	Xmuu \
282	Xpm \
283	Xrandr \
284	Xrender \
285	Xss \
286	Xt \
287	Xtst \
288	Xv \
289	Xxf86dga \
290	Xxf86misc \
291	Xxf86vm \
292	dps \
293	fntstubs \
294	fontcache \
295	fontconfig \
296	fontenc \
297	freetype \
298	lbxutil \
299	xkbfile
300.ifndef LIB${_lib:tu}
301LIB${_lib:tu}=	${DESTDIR}${X11USRLIBDIR}/lib${_lib}.a
302.MADE:		${LIB${_lib:tu}}	# Note: ${DESTDIR} will be expanded
303.endif
304.endfor
305
306# Ugly one-offs
307LIBX11_XCB=	${DESTDIR}${X11USRLIBDIR}/libX11-xcb.a
308LIBXCB=	${DESTDIR}${X11USRLIBDIR}/libxcb.a
309
310.if defined(RESCUEDIR)
311CPPFLAGS+=	-DRESCUEDIR=\"${RESCUEDIR}\"
312.endif
313
314_PROGLDOPTS=
315.if ${SHLINKDIR} != "/usr/libexec"	# XXX: change or remove if ld.so moves
316_PROGLDOPTS+=	-Wl,-dynamic-linker=${_SHLINKER}
317.endif
318.if ${SHLIBDIR} != "/usr/lib"
319_PROGLDOPTS+=	-Wl,-rpath,${SHLIBDIR} \
320		-L=${SHLIBDIR}
321.elif ${SHLIBINSTALLDIR} != "/usr/lib"
322_PROGLDOPTS+=	-Wl,-rpath-link,${DESTDIR}${SHLIBINSTALLDIR} \
323		-L=${SHLIBINSTALLDIR}
324.endif
325
326__proginstall: .USE
327	${_MKTARGET_INSTALL}
328	${INSTALL_FILE} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \
329		${STRIPFLAG} ${.ALLSRC} ${.TARGET}
330
331__progrumpinstall: .USE
332	${_MKTARGET_INSTALL}
333	${INSTALL_FILE} -o ${RUMPBINOWN} -g ${RUMPBINGRP} -m ${RUMPBINMODE} \
334		${STRIPFLAG} ${.ALLSRC} ${.TARGET}
335
336__progdebuginstall: .USE
337	${_MKTARGET_INSTALL}
338	${INSTALL_FILE} -o ${DEBUGOWN} -g ${DEBUGGRP} -m ${DEBUGMODE} \
339		${.ALLSRC} ${.TARGET}
340
341
342
343#
344# Backwards compatibility with Makefiles that assume that bsd.prog.mk
345# can only build a single binary.
346#
347
348_APPEND_MANS=yes
349_APPEND_SRCS=yes
350
351_CCLINKFLAGS=
352
353.if defined(PROG_CXX)
354PROG=		${PROG_CXX}
355_CCLINK=	${CXX} ${_CCLINKFLAGS}
356.endif
357
358.if defined(RUMPPRG)
359PROG=			${RUMPPRG}
360. ifndef CRUNCHEDPROG
361.  if (${MKRUMP} != "no")
362PROGS=			${RUMPPRG} rump.${RUMPPRG}
363.  else
364PROGS=			${RUMPPRG}
365.  endif
366.  if defined(SRCS)
367.   if (${MKRUMP} != "no")
368SRCS.rump.${PROG}:=	${SRCS} ${PROG}_rumpops.c ${RUMPSRCS}
369.   endif
370SRCS+=			${PROG}_hostops.c
371.  else
372SRCS=			${PROG}.c ${PROG}_hostops.c
373.   if (${MKRUMP} != "no")
374SRCS.rump.${PROG}=	${PROG}.c ${PROG}_rumpops.c ${RUMPSRCS}
375.   endif
376.  endif
377.   if (${MKRUMP} != "no")
378DPSRCS+=		${PROG}_rumpops.c ${RUMPSRCS}
379LDADD.rump.${PROG}+=	-lrumpclient
380DPADD.rump.${PROG}+=	${LIBRUMPCLIENT}
381MAN.rump.${PROG}=	# defined but feeling empty
382_RUMPINSTALL.rump.${PROG}=# defined
383.   endif
384. else # CRUNCHEDPROG
385PROGS=			${PROG}
386CPPFLAGS+=		-DCRUNCHOPS
387. endif
388.endif
389
390.if defined(PROG)
391_CCLINK?=	${CC} ${_CCLINKFLAGS}
392.  if defined(MAN)
393MAN.${PROG}=	${MAN}
394_APPEND_MANS=	no
395.  endif
396.  if !defined(OBJS)
397OBJS=		${OBJS.${PROG}}
398.  endif
399.  if defined(PROGNAME)
400PROGNAME.${PROG}=	${PROGNAME}
401.  endif
402.  if defined(SRCS)
403SRCS.${PROG}=	${SRCS}
404_APPEND_SRCS=	no
405.  endif
406.endif
407
408# Turn the single-program PROG and PROG_CXX variables into their multi-word
409# counterparts, PROGS and PROGS_CXX.
410.if !defined(RUMPPRG)
411.  if defined(PROG_CXX) && !defined(PROGS_CXX)
412PROGS_CXX=	${PROG_CXX}
413.  elif defined(PROG) && !defined(PROGS)
414PROGS=		${PROG}
415.  endif
416.endif
417
418##### Libraries that this may depend upon.
419.if defined(PROGDPLIBS) 						# {
420.for _lib _dir in ${PROGDPLIBS}
421.if !defined(BINDO.${_lib})
422PROGDO.${_lib}!=	cd "${_dir}" && ${PRINTOBJDIR}
423.MAKEOVERRIDES+=PROGDO.${_lib}
424.endif
425LDADD+=		-L${PROGDO.${_lib}} -l${_lib}
426.if exists(${PROGDO.${_lib}}/lib${_lib}_pic.a)
427DPADD+=		${PROGDO.${_lib}}/lib${_lib}_pic.a
428.elif exists(${PROGDO.${_lib}}/lib${_lib}.so)
429DPADD+=		${PROGDO.${_lib}}/lib${_lib}.so
430.else
431DPADD+=		${PROGDO.${_lib}}/lib${_lib}.a
432.endif
433.endfor
434.endif									# }
435#
436# Per-program definitions and targets.
437#
438
439_CCLINK.CDEFAULT= ${CC} ${_CCLINKFLAGS}
440# Definitions specific to C programs.
441.for _P in ${PROGS}
442SRCS.${_P}?=	${_P}.c
443_CCLINK.${_P}=	${CC} ${_CCLINKFLAGS}
444_CFLAGS.${_P}=	${CFLAGS} ${CPUFLAGS}
445_CPPFLAGS.${_P}=	${CPPFLAGS}
446_COPTS.${_P}=	${COPTS}
447.endfor
448
449_CCLINK.CXXDEFAULT= ${CXX} ${_CCLINKFLAGS}
450# Definitions specific to C++ programs.
451.for _P in ${PROGS_CXX}
452SRCS.${_P}?=	${_P}.cc
453_CCLINK.${_P}=	${CXX} ${_CCLINKFLAGS}
454.endfor
455
456# Language-independent definitions.
457.if defined(__MINIX) && ${USE_BITCODE:Uno} == "yes"
458CFLAGS+= -flto
459
460.  if ${LD_STATIC:U} != "-static"
461GOLDLINKERSCRIPT?= ${LDS_DYNAMIC_BIN}
462.  else
463GOLDLINKERSCRIPT?= ${LDS_STATIC_BIN}
464.  endif
465
466.endif
467
468.for _P in ${PROGS} ${PROGS_CXX}					# {
469
470.if defined(__MINIX) && ${HAVE_GOLD:U} != ""
471GOLDLINKERSCRIPT.${_P}?= ${GOLDLINKERSCRIPT}
472
473.  if ${GOLDLINKERSCRIPT.${_P}:U} != ""
474LDFLAGS.${_P}:=-Wl,--script,${GOLDLINKERSCRIPT.${_P}} ${LDFLAGS.${_P}}
475.  endif
476.endif # defined(__MINIX) && ${HAVE_GOLD:U} == ""
477
478BINDIR.${_P}?=		${BINDIR}
479PROGNAME.${_P}?=	${_P}
480
481.if ${MKDEBUG} != "no" && !commands(${_P})
482_PROGDEBUG.${_P}:=	${PROGNAME.${_P}}.debug
483.endif
484
485.if defined(PAXCTL_FLAGS)
486PAXCTL_FLAGS.${_P}?= ${PAXCTL_FLAGS}
487.endif
488
489##### PROG specific flags.
490
491_DPADD.${_P}=		${DPADD}    ${DPADD.${_P}}
492_LDADD.${_P}=		${LDADD}    ${LDADD.${_P}}
493_LDFLAGS.${_P}=		${LDFLAGS}  ${LDFLAGS.${_P}}
494_LDSTATIC.${_P}=	${LDSTATIC} ${LDSTATIC.${_P}}
495
496##### Build and install rules
497.if !empty(_APPEND_SRCS:M[Yy][Ee][Ss])
498SRCS+=		${SRCS.${_P}}	# For bsd.dep.mk
499.endif
500
501_YPSRCS.${_P}=	${SRCS.${_P}:M*.[ly]:C/\..$/.c/} ${YHEADER:D${SRCS.${_P}:M*.y:.y=.h}}
502
503DPSRCS+=		${_YPSRCS.${_P}}
504CLEANFILES+=		${_YPSRCS.${_P}}
505
506.if !empty(SRCS.${_P}:N*.h:N*.sh:N*.fth)
507OBJS.${_P}+=	${SRCS.${_P}:N*.h:N*.sh:N*.fth:R:S/$/.o/g}
508LOBJS.${_P}+=	${LSRCS:.c=.ln} ${SRCS.${_P}:M*.c:.c=.ln}
509.endif
510
511.if defined(OBJS.${_P}) && !empty(OBJS.${_P})			# {
512.NOPATH: ${OBJS.${_P}} ${_P} ${_YPSRCS.${_P}}
513
514.if (defined(USE_COMBINE) && ${USE_COMBINE} != "no" && !commands(${_P}) \
515   && (${_CCLINK.${_P}} == ${_CCLINK.CDEFAULT} \
516       || ${_CCLINK.${_P}} == ${_CCLINK.CXXDEFAULT}) \
517   && !defined(NOCOMBINE.${_P}) && !defined(NOCOMBINE))
518.for f in ${SRCS.${_P}:N*.h:N*.sh:N*.fth:C/\.[yl]$/.c/g}
519#_XFLAGS.$f := ${CPPFLAGS.$f:D1} ${CPUFLAGS.$f:D2} \
520#     ${COPTS.$f:D3} ${OBJCOPTS.$f:D4} ${CXXFLAGS.$f:D5}
521.if (${CPPFLAGS.$f:D1} == "1" || ${CPUFLAGS.$f:D2} == "2" \
522     || ${COPTS.$f:D3} == "3" || ${OBJCOPTS.$f:D4} == "4" \
523     || ${CXXFLAGS.$f:D5} == "5") \
524    || ("${f:M*.[cyl]}" == "" || commands(${f:R:S/$/.o/}))
525XOBJS.${_P}+=	${f:R:S/$/.o/}
526.else
527XSRCS.${_P}+=	${f}
528NODPSRCS+=	${f}
529.endif
530.endfor
531
532${_P}: .gdbinit ${LIBCRT0} ${LIBCRTI} ${XOBJS.${_P}} ${SRCS.${_P}} \
533    ${DPSRCS} ${LIBC} ${LIBCRTBEGIN} ${LIBCRTEND} ${_DPADD.${_P}}
534	${_MKTARGET_LINK}
535.if defined(DESTDIR)
536	${_CCLINK.${_P}} -Wl,-nostdlib \
537	    ${_LDFLAGS.${_P}} ${_LDSTATIC.${_P}} -o ${.TARGET} ${_PROGLDOPTS} \
538	    -B${_GCC_CRTDIR}/ -B${DESTDIR}/usr/lib/ \
539	    -MD --combine ${_CPPFLAGS.${_P}} ${_CFLAGS.${_P}} ${_COPTS.${_P}} \
540	    ${XSRCS.${_P}:@.SRC.@${.ALLSRC:M*.c:M*${.SRC.}}@:O:u} ${XOBJS.${_P}} \
541	    ${_LDADD.${_P}} -L${_GCC_LIBGCCDIR} -L${DESTDIR}/usr/lib
542.else
543	${_CCLINK.${_P}} ${_LDFLAGS.${_P}} ${_LDSTATIC.${_P}} -o ${.TARGET} ${_PROGLDOPTS} \
544	    -MD --combine ${_CPPFLAGS.${_P}} ${_COPTS.${_P}}
545	    ${XSRCS.${_P}:@.SRC.@${.ALLSRC:M*.c:M*${.SRC.}}@:O:u} ${XOBJS.${_P}} \
546	    ${_LDADD.${_P}}
547.endif	# defined(DESTDIR)
548.if defined(CTFMERGE)
549	${CTFMERGE} ${CTFMFLAGS} -o ${.TARGET} ${OBJS.${_P}}
550.endif
551.if defined(PAXCTL_FLAGS.${_P})
552	${PAXCTL} ${PAXCTL_FLAGS.${_P}} ${.TARGET}
553.endif
554.if ${MKSTRIPIDENT} != "no"
555	${OBJCOPY} -R .ident ${.TARGET}
556.endif
557
558CLEANFILES+=	${_P}.d
559.if exists(${_P}.d)
560.include "${_P}.d"		# include -MD depend for program.
561.endif
562.else	# USE_COMBINE
563
564${OBJS.${_P}} ${LOBJS.${_P}}: ${DPSRCS}
565
566.if defined(__MINIX) && ${USE_BITCODE:Uno} == "yes"
567CLEANFILES+= ${_P}.opt.bcl ${_P}.bcl ${_P}.bcl.o
568
569# We may (or not) be using a pass.
570. if ${LLVM_PASS:UNO_PASS} != "NO_PASS"
571_LLVM_PASS_ARGS=	-load ${LLVM_PASS} ${LLVM_PASS_ARGS}
572_TARGET_BCL=	${_P}.opt.bcl
573.  else
574_TARGET_BCL=	${_P}.bcl
575. endif # ${LLVM_PASS:UNO_PASS} != "NO_PASS"
576
577
578${_P}.bcl: .gdbinit ${LIBCRT0} ${LIBCRTI} ${OBJS.${_P}} ${LIBC} ${LIBCRTBEGIN} \
579    ${LIBCRTEND} ${_DPADD.${_P}}
580	${_MKTARGET_LINK}
581	${_CCLINK.${_P}} \
582		-o ${.TARGET} \
583		-nostartfiles \
584		-L/usr/lib/bc \
585		${OBJS.${_P}} ${LLVM_LINK_ARGS} ${_LDADD.${_P}:N-shared} \
586		${_LDSTATIC.${_P}} \
587		-Wl,-r \
588		-Wl,-plugin=/usr/pkg/lib/bfd-plugins/LLVMgold.so,-plugin-opt=-disable-opt,-plugin-opt=-disable-inlining,-plugin-opt=emit-llvm
589
590${_P}.opt.bcl: ${_P}.bcl ${LLVM_PASS}
591	${_MKTARGET_LINK}
592	opt -disable-opt ${_LLVM_PASS_ARGS} -o ${.TARGET} ${_P}.bcl
593
594${_P}.bcl.o: ${_TARGET_BCL}
595	${_MKTARGET_LINK}
596	llc -O1 -filetype=obj -o ${.TARGET} ${.ALLSRC}
597
598${_P}: ${_P}.bcl.o
599	${_MKTARGET_LINK}
600	${_CCLINK.${_P}} \
601		-o ${.TARGET} \
602		-L/usr/lib/bc \
603		${.TARGET}.bcl.o ${_LDADD.${_P}} \
604		${_LDSTATIC.${_P}} \
605		-Wl,--script,${GOLDLINKERSCRIPT.${_P}} \
606		-Wl,-plugin=/usr/pkg/lib/bfd-plugins/LLVMgold.so,-plugin-opt=-disable-opt,-plugin-opt=-disable-inlining
607
608.else
609${_P}: .gdbinit ${LIBCRT0} ${LIBCRTI} ${OBJS.${_P}} ${LIBC} ${LIBCRTBEGIN} \
610    ${LIBCRTEND} ${_DPADD.${_P}}
611.if !commands(${_P})
612	${_MKTARGET_LINK}
613	${_CCLINK.${_P}} \
614	    ${_LDFLAGS.${_P}} ${_LDSTATIC.${_P}} -o ${.TARGET} \
615	    ${OBJS.${_P}} ${_PROGLDOPTS} ${_LDADD.${_P}}
616.if defined(CTFMERGE)
617	${CTFMERGE} ${CTFMFLAGS} -o ${.TARGET} ${OBJS.${_P}}
618.endif
619.if defined(PAXCTL_FLAGS.${_P})
620	${PAXCTL} ${PAXCTL_FLAGS.${_P}} ${.TARGET}
621.endif
622.if ${MKSTRIPIDENT} != "no"
623	${OBJCOPY} -R .ident ${.TARGET}
624.endif
625.endif	# !commands(${_P})
626.endif  # defined(__MINIX) && ${USE_BITCODE:Uno} == "yes"
627.endif	# USE_COMBINE
628
629${_P}.ro: ${OBJS.${_P}} ${_DPADD.${_P}}
630	${_MKTARGET_LINK}
631	${CC} ${LDFLAGS} -nostdlib -r -Wl,-dc -o ${.TARGET} ${OBJS.${_P}}
632
633.if defined(_PROGDEBUG.${_P})
634${_PROGDEBUG.${_P}}: ${_P}
635	${_MKTARGET_CREATE}
636	(  ${OBJCOPY} --only-keep-debug ${_P} ${_PROGDEBUG.${_P}} \
637	&& ${OBJCOPY} --strip-debug -p -R .gnu_debuglink \
638		--add-gnu-debuglink=${_PROGDEBUG.${_P}} ${_P} \
639	) || (rm -f ${_PROGDEBUG.${_P}}; false)
640.endif
641
642.endif	# defined(OBJS.${_P}) && !empty(OBJS.${_P})			# }
643
644.if !defined(MAN.${_P})
645MAN.${_P}=	${_P}.1
646.endif	# !defined(MAN.${_P})
647.if !empty(_APPEND_MANS:M[Yy][Ee][Ss])
648MAN+=		${MAN.${_P}}
649.endif
650
651realall: ${_P} ${_PROGDEBUG.${_P}}
652
653CLEANFILES+= ${_P} ${_PROGDEBUG.${_P}}
654
655.if defined(OBJS.${_P}) && !empty(OBJS.${_P})
656CLEANFILES+= ${OBJS.${_P}} ${LOBJS.${_P}}
657.endif
658
659_PROG_INSTALL+=	proginstall-${_P}
660
661.if !target(proginstall-${_P})						# {
662proginstall-${_P}::	${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}} \
663		${_PROGDEBUG.${_P}:D${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}}
664.PRECIOUS:	${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}} \
665		${_PROGDEBUG.${_P}:D${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}}
666
667.if ${MKUPDATE} == "no"
668.if defined(_RUMPINSTALL.${_P})
669${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}! ${_P} __progrumpinstall
670.else
671${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}! ${_P} __proginstall
672.endif
673.if !defined(BUILD) && !make(all) && !make(${_P})
674${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}! .MADE
675.endif
676.if defined(_PROGDEBUG.${_P})
677${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}! ${_PROGDEBUG.${_P}} __progdebuginstall
678.if !defined(BUILD) && !make(all) && !make(${_P})
679${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}! .MADE
680.endif
681.endif	#  define(_PROGDEBUG.${_P})
682.else	# MKUPDATE != no
683.if defined(_RUMPINSTALL.${_P})
684${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}: ${_P} __progrumpinstall
685.else
686${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}: ${_P} __proginstall
687.endif
688.if !defined(BUILD) && !make(all) && !make(${_P})
689${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}: .MADE
690.endif
691.if defined(_PROGDEBUG.${_P})
692${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}: ${_PROGDEBUG.${_P}} __progdebuginstall
693.if !defined(BUILD) && !make(all) && !make(${_P})
694${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}: .MADE
695.endif
696.endif	#  defined(_PROGDEBUG.${_P})
697.endif	# MKUPDATE != no
698
699.endif	# !target(proginstall-${_P})					# }
700
701lint: lint-${_P}
702lint-${_P}: ${LOBJS.${_P}}
703.if defined(LOBJS.${_P}) && !empty(LOBJS.${_P})
704	${LINT} ${LINTFLAGS} ${_LDFLAGS.${_P}:C/-L[  ]*/-L/Wg:M-L*} ${LOBJS.${_P}} ${_LDADD.${_P}}
705.endif
706
707.endfor # _P in ${PROGS} ${PROGS_CXX}					# }
708
709.if defined(OBJS) && !empty(OBJS) && \
710    (empty(PROGS) && empty(PROGS_CXX))
711CLEANFILES+= ${OBJS} ${LOBJS}
712.endif
713
714.if !target(proginstall)
715proginstall:: ${_PROG_INSTALL}
716.endif
717.PHONY:		proginstall
718
719
720
721realall: ${SCRIPTS}
722.if defined(SCRIPTS) && !target(scriptsinstall)				# {
723SCRIPTSDIR?=${BINDIR}
724SCRIPTSOWN?=${BINOWN}
725SCRIPTSGRP?=${BINGRP}
726SCRIPTSMODE?=${BINMODE}
727
728scriptsinstall:: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@}
729.PRECIOUS: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@}
730
731__scriptinstall: .USE
732	${_MKTARGET_INSTALL}
733	${INSTALL_FILE} \
734	    -o ${SCRIPTSOWN_${.ALLSRC:T}:U${SCRIPTSOWN}} \
735	    -g ${SCRIPTSGRP_${.ALLSRC:T}:U${SCRIPTSGRP}} \
736	    -m ${SCRIPTSMODE_${.ALLSRC:T}:U${SCRIPTSMODE}} \
737	    ${.ALLSRC} ${.TARGET}
738
739.for S in ${SCRIPTS:O:u}
740.if ${MKUPDATE} == "no"
741${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! ${S} __scriptinstall
742.if !defined(BUILD) && !make(all) && !make(${S})
743${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! .MADE
744.endif
745.else
746${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: ${S} __scriptinstall
747.if !defined(BUILD) && !make(all) && !make(${S})
748${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: .MADE
749.endif
750.endif
751.endfor
752.endif									# }
753
754.if !target(scriptsinstall)
755scriptsinstall::
756.endif
757.PHONY:		scriptsinstall
758
759##### Pull in related .mk logic
760LINKSOWN?= ${BINOWN}
761LINKSGRP?= ${BINGRP}
762LINKSMODE?= ${BINMODE}
763.include <bsd.man.mk>
764.include <bsd.nls.mk>
765.include <bsd.files.mk>
766.include <bsd.inc.mk>
767.include <bsd.links.mk>
768.include <bsd.sys.mk>
769.include <bsd.dep.mk>
770.include <bsd.clang-analyze.mk>
771.include <bsd.clean.mk>
772
773${TARGETS}:	# ensure existence
774
775.endif	# HOSTPROG
776