xref: /src/contrib/bmake/Makefile (revision 34a3834eadd03bec7703b8fbf9123f27b1114986)
1#	$Id: Makefile,v 1.137 2026/03/13 15:37:22 sjg Exp $
2
3PROG = bmake
4
5SRCS = \
6	arch.c \
7	buf.c \
8	compat.c \
9	cond.c \
10	dir.c \
11	for.c \
12	hash.c \
13	job.c \
14	lst.c \
15	main.c \
16	make.c \
17	make_malloc.c \
18	meta.c \
19	metachar.c \
20	parse.c \
21	str.c \
22	suff.c \
23	targ.c \
24	trace.c \
25	util.c \
26	var.c
27
28.MAIN: all
29
30.-include "VERSION"
31.-include "Makefile.inc"
32
33# this file gets generated by configure
34.-include "Makefile.config"
35
36.if !empty(LIBOBJS)
37SRCS += ${LIBOBJS:T:.o=.c}
38.endif
39
40# just in case
41prefix ?= /usr
42srcdir ?= ${.PARSEDIR}
43srcdir := ${srcdir}
44
45MAN ?= ${PROG}.1
46SRCS.${MAN} ?= ${srcdir}/make.1
47
48DEFAULT_SYS_PATH ?= ${prefix}/share/mk
49
50CPPFLAGS += -DUSE_META
51CFLAGS += ${CPPFLAGS}
52CFLAGS += -D_PATH_DEFSYSPATH=\"${DEFAULT_SYS_PATH}\"
53CFLAGS += -I. -I${srcdir} ${XDEFS} -DMAKE_NATIVE
54CFLAGS += ${COPTS.${.ALLSRC:M*.c:T:u}}
55COPTS.main.c += "-DMAKE_VERSION=\"${_MAKE_VERSION}\""
56
57# bmake defaults to the traditional behavior
58MAKE_SAVE_DOLLARS_DEFAULT ?= no
59
60VARS.main += FORCE_MAKE_OS FORCE_MACHINE FORCE_MACHINE_ARCH \
61	MAKE_SAVE_DOLLARS_DEFAULT \
62
63.for x in ${VARS.main}
64.ifdef $x
65COPTS.main.c += "-D$x=\"${$x}\""
66.endif
67.endfor
68
69# meta mode can be useful even without filemon
70# should be set by now
71USE_FILEMON ?= no
72.if ${USE_FILEMON:tl} != "no"
73.PATH:	${srcdir}/filemon
74SRCS += filemon_${USE_FILEMON}.c
75COPTS.meta.c += -DUSE_FILEMON -DUSE_FILEMON_${USE_FILEMON:tu}
76COPTS.job.c += ${COPTS.meta.c}
77
78.if ${USE_FILEMON} == "dev"
79FILEMON_H ?= /usr/include/dev/filemon/filemon.h
80.if exists(${FILEMON_H}) && ${FILEMON_H:T} == "filemon.h"
81COPTS.filemon_dev.c += -DHAVE_FILEMON_H -I${FILEMON_H:H}
82.endif
83.elif ${USE_FILEMON} == "ktrace"
84COPTS.filemon_ktrace.c += -Wno-error=unused-parameter
85.endif
86
87.endif				# USE_FILEMON
88
89.PATH:	${srcdir}
90
91# start-delete1 for bsd.after-import.mk
92# we skip a lot of this when building as part of FreeBSD etc.
93
94# list of OS's which are derrived from BSD4.4
95BSD44_LIST = NetBSD FreeBSD OpenBSD DragonFly MirBSD Bitrig
96# we are...
97OS := ${.MAKE.OS:U${uname -s:L:sh}}
98# are we 4.4BSD ?
99isBSD44 := ${BSD44_LIST:M${OS}}
100
101.if ${isBSD44} == "" && ${OS:NCygwin:NDarwin:NLinux} != ""
102MANTARGET ?= cat
103.if ${MACHINE} == "sun386"
104# even I don't have one of these anymore :-)
105CFLAGS += -DPORTAR
106.elif ${OS} != "SunOS"
107# assume the worst
108SRCS += sigcompat.c
109CFLAGS += -DSIGNAL_FLAGS=SA_RESTART
110.endif
111.else
112MANTARGET ?= man
113.endif
114
115# turn this on by default - ignored if we are root
116WITH_INSTALL_AS_USER =
117
118# suppress with -DWITHOUT_*
119OPTIONS_DEFAULT_YES += \
120	AUTOCONF_MK \
121	INSTALL_MK \
122	PROG_LINK \
123	TESTS \
124
125OPTIONS_DEFAULT_NO += \
126	GEN_MAN \
127	PROG_VERSION \
128
129.if ${PROG} != "make" || ${srcdir} != ${.CURDIR} || !exists(${srcdir}/${MAN})
130WITH_GEN_MAN = 1
131.endif
132
133# process options now
134.include <own.mk>
135
136.if ${MK_PROG_VERSION} == "yes"
137PROG_NAME = ${PROG}-${_MAKE_VERSION}
138.if ${MK_PROG_LINK} == "yes"
139SYMLINKS += ${PROG_NAME} ${BINDIR}/${PROG}
140.endif
141.endif
142
143EXTRACT_MAN = no
144# end-delete1
145
146.if make(obj) || make(clean)
147SUBDIR.${MK_TESTS} += unit-tests
148.endif
149
150MAN1 = ${MAN}
151
152.if ${MK_GEN_MAN:Uno} == "yes"
153
154# we use this to generate ${MAN}
155.include <${srcdir}/mk/genfiles.mk>
156
157.if ${PROG} != "make"
158CLEANFILES += my.history
159SED_CMDS.${MAN} += \
160	-e '/^.Dt/s/MAKE/${PROG:tu}/' \
161	-e '/^.Nm/s/make/${PROG}/' \
162
163.endif
164
165.if ${CLEANFILES:U:Mmy.history} != ""
166${MAN}: my.history
167my.history:
168	@(echo ".Nm"; \
169	echo "is derived from NetBSD"; \
170	echo ".Xr make 1 ."; \
171	echo "It uses autoconf to facilitate portability to other platforms."; \
172	echo ".Pp") > $@
173
174SED_CMDS.${MAN} += \
175	-e '/^.Sh HISTORY/rmy.history' \
176	-e '/^.Sh HISTORY/,/BUGS/s,^.Nm,make,' \
177
178.endif
179
180.if ${.MAKE.OS:N*BSD} != ""
181# assume .Nx is not supported
182SED_CMDS.${MAN} += -e 's/^\.Nx/NetBSD/'
183.endif
184
185# watch out for a late change of PROG
186.if !empty(SRCS.${MAN})
187.NOPATH: ${MAN}
188${MAN}:	${SRCS.${MAN}} _GENFILES_USE
189
190all man beforeinstall: ${MAN}
191_mfromdir = .
192.endif
193.endif				# MK_GEN_MAN
194
195MANTARGET ?= cat
196MANDEST ?= ${MANDIR}/${MANTARGET}1
197
198.if ${MANTARGET} == "cat"
199_mfromdir = ${srcdir}
200.endif
201
202.include <prog.mk>
203
204CPPFLAGS += -DMAKE_NATIVE -DHAVE_CONFIG_H
205COPTS.var.c += -Wno-cast-qual
206COPTS.job.c += -Wno-format-nonliteral
207COPTS.parse.c += -Wno-format-nonliteral
208COPTS.var.c += -Wno-format-nonliteral
209
210# Force these
211SHAREDIR = ${SHAREDIR.bmake:U${prefix}/share}
212BINDIR = ${BINDIR.bmake:U${prefix}/bin}
213MANDIR = ${MANDIR.bmake:U${SHAREDIR}/man}
214
215${OBJS}: .META config.h
216${PROG}: .META
217
218# start-delete2 for bsd.after-import.mk
219
220# make sure that MAKE_VERSION gets updated.
221main.o: ${srcdir}/VERSION
222
223.if ${MK_AUTOCONF_MK} == "yes"
224CONFIGURE_DEPS += ${.CURDIR}/VERSION
225# we do not need or want the generated makefile
226CONFIGURE_ARGS += --without-makefile
227AUTOCONF_GENERATED_MAKEFILE = Makefile.config
228.include <autoconf.mk>
229.endif
230SHARE_MK ?= ${SHAREDIR}/mk
231MKSRC = ${srcdir}/mk
232INSTALL ?= ${srcdir}/install-sh
233
234.if ${MK_INSTALL_MK} == "yes"
235install: install-mk
236.endif
237
238beforeinstall:
239	test -d ${DESTDIR}${BINDIR} || ${INSTALL} -m ${DIRMODE} -d ${DESTDIR}${BINDIR}
240	test -d ${DESTDIR}${MANDEST} || ${INSTALL} -m ${DIRMODE} -d ${DESTDIR}${MANDEST}
241
242install-mk:
243.if exists(${MKSRC}/install-mk)
244	test -d ${DESTDIR}${SHARE_MK} || ${INSTALL} -m ${DIRMODE} -d ${DESTDIR}${SHARE_MK}
245	sh ${MKSRC}/install-mk -v -m ${NONBINMODE} ${DESTDIR}${SHARE_MK}
246.else
247	@echo need to unpack mk.tar.gz under ${srcdir} or set MKSRC; false
248.endif
249# end-delete2
250
251# A simple unit-test driver to help catch regressions
252TEST_MAKE ?= ${.OBJDIR}/${PROG:T}
253accept test: .NOMETA
254	cd ${.CURDIR}/unit-tests && \
255	MAKEFLAGS= ${TEST_MAKE} -r -m / ${.TARGET} ${TESTS:DTESTS=${TESTS:Q}}
256
257
258.if make(test) && ${MK_AUTO_OBJ} == "yes"
259# The test target above visits unit-tests with -r -m /
260# which prevents MK_AUTO_OBJ doing its job
261# so do it here
262.if defined(MAKEOBJDIRPREFIX) || ${MAKEOBJDIR:U:M*/*} != ""
263_utobj = ${.OBJDIR}/unit-tests
264.else
265_utobj = ${.CURDIR}/unit-tests/${MAKEOBJDIR:Uobj}
266.endif
267utobj: .NOMETA
268	@test -d ${_utobj} && exit 0; \
269	echo "[Creating ${_utobj}...]"; \
270	umask ${OBJDIR_UMASK:U002}; \
271	mkdir -p ${_utobj}
272test: utobj
273.endif
274