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