xref: /minix3/share/mk/bsd.prog.mk (revision cdfb5ab81f82cdcb0f58d139385d626df29f4069)
1#	$NetBSD: bsd.prog.mk,v 1.244 2009/12/08 15:18:42 uebayasi Exp $
2#	@(#)bsd.prog.mk	8.2 (Berkeley) 4/2/94
3
4.ifndef HOSTPROG
5
6.include <bsd.init.mk>
7.include <minix.gcov.mk>
8
9#
10# Definitions and targets shared among all programs built by a single
11# Makefile.
12#
13
14##### Minix rule to make the "install" target depend on
15##### "all" and "depend" targets
16realinstall: realall
17realall: depend
18depend: ${.CURDIR}/.gitignore
19
20##### Basic targets
21realinstall:	proginstall scriptsinstall
22clean:		cleanprog
23
24cleanobjs: .PHONY
25
26cleanprog: .PHONY cleanobjs cleanextra
27	rm -f a.out [Ee]rrs mklog core *.core
28
29##### Default values
30.if empty(CPPFLAGS:M-nostdinc)
31CPPFLAGS+=	${DESTDIR:D-nostdinc ${CPPFLAG_ISYSTEM} ${DESTDIR}/usr/include}
32.endif
33.if empty(CXXFLAGS:M-nostdinc++)
34CXXFLAGS+=	${DESTDIR:D-nostdinc++ ${CPPFLAG_ISYSTEMXX} ${DESTDIR}/usr/include/g++}
35.endif
36CFLAGS+=	${COPTS}
37OBJCFLAGS+=	${OBJCOPTS}
38MKDEP_SUFFIXES?=	.o .ln
39
40##### Installed system library definitions
41#
42#	E.g.
43#		LIBC?=${DESTDIR}/usr/lib/libc.a
44#		LIBX11?=${DESTDIR}/usr/X11R7/lib/libX11.a
45#	etc..
46
47# .for _lib in \
48# 	archive asn1 bluetooth bsdmalloc bz2 c c_pic cdk com_err compat \
49# 	crypt crypto crypto_idea crypto_mdc2 crypto_rc5 \
50# 	curses dbm des edit event \
51# 	fetch form fl g2c gcc gnumalloc gssapi hdb heimntlm hx509 intl ipsec \
52# 	kadm5clnt kadm5srv kafs krb5 kvm l lber ldap ldap_r \
53# 	m magic menu objc ossaudio pam pcap pci pmc posix pthread pthread_dbg \
54# 	puffs radius resolv rmt roken rpcsvc rt rump rumpuser skey sl ss \
55# 	ssh ssl termcap usbhid util wrap y z bind9 dns lwres isccfg isccc isc \
56# 	\
57# 	rumpfs_cd9660fs rumpfs_efs rumpfs_ext2fs rumpfs_ffs rumpfs_hfs \
58# 	rumpfs_lfs rumpfs_msdosfs rumpfs_nfs rumpfs_ntfs rumpfs_syspuffs \
59# 	rumpfs_tmpfs rumpfs_udf rumpfs_ufs
60.for _lib in \
61	c curses blockdriver chardriver netdriver edit end m sys timers util \
62	bz2 l audiodriver exec ddekit devman usb elf bdev sffs hgfs vboxfs \
63	minc minlib
64.ifndef LIB${_lib:tu}
65LIB${_lib:tu}=	${DESTDIR}/usr/lib/lib${_lib}.a
66.MADE:		${LIB${_lib:tu}}	# Note: ${DESTDIR} will be expanded
67.endif
68.endfor
69
70# These need + -> X transformations
71.ifndef LIBSTDCXX
72LIBSTDCXX=	${DESTDIR}/usr/lib/libstdc++.a
73.MADE:		${LIBSTDCXX}
74.endif
75
76.ifndef LIBSUPCXX
77LIBSUPCXX=	${DESTDIR}/usr/lib/libsupc++.a
78.MADE:		${LIBSUPCXX}
79.endif
80
81.for _lib in \
82	dps expat fntstubs fontcache fontconfig fontenc freetype FS \
83	GL GLU ICE lbxutil SM X11 Xau Xaw Xdmcp Xext Xfont Xft \
84	Xi Xinerama xkbfile Xmu Xmuu Xpm Xrandr Xrender Xss Xt \
85	XTrap Xtst Xv Xxf86dga Xxf86misc Xxf86vm
86.ifndef LIB${_lib:tu}
87LIB${_lib:tu}=	${DESTDIR}${X11USRLIBDIR}/lib${_lib}.a
88.MADE:		${LIB${_lib:tu}}	# Note: ${DESTDIR} will be expanded
89.endif
90.endfor
91
92.if defined(RESCUEDIR)
93CPPFLAGS+=	-DRESCUEDIR=\"${RESCUEDIR}\"
94.endif
95
96__proginstall: .USE
97	${_MKTARGET_INSTALL}
98	${INSTALL_FILE} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \
99		${STRIPFLAG} ${.ALLSRC} ${.TARGET}
100
101__progdebuginstall: .USE
102	${_MKTARGET_INSTALL}
103	${INSTALL_FILE} -o ${DEBUGOWN} -g ${DEBUGGRP} -m ${DEBUGMODE} \
104		${.ALLSRC} ${.TARGET}
105
106
107
108#
109# Backwards compatibility with Makefiles that assume that bsd.prog.mk
110# can only build a single binary.
111#
112
113_APPEND_MANS=yes
114_APPEND_SRCS=yes
115
116_CCLINKFLAGS=
117.if defined(DESTDIR)
118_CCLINKFLAGS+=	-B${_GCC_CRTDIR}/ -B${DESTDIR}/usr/lib/
119.endif
120
121.if defined(PROG_CXX)
122PROG=		${PROG_CXX}
123_CCLINK=	${CXX} ${_CCLINKFLAGS}
124.endif
125
126.if defined(PROG)
127_CCLINK?=	${CC} ${_CCLINKFLAGS}
128.  if defined(MAN)
129MAN.${PROG}=	${MAN}
130_APPEND_MANS=	no
131.  endif
132.  if !defined(OBJS)
133OBJS=		${OBJS.${PROG}}
134.  endif
135.  if defined(PROGNAME)
136PROGNAME.${PROG}=	${PROGNAME}
137.  endif
138.  if defined(SRCS)
139SRCS.${PROG}=	${SRCS}
140_APPEND_SRCS=	no
141.  endif
142.endif
143
144# Turn the single-program PROG and PROG_CXX variables into their multi-word
145# counterparts, PROGS and PROGS_CXX.
146.if defined(PROG_CXX) && !defined(PROGS_CXX)
147PROGS_CXX=	${PROG_CXX}
148.elif defined(PROG) && !defined(PROGS)
149PROGS=		${PROG}
150.endif
151
152
153
154#
155# Per-program definitions and targets.
156#
157
158# Definitions specific to C programs.
159.for _P in ${PROGS}
160SRCS.${_P}?=	${_P}.c
161_CCLINK.${_P}=	${CC} ${_CCLINKFLAGS}
162.endfor
163
164# Definitions specific to C++ programs.
165.for _P in ${PROGS_CXX}
166SRCS.${_P}?=	${_P}.cc
167_CCLINK.${_P}=	${CXX} ${_CCLINKFLAGS}
168.endfor
169
170# Language-independent definitions.
171.for _P in ${PROGS} ${PROGS_CXX}					# {
172
173BINDIR.${_P}?=		${BINDIR}
174PROGNAME.${_P}?=	${_P}
175
176.if ${MKDEBUG} != "no" && ${OBJECT_FMT} == "ELF" && !commands(${_P})
177_PROGDEBUG.${_P}:=	${PROGNAME.${_P}}.debug
178.endif
179
180##### PROG specific flags.
181
182_LDADD.${_P}=		${LDADD}    ${LDADD.${_P}}
183_LDFLAGS.${_P}=		${LDFLAGS}  ${LDFLAGS.${_P}}
184_LDSTATIC.${_P}=	${LDSTATIC} ${LDSTATIC.${_P}}
185
186##### Build and install rules
187.if !empty(_APPEND_SRCS:M[Yy][Ee][Ss])
188SRCS+=		${SRCS.${_P}} # For bsd.dep.mk
189.endif
190
191_YPSRCS.${_P}=	${SRCS.${_P}:M*.[ly]:C/\..$/.c/} ${YHEADER:D${SRCS.${_P}:M*.y:.y=.h}}
192
193DPSRCS+=		${_YPSRCS.${_P}}
194CLEANFILES+=		${_YPSRCS.${_P}}
195
196.if !empty(SRCS.${_P}:N*.h:N*.sh:N*.fth)
197OBJS.${_P}+=	${SRCS.${_P}:N*.h:N*.sh:N*.fth:R:S/$/.o/g}
198LOBJS.${_P}+=	${LSRCS:.c=.ln} ${SRCS.${_P}:M*.c:.c=.ln}
199.endif
200
201.if defined(OBJS.${_P}) && !empty(OBJS.${_P})			# {
202.NOPATH: ${OBJS.${_P}} ${_P} ${_YPSRCS.${_P}}
203
204${OBJS.${_P}} ${LOBJS.${_P}}: ${DPSRCS}
205
206${_P}: ${LIBCRT0} ${OBJS.${_P}} ${LIBC} ${LIBCRTBEGIN} ${LIBCRTEND} ${DPADD}
207.if !commands(${_P})
208	${_MKTARGET_LINK}
209	${_CCLINK.${_P}} \
210	    ${DESTDIR:D-Wl,-nostdlib} \
211	    ${_LDFLAGS.${_P}} ${_LDSTATIC.${_P}} -o ${.TARGET} \
212	    ${OBJS.${_P}} ${_LDADD.${_P}} \
213	    ${DESTDIR:D-L${_GCC_LIBGCCDIR}} \
214	    ${_PROGLDOPTS}
215.if defined(PAXCTL_FLAGS.${_P})
216	${PAXCTL} ${PAXCTL_FLAGS.${_P}} ${.TARGET}
217.endif
218.if ${MKSTRIPIDENT} != "no"
219	${OBJCOPY} -R .ident ${.TARGET}
220.endif
221.endif	# !commands(${_P})
222
223${_P}.ro: ${OBJS.${_P}} ${DPADD}
224	${_MKTARGET_LINK}
225	${LD} -r -dc -o ${.TARGET} ${OBJS.${_P}}
226
227.if defined(_PROGDEBUG.${_P})
228${_PROGDEBUG.${_P}}: ${_P}
229	${_MKTARGET_CREATE}
230	${OBJCOPY} --only-keep-debug ${_P} ${_PROGDEBUG.${_P}}
231	${OBJCOPY} -R .gnu_debuglink --add-gnu-debuglink=${_PROGDEBUG.${_P}} ${_P} \
232	    || rm -f ${_PROGDEBUG.${_P}}
233.endif
234
235.endif	# defined(OBJS.${_P}) && !empty(OBJS.${_P})			# }
236
237.if !defined(MAN.${_P})
238MAN.${_P}=	${_P}.1
239.endif	# !defined(MAN.${_P})
240.if !empty(_APPEND_MANS:M[Yy][Ee][Ss])
241MAN+=		${MAN.${_P}}
242.endif
243
244realall: ${_P} ${_PROGDEBUG.${_P}}
245
246cleanprog: cleanprog-${_P}
247cleanprog-${_P}:
248	rm -f ${_P} ${_PROGDEBUG.${_P}}
249
250.if defined(OBJS.${_P}) && !empty(OBJS.${_P})
251cleanobjs: cleanobjs-${_P}
252cleanobjs-${_P}:
253	rm -f ${OBJS.${_P}} ${LOBJS.${_P}}
254.endif
255
256_PROG_INSTALL+=	proginstall-${_P}
257
258.if !target(proginstall-${_P})						# {
259proginstall-${_P}::	${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}} \
260		${_PROGDEBUG.${_P}:D${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}}
261.PRECIOUS:	${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}} \
262		${_PROGDEBUG.${_P}:D${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}}
263
264.if ${MKUPDATE} == "no"
265${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}! ${_P} __proginstall
266.if !defined(BUILD) && !make(all) && !make(${_P})
267${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}! .MADE
268.endif
269.if defined(_PROGDEBUG.${_P})
270${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}! ${_PROGDEBUG.${_P}} __progdebuginstall
271.if !defined(BUILD) && !make(all) && !make(${_P})
272${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}! .MADE
273.endif
274.endif	#  define(_PROGDEBUG.${_P})
275.else	# MKUPDATE != no
276${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}: ${_P} __proginstall
277.if !defined(BUILD) && !make(all) && !make(${_P})
278${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}: .MADE
279.endif
280.if defined(_PROGDEBUG.${_P})
281${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}: ${_PROGDEBUG.${_P}} __progdebuginstall
282.if !defined(BUILD) && !make(all) && !make(${_P})
283${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}: .MADE
284.endif
285.endif	#  defined(_PROGDEBUG.${_P})
286.endif	# MKUPDATE != no
287
288.endif	# !target(proginstall-${_P})					# }
289
290lint: lint-${_P}
291lint-${_P}: ${LOBJS.${_P}}
292.if defined(LOBJS.${_P}) && !empty(LOBJS.${_P})
293	${LINT} ${LINTFLAGS} ${_LDFLAGS.${_P}:C/-L[  ]*/-L/Wg:M-L*} ${LOBJS.${_P}} ${_LDADD.${_P}}
294.endif
295
296.endfor # _P in ${PROGS} ${PROGS_CXX}					# }
297
298.if defined(OBJS) && !empty(OBJS) && \
299    (empty(PROGS) && empty(PROGS_CXX))
300cleanobjs: cleanobjs-plain
301cleanobjs-plain:
302	rm -f ${OBJS} ${LOBJS}
303.endif
304
305.if !target(proginstall)
306proginstall:: ${_PROG_INSTALL}
307.endif
308.PHONY:		proginstall
309
310
311
312realall: ${SCRIPTS}
313.if defined(SCRIPTS) && !target(scriptsinstall)				# {
314SCRIPTSDIR?=${BINDIR}
315SCRIPTSOWN?=${BINOWN}
316SCRIPTSGRP?=${BINGRP}
317SCRIPTSMODE?=${BINMODE}
318
319scriptsinstall:: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@}
320.PRECIOUS: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@}
321
322__scriptinstall: .USE
323	${_MKTARGET_INSTALL}
324	${INSTALL_FILE} \
325	    -o ${SCRIPTSOWN_${.ALLSRC:T}:U${SCRIPTSOWN}} \
326	    -g ${SCRIPTSGRP_${.ALLSRC:T}:U${SCRIPTSGRP}} \
327	    -m ${SCRIPTSMODE_${.ALLSRC:T}:U${SCRIPTSMODE}} \
328	    ${.ALLSRC} ${.TARGET}
329
330.for S in ${SCRIPTS:O:u}
331.if ${MKUPDATE} == "no"
332${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! ${S} __scriptinstall
333.if !defined(BUILD) && !make(all) && !make(${S})
334${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! .MADE
335.endif
336.else
337${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: ${S} __scriptinstall
338.if !defined(BUILD) && !make(all) && !make(${S})
339${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: .MADE
340.endif
341.endif
342.endfor
343.endif									# }
344
345.if !target(scriptsinstall)
346scriptsinstall::
347.endif
348.PHONY:		scriptsinstall
349
350##### Pull in related .mk logic
351LINKSOWN?= ${BINOWN}
352LINKSGRP?= ${BINGRP}
353LINKSMODE?= ${BINMODE}
354.include <bsd.man.mk>
355.include <bsd.files.mk>
356.include <bsd.inc.mk>
357.include <bsd.links.mk>
358.include <bsd.sys.mk>
359.include <bsd.dep.mk>
360.include <minix.gcc.mk>
361
362
363cleanextra: .PHONY
364.if defined(CLEANFILES) && !empty(CLEANFILES)
365	rm -f ${CLEANFILES}
366.endif
367
368${TARGETS}:	# ensure existence
369
370${.CURDIR}/.gitignore: Makefile
371	echo $(CLEANFILES) $(PROGS) | tr ' ' '\n' >${.TARGET}
372
373.if defined(MINIXDYNAMIC)
374LDFLAGS += -dynamic
375.else
376LDFLAGS += -static
377.endif
378
379.endif	# HOSTPROG
380