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