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