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