1#	$NetBSD$
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	@rm -f x.c
37
38.cc.o .cpp.o .cxx.o .C.o:
39	${CXX} -E ${CPPFLAGS} ${CXXFLAGS} ${.IMPSRC} | xstr -c -
40	@mv -f x.c x.cc
41	@${CXX} ${CPPFLAGS} ${CXXFLAGS} -c x.cc -o ${.TARGET}
42	@rm -f x.cc
43.endif
44
45.if defined(MKPIE) && (${MKPIE} != "no")
46CFLAGS+=	${PIE_CFLAGS}
47AFLAGS+=	${PIE_AFLAGS}
48LDFLAGS+=	${PIE_LDFLAGS}
49.endif
50
51CFLAGS+=	${COPTS}
52OBJCFLAGS+=	${OBJCOPTS}
53MKDEP_SUFFIXES?=	.o .ln
54
55# CTF preserve debug symbols
56.if defined(MKDTRACE) && (${MKDTRACE} != "no") && (${CFLAGS:M-g} != "")
57CTFFLAGS+= -g
58CTFMFLAGS+= -g
59.endif
60
61# ELF platforms depend on crti.o, crtbegin.o, crtend.o, and crtn.o
62.ifndef LIBCRTBEGIN
63LIBCRTBEGIN=	${DESTDIR}/usr/lib/crti.o ${_GCC_CRTBEGIN}
64.MADE: ${LIBCRTBEGIN}
65.endif
66.ifndef LIBCRTEND
67LIBCRTEND=	${_GCC_CRTEND} ${DESTDIR}/usr/lib/crtn.o
68.MADE: ${LIBCRTEND}
69.endif
70_SHLINKER=	${SHLINKDIR}/ld.elf_so
71
72.ifndef LIBCRT0
73LIBCRT0=	${DESTDIR}/usr/lib/crt0.o
74.MADE: ${LIBCRT0}
75.endif
76
77##### Installed system library definitions
78#
79#	E.g.
80#		LIBC?=${DESTDIR}/usr/lib/libc.a
81#		LIBX11?=${DESTDIR}/usr/X11R7/lib/libX11.a
82#	etc..
83#	NB:	If you are a library here, add it in bsd.README
84
85.for _lib in \
86	archive \
87	asn1 \
88	atf_c \
89	atf_cxx \
90	bind9 \
91	bluetooth \
92	bsdmalloc \
93	bz2 \
94	c \
95	c_pic \
96	com_err \
97	compat \
98	crt0 \
99	crypt \
100	crypto \
101	crypto_idea \
102	crypto_mdc2 \
103	crypto_rc5 \
104	curses \
105	dbm \
106	des \
107	dns \
108	edit \
109	event \
110	expat \
111	fetch \
112	fl \
113	form \
114	g2c \
115	gcc \
116	gnumalloc \
117	gssapi \
118	hdb \
119	heimbase \
120	heimntlm \
121	hx509 \
122	intl \
123	ipsec \
124	isc \
125	isccc \
126	isccfg \
127	kadm5clnt \
128	kadm5srv \
129	kafs \
130	krb5 \
131	kvm \
132	l \
133	lber \
134	ldap \
135	ldap_r \
136	lua \
137	lwres \
138	m \
139	magic \
140	menu \
141	objc \
142	ossaudio \
143	pam \
144	pcap \
145	pci \
146	pmc \
147	posix \
148	pthread \
149	pthread_dbg \
150	puffs \
151	quota \
152	radius \
153	resolv \
154	rmt \
155	roken \
156	rpcsvc \
157	rt \
158	rump \
159	rumpfs_cd9660fs \
160	rumpfs_efs \
161	rumpfs_ext2fs \
162	rumpfs_ffs \
163	rumpfs_hfs \
164	rumpfs_lfs \
165	rumpfs_msdosfs \
166	rumpfs_nfs \
167	rumpfs_ntfs \
168	rumpfs_syspuffs \
169	rumpfs_tmpfs \
170	rumpfs_udf \
171	rumpfs_ufs \
172	rumpuser \
173	saslc \
174	skey \
175	sl \
176	sqlite3 \
177	ss \
178	ssh \
179	ssl \
180	ssp \
181	stdcxx \
182	supcxx \
183	terminfo \
184	tre \
185	usbhid \
186	util \
187	wind \
188	wrap \
189	y \
190	z 
191.ifndef LIB${_lib:tu}
192LIB${_lib:tu}=	${DESTDIR}/usr/lib/lib${_lib:S/xx/++/:S/atf_c/atf-c/}.a
193.MADE:		${LIB${_lib:tu}}	# Note: ${DESTDIR} will be expanded
194.endif
195.endfor
196
197# PAM applications, if linked statically, need more libraries
198.if (${MKPIC} == "no")
199.if (${MKCRYPTO} != "no")
200PAM_STATIC_LDADD+= -lssh
201PAM_STATIC_DPADD+= ${LIBSSH}
202.endif
203.if (${MKKERBEROS} != "no")
204PAM_STATIC_LDADD+= -lkafs -lkrb5 -lhx509 -lwind -lasn1 \
205	-lroken -lcom_err -lheimbase -lcrypto
206PAM_STATIC_DPADD+= ${LIBKAFS} ${LIBKRB5} ${LIBHX509} ${LIBWIND} ${LIBASN1} \
207	${LIBROKEN} ${LIBCOM_ERR} ${LIBHEIMBASE} ${LIBCRYPTO}
208.endif
209.if (${MKSKEY} != "no")
210PAM_STATIC_LDADD+= -lskey
211PAM_STATIC_DPADD+= ${LIBSKEY}
212.endif
213PAM_STATIC_LDADD+= -lradius -lcrypt -lrpcsvc -lutil
214PAM_STATIC_DPADD+= ${LIBRADIUS} ${LIBCRYPT} ${LIBRPCSVC} ${LIBUTIL}
215.else
216PAM_STATIC_LDADD=
217PAM_STATIC_DPADD=
218.endif
219
220#	NB:	If you are a library here, add it in bsd.README
221.for _lib in \
222	FS \
223	GL \
224	GLU \
225	ICE \
226	SM \
227	X11 \
228	XTrap \
229	Xau \
230	Xaw \
231	Xdmcp \
232	Xext \
233	Xfont \
234	Xft \
235	Xi \
236	Xinerama \
237	Xmu \
238	Xmuu \
239	Xpm \
240	Xrandr \
241	Xrender \
242	Xss \
243	Xt \
244	Xtst \
245	Xv \
246	Xxf86dga \
247	Xxf86misc \
248	Xxf86vm \
249	dps \
250	fntstubs \
251	fontcache \
252	fontconfig \
253	fontenc \
254	freetype \
255	lbxutil \
256	xkbfile
257.ifndef LIB${_lib:tu}
258LIB${_lib:tu}=	${DESTDIR}${X11USRLIBDIR}/lib${_lib}.a
259.MADE:		${LIB${_lib:tu}}	# Note: ${DESTDIR} will be expanded
260.endif
261.endfor
262
263.if defined(RESCUEDIR)
264CPPFLAGS+=	-DRESCUEDIR=\"${RESCUEDIR}\"
265.endif
266
267_PROGLDOPTS=
268.if ${SHLINKDIR} != "/usr/libexec"	# XXX: change or remove if ld.so moves
269_PROGLDOPTS+=	-Wl,-dynamic-linker=${_SHLINKER}
270.endif
271.if ${SHLIBDIR} != "/usr/lib"
272_PROGLDOPTS+=	-Wl,-rpath,${SHLIBDIR} \
273		-L=${SHLIBDIR}
274.elif ${SHLIBINSTALLDIR} != "/usr/lib"
275_PROGLDOPTS+=	-Wl,-rpath-link,${DESTDIR}${SHLIBINSTALLDIR} \
276		-L=${SHLIBINSTALLDIR}
277.endif
278
279__proginstall: .USE
280	${_MKTARGET_INSTALL}
281	${INSTALL_FILE} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \
282		${STRIPFLAG} ${.ALLSRC} ${.TARGET}
283
284__progrumpinstall: .USE
285	${_MKTARGET_INSTALL}
286	${INSTALL_FILE} -o ${RUMPBINOWN} -g ${RUMPBINGRP} -m ${RUMPBINMODE} \
287		${STRIPFLAG} ${.ALLSRC} ${.TARGET}
288
289__progdebuginstall: .USE
290	${_MKTARGET_INSTALL}
291	${INSTALL_FILE} -o ${DEBUGOWN} -g ${DEBUGGRP} -m ${DEBUGMODE} \
292		${.ALLSRC} ${.TARGET}
293
294
295
296#
297# Backwards compatibility with Makefiles that assume that bsd.prog.mk
298# can only build a single binary.
299#
300
301_APPEND_MANS=yes
302_APPEND_SRCS=yes
303
304_CCLINKFLAGS=
305
306.if defined(PROG_CXX)
307PROG=		${PROG_CXX}
308_CCLINK=	${CXX} ${_CCLINKFLAGS}
309.endif
310
311.if defined(RUMPPRG)
312PROG=			${RUMPPRG}
313.ifndef CRUNCHEDPROG
314PROGS=			${RUMPPRG} rump.${RUMPPRG}
315. if defined(SRCS)
316SRCS.rump.${PROG}:=	${SRCS} ${PROG}_rumpops.c ${RUMPSRCS}
317SRCS+=			${PROG}_hostops.c
318. else
319SRCS=			${PROG}.c ${PROG}_hostops.c
320SRCS.rump.${PROG}=	${PROG}.c ${PROG}_rumpops.c ${RUMPSRCS}
321. endif
322DPSRCS+=		${PROG}_rumpops.c ${RUMPSRCS}
323LDADD.rump.${PROG}+=	-lrumpclient
324DPADD.rump.${PROG}+=	${LIBRUMPCLIENT}
325MAN.rump.${PROG}=	# defined but feeling empty
326_RUMPINSTALL.rump.${PROG}=# defined
327.else # CRUNCHEDPROG
328PROGS=			${PROG}
329CPPFLAGS+=		-DCRUNCHOPS
330.endif
331.endif
332
333.if defined(PROG)
334_CCLINK?=	${CC} ${_CCLINKFLAGS}
335.  if defined(MAN)
336MAN.${PROG}=	${MAN}
337_APPEND_MANS=	no
338.  endif
339.  if !defined(OBJS)
340OBJS=		${OBJS.${PROG}}
341.  endif
342.  if defined(PROGNAME)
343PROGNAME.${PROG}=	${PROGNAME}
344.  endif
345.  if defined(SRCS)
346SRCS.${PROG}=	${SRCS}
347_APPEND_SRCS=	no
348.  endif
349.endif
350
351# Turn the single-program PROG and PROG_CXX variables into their multi-word
352# counterparts, PROGS and PROGS_CXX.
353.if !defined(RUMPPRG)
354.  if defined(PROG_CXX) && !defined(PROGS_CXX)
355PROGS_CXX=	${PROG_CXX}
356.  elif defined(PROG) && !defined(PROGS)
357PROGS=		${PROG}
358.  endif
359.endif
360
361#
362# Per-program definitions and targets.
363#
364
365# Definitions specific to C programs.
366.for _P in ${PROGS}
367SRCS.${_P}?=	${_P}.c
368_CCLINK.${_P}=	${CC} ${_CCLINKFLAGS}
369.endfor
370
371# Definitions specific to C++ programs.
372.for _P in ${PROGS_CXX}
373SRCS.${_P}?=	${_P}.cc
374_CCLINK.${_P}=	${CXX} ${_CCLINKFLAGS}
375.endfor
376
377# Language-independent definitions.
378.for _P in ${PROGS} ${PROGS_CXX}					# {
379
380BINDIR.${_P}?=		${BINDIR}
381PROGNAME.${_P}?=	${_P}
382
383.if ${MKDEBUG} != "no" && !commands(${_P})
384_PROGDEBUG.${_P}:=	${PROGNAME.${_P}}.debug
385.endif
386
387.if defined(PAXCTL_FLAGS)
388PAXCTL_FLAGS.${_P}?= ${PAXCTL_FLAGS}
389.endif
390
391##### PROG specific flags.
392
393_LDADD.${_P}=		${LDADD}    ${LDADD.${_P}}
394_LDFLAGS.${_P}=		${LDFLAGS}  ${LDFLAGS.${_P}}
395_LDSTATIC.${_P}=	${LDSTATIC} ${LDSTATIC.${_P}}
396
397##### Build and install rules
398.if !empty(_APPEND_SRCS:M[Yy][Ee][Ss])
399SRCS+=		${SRCS.${_P}} # For bsd.dep.mk
400.endif
401
402_YPSRCS.${_P}=	${SRCS.${_P}:M*.[ly]:C/\..$/.c/} ${YHEADER:D${SRCS.${_P}:M*.y:.y=.h}}
403
404DPSRCS+=		${_YPSRCS.${_P}}
405CLEANFILES+=		${_YPSRCS.${_P}}
406
407.if !empty(SRCS.${_P}:N*.h:N*.sh:N*.fth)
408OBJS.${_P}+=	${SRCS.${_P}:N*.h:N*.sh:N*.fth:R:S/$/.o/g}
409LOBJS.${_P}+=	${LSRCS:.c=.ln} ${SRCS.${_P}:M*.c:.c=.ln}
410.endif
411
412.if defined(OBJS.${_P}) && !empty(OBJS.${_P})			# {
413.NOPATH: ${OBJS.${_P}} ${_P} ${_YPSRCS.${_P}}
414
415${OBJS.${_P}} ${LOBJS.${_P}}: ${DPSRCS}
416
417${_P}: .gdbinit ${LIBCRT0} ${OBJS.${_P}} ${LIBC} ${LIBCRTBEGIN} ${LIBCRTEND} ${DPADD}
418.if !commands(${_P})
419	${_MKTARGET_LINK}
420	${_CCLINK.${_P}} \
421	    ${_LDFLAGS.${_P}} ${_LDSTATIC.${_P}} -o ${.TARGET} \
422	    ${OBJS.${_P}} ${_LDADD.${_P}} \
423	    ${_PROGLDOPTS}
424.if defined(CTFMERGE)
425	${CTFMERGE} ${CTFMFLAGS} -o ${.TARGET} ${OBJS.${_P}}
426.endif
427.if defined(PAXCTL_FLAGS.${_P})
428	${PAXCTL} ${PAXCTL_FLAGS.${_P}} ${.TARGET}
429.endif
430.if ${MKSTRIPIDENT} != "no"
431	${OBJCOPY} -R .ident ${.TARGET}
432.endif
433.endif	# !commands(${_P})
434
435${_P}.ro: ${OBJS.${_P}} ${DPADD}
436	${_MKTARGET_LINK}
437	${CC} ${LDFLAGS} -nostdlib -r -Wl,-dc -o ${.TARGET} ${OBJS.${_P}}
438
439.if defined(_PROGDEBUG.${_P})
440${_PROGDEBUG.${_P}}: ${_P}
441	${_MKTARGET_CREATE}
442	(  ${OBJCOPY} --only-keep-debug ${_P} ${_PROGDEBUG.${_P}} \
443	&& ${OBJCOPY} --strip-debug -p -R .gnu_debuglink \
444		--add-gnu-debuglink=${_PROGDEBUG.${_P}} ${_P} \
445	) || (rm -f ${_PROGDEBUG.${_P}}; false)
446.endif
447
448.endif	# defined(OBJS.${_P}) && !empty(OBJS.${_P})			# }
449
450.if !defined(MAN.${_P})
451MAN.${_P}=	${_P}.1
452.endif	# !defined(MAN.${_P})
453.if !empty(_APPEND_MANS:M[Yy][Ee][Ss])
454MAN+=		${MAN.${_P}}
455.endif
456
457realall: ${_P} ${_PROGDEBUG.${_P}}
458
459CLEANFILES+= ${_P} ${_PROGDEBUG.${_P}}
460
461.if defined(OBJS.${_P}) && !empty(OBJS.${_P})
462CLEANFILES+= ${OBJS.${_P}} ${LOBJS.${_P}}
463.endif
464
465_PROG_INSTALL+=	proginstall-${_P}
466
467.if !target(proginstall-${_P})						# {
468proginstall-${_P}::	${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}} \
469		${_PROGDEBUG.${_P}:D${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}}
470.PRECIOUS:	${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}} \
471		${_PROGDEBUG.${_P}:D${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}}
472
473.if ${MKUPDATE} == "no"
474.if defined(_RUMPINSTALL.${_P})
475${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}! ${_P} __progrumpinstall
476.else
477${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}! ${_P} __proginstall
478.endif
479.if !defined(BUILD) && !make(all) && !make(${_P})
480${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}! .MADE
481.endif
482.if defined(_PROGDEBUG.${_P})
483${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}! ${_PROGDEBUG.${_P}} __progdebuginstall
484.if !defined(BUILD) && !make(all) && !make(${_P})
485${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}! .MADE
486.endif
487.endif	#  define(_PROGDEBUG.${_P})
488.else	# MKUPDATE != no
489.if defined(_RUMPINSTALL.${_P})
490${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}: ${_P} __progrumpinstall
491.else
492${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}: ${_P} __proginstall
493.endif
494.if !defined(BUILD) && !make(all) && !make(${_P})
495${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}: .MADE
496.endif
497.if defined(_PROGDEBUG.${_P})
498${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}: ${_PROGDEBUG.${_P}} __progdebuginstall
499.if !defined(BUILD) && !make(all) && !make(${_P})
500${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}: .MADE
501.endif
502.endif	#  defined(_PROGDEBUG.${_P})
503.endif	# MKUPDATE != no
504
505.endif	# !target(proginstall-${_P})					# }
506
507lint: lint-${_P}
508lint-${_P}: ${LOBJS.${_P}}
509.if defined(LOBJS.${_P}) && !empty(LOBJS.${_P})
510	${LINT} ${LINTFLAGS} ${_LDFLAGS.${_P}:C/-L[  ]*/-L/Wg:M-L*} ${LOBJS.${_P}} ${_LDADD.${_P}}
511.endif
512
513.endfor # _P in ${PROGS} ${PROGS_CXX}					# }
514
515.if defined(OBJS) && !empty(OBJS) && \
516    (empty(PROGS) && empty(PROGS_CXX))
517CLEANFILES+= ${OBJS} ${LOBJS}
518.endif
519
520.if !target(proginstall)
521proginstall:: ${_PROG_INSTALL}
522.endif
523.PHONY:		proginstall
524
525
526
527realall: ${SCRIPTS}
528.if defined(SCRIPTS) && !target(scriptsinstall)				# {
529SCRIPTSDIR?=${BINDIR}
530SCRIPTSOWN?=${BINOWN}
531SCRIPTSGRP?=${BINGRP}
532SCRIPTSMODE?=${BINMODE}
533
534scriptsinstall:: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@}
535.PRECIOUS: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@}
536
537__scriptinstall: .USE
538	${_MKTARGET_INSTALL}
539	${INSTALL_FILE} \
540	    -o ${SCRIPTSOWN_${.ALLSRC:T}:U${SCRIPTSOWN}} \
541	    -g ${SCRIPTSGRP_${.ALLSRC:T}:U${SCRIPTSGRP}} \
542	    -m ${SCRIPTSMODE_${.ALLSRC:T}:U${SCRIPTSMODE}} \
543	    ${.ALLSRC} ${.TARGET}
544
545.for S in ${SCRIPTS:O:u}
546.if ${MKUPDATE} == "no"
547${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! ${S} __scriptinstall
548.if !defined(BUILD) && !make(all) && !make(${S})
549${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! .MADE
550.endif
551.else
552${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: ${S} __scriptinstall
553.if !defined(BUILD) && !make(all) && !make(${S})
554${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: .MADE
555.endif
556.endif
557.endfor
558.endif									# }
559
560.if !target(scriptsinstall)
561scriptsinstall::
562.endif
563.PHONY:		scriptsinstall
564
565##### Pull in related .mk logic
566LINKSOWN?= ${BINOWN}
567LINKSGRP?= ${BINGRP}
568LINKSMODE?= ${BINMODE}
569.include <bsd.man.mk>
570.include <bsd.nls.mk>
571.include <bsd.files.mk>
572.include <bsd.inc.mk>
573.include <bsd.links.mk>
574.include <bsd.sys.mk>
575.include <bsd.dep.mk>
576.include <bsd.clang-analyze.mk>
577.include <bsd.clean.mk>
578
579${TARGETS}:	# ensure existence
580
581.endif	# HOSTPROG
582