xref: /freebsd/share/mk/meta.sys.mk (revision c8245ceb47565e864a350e6aa33ba9a6461ebe02)
1f974ced3SSimon J. Gerraty# SPDX-License-Identifier: BSD-2-Clause
2f974ced3SSimon J. Gerraty#
3*c8245cebSSimon J. Gerraty# $Id: meta.sys.mk,v 1.56 2024/11/22 23:51:48 sjg Exp $
47750ad47SMarcel Moolenaar
57750ad47SMarcel Moolenaar#
6bee3d4bfSSimon J. Gerraty#	@(#) Copyright (c) 2010-2023, Simon J. Gerraty
77750ad47SMarcel Moolenaar#
87750ad47SMarcel Moolenaar#	This file is provided in the hope that it will
97750ad47SMarcel Moolenaar#	be of use.  There is absolutely NO WARRANTY.
107750ad47SMarcel Moolenaar#	Permission to copy, redistribute or otherwise
117750ad47SMarcel Moolenaar#	use this file is hereby granted provided that
127750ad47SMarcel Moolenaar#	the above copyright notice and this notice are
137750ad47SMarcel Moolenaar#	left intact.
147750ad47SMarcel Moolenaar#
157750ad47SMarcel Moolenaar#	Please send copies of changes and bug-fixes to:
167750ad47SMarcel Moolenaar#	sjg@crufty.net
177750ad47SMarcel Moolenaar#
187750ad47SMarcel Moolenaar
197750ad47SMarcel Moolenaar# include this if you want to enable meta mode
207750ad47SMarcel Moolenaar# for maximum benefit, requires filemon(4) driver.
217750ad47SMarcel Moolenaar
22bee3d4bfSSimon J. Gerraty# absolute path to what we are reading.
23bee3d4bfSSimon J. Gerraty_PARSEDIR ?= ${.PARSEDIR:tA}
247750ad47SMarcel Moolenaar
25f957a32dSSimon J. Gerraty.-include <local.meta.sys.env.mk>
26f957a32dSSimon J. Gerraty
270806d0efSSimon J. Gerraty.if !defined(SYS_MK_DIR)
280806d0efSSimon J. GerratySYS_MK_DIR := ${_PARSEDIR}
290806d0efSSimon J. Gerraty.endif
300806d0efSSimon J. Gerraty
31bee3d4bfSSimon J. Gerraty.if !target(.ERROR)
32bee3d4bfSSimon J. Gerraty
33bee3d4bfSSimon J. GerratyMETA_MODE += meta
34bee3d4bfSSimon J. Gerraty.if empty(.MAKEFLAGS:M-s)
35bee3d4bfSSimon J. GerratyMETA_MODE += verbose
36bee3d4bfSSimon J. Gerraty.endif
373b26e5a4SSimon J. Gerraty.if ${MAKE_VERSION:U0} > 20130323 && empty(.MAKE.PATH_FILEMON)
383b26e5a4SSimon J. Gerraty# we do not support filemon
393b26e5a4SSimon J. GerratyMETA_MODE += nofilemon
403b26e5a4SSimon J. GerratyMKDEP_MK ?= auto.dep.mk
413b26e5a4SSimon J. Gerraty.endif
423b26e5a4SSimon J. Gerraty
43*c8245cebSSimon J. Gerraty# META_MODE_XTRAS makes it easier to add things like 'env'
44*c8245cebSSimon J. Gerraty# from the command line when debugging
45*c8245cebSSimon J. Gerraty# :U avoids problems from := below
46*c8245cebSSimon J. GerratyMETA_MODE += ${META_MODE_XTRAS:U}
47*c8245cebSSimon J. Gerraty
487750ad47SMarcel Moolenaar.MAKE.MODE ?= ${META_MODE}
497750ad47SMarcel Moolenaar
503b26e5a4SSimon J. Gerraty_filemon := ${.MAKE.PATH_FILEMON:U/dev/filemon}
513b26e5a4SSimon J. Gerraty
523b26e5a4SSimon J. Gerraty.if empty(UPDATE_DEPENDFILE)
537750ad47SMarcel Moolenaar_make_mode := ${.MAKE.MODE} ${META_MODE}
547750ad47SMarcel Moolenaar.if ${_make_mode:M*read*} != "" || ${_make_mode:M*nofilemon*} != ""
557750ad47SMarcel Moolenaar# tell everyone we are not updating Makefile.depend*
567750ad47SMarcel MoolenaarUPDATE_DEPENDFILE = NO
577750ad47SMarcel Moolenaar.export UPDATE_DEPENDFILE
587750ad47SMarcel Moolenaar.endif
593b26e5a4SSimon J. Gerraty.if ${_filemon:T:Mfilemon} == "filemon"
603b26e5a4SSimon J. Gerraty.if ${UPDATE_DEPENDFILE:Uyes:tl} == "no" && !exists(${_filemon})
617750ad47SMarcel Moolenaar# we should not get upset
627750ad47SMarcel MoolenaarMETA_MODE += nofilemon
637750ad47SMarcel Moolenaar.export META_MODE
647750ad47SMarcel Moolenaar.endif
657750ad47SMarcel Moolenaar.endif
663b26e5a4SSimon J. Gerraty.endif
677750ad47SMarcel Moolenaar
687750ad47SMarcel Moolenaar.if !defined(NO_SILENT)
697750ad47SMarcel Moolenaar.if ${MAKE_VERSION} > 20110818
707750ad47SMarcel Moolenaar# only be silent when we have a .meta file
717750ad47SMarcel MoolenaarMETA_MODE += silent=yes
727750ad47SMarcel Moolenaar.else
737750ad47SMarcel Moolenaar.SILENT:
747750ad47SMarcel Moolenaar.endif
757750ad47SMarcel Moolenaar.endif
767750ad47SMarcel Moolenaar
77bee3d4bfSSimon J. Gerraty.if ${MK_DIRDEPS_BUILD:Uno} == "yes"
787750ad47SMarcel Moolenaar
79312809feSSimon J. Gerraty.if !defined(META2DEPS)
807750ad47SMarcel Moolenaar.if defined(PYTHON) && exists(${PYTHON})
817750ad47SMarcel Moolenaar# we prefer the python version of this - it is much faster
827750ad47SMarcel MoolenaarMETA2DEPS ?= ${.PARSEDIR}/meta2deps.py
837750ad47SMarcel Moolenaar.else
847750ad47SMarcel MoolenaarMETA2DEPS ?= ${.PARSEDIR}/meta2deps.sh
857750ad47SMarcel Moolenaar.endif
867750ad47SMarcel MoolenaarMETA2DEPS := ${META2DEPS}
877750ad47SMarcel Moolenaar.export META2DEPS
887750ad47SMarcel Moolenaar.endif
897750ad47SMarcel Moolenaar
907750ad47SMarcel MoolenaarMAKE_PRINT_VAR_ON_ERROR += \
917750ad47SMarcel Moolenaar	.ERROR_TARGET \
92f974ced3SSimon J. Gerraty	.ERROR_EXIT \
937750ad47SMarcel Moolenaar	.ERROR_META_FILE \
947750ad47SMarcel Moolenaar	.MAKE.LEVEL \
957750ad47SMarcel Moolenaar	MAKEFILE \
967750ad47SMarcel Moolenaar	.MAKE.MODE
977750ad47SMarcel Moolenaar
98bee3d4bfSSimon J. GerratyMK_META_ERROR_TARGET = yes
99bee3d4bfSSimon J. Gerraty.endif
100bee3d4bfSSimon J. Gerraty
101bee3d4bfSSimon J. Gerraty.if ${MK_META_ERROR_TARGET:Uno} == "yes"
102bee3d4bfSSimon J. Gerraty
1037750ad47SMarcel Moolenaar.if !defined(SB) && defined(SRCTOP)
1047750ad47SMarcel MoolenaarSB = ${SRCTOP:H}
1057750ad47SMarcel Moolenaar.endif
1067750ad47SMarcel MoolenaarERROR_LOGDIR ?= ${SB}/error
1077750ad47SMarcel Moolenaarmeta_error_log = ${ERROR_LOGDIR}/meta-${.MAKE.PID}.log
1087750ad47SMarcel Moolenaar
109*c8245cebSSimon J. Gerraty.if ${.MAKE.LEVEL} == 0 && !empty(NEWLOG_SH) && exists(${ERROR_LOGDIR})
110*c8245cebSSimon J. Gerraty.BEGIN:	_rotateErrorLog
111*c8245cebSSimon J. Gerraty_rotateErrorLog: .NOMETA .NOTMAIN
112*c8245cebSSimon J. Gerraty	@${NEWLOG_SH} -d -S -n ${ERROR_LOG_GENS:U4} ${ERROR_LOGDIR}
113*c8245cebSSimon J. Gerraty.endif
114*c8245cebSSimon J. Gerraty
1157750ad47SMarcel Moolenaar.ERROR: _metaError
116f974ced3SSimon J. Gerraty# We are interested here in the target(s) that caused the build to fail.
117f974ced3SSimon J. Gerraty# We want to ignore targets that were "aborted" due to failure
118f974ced3SSimon J. Gerraty# elsewhere per the message below or a sub-make may just exit 6.
1197750ad47SMarcel Moolenaar_metaError: .NOMETA .NOTMAIN
120f974ced3SSimon J. Gerraty	-@[ ${.ERROR_EXIT:U0} = 6 ] && exit 0; \
121f974ced3SSimon J. Gerraty	[ "${.ERROR_META_FILE}" ] && { \
1227750ad47SMarcel Moolenaar	grep -q 'failure has been detected in another branch' ${.ERROR_META_FILE} && exit 0; \
1237750ad47SMarcel Moolenaar	mkdir -p ${meta_error_log:H}; \
1247750ad47SMarcel Moolenaar	cp ${.ERROR_META_FILE} ${meta_error_log}; \
1257750ad47SMarcel Moolenaar	echo "ERROR: log ${meta_error_log}" >&2; }; :
1267750ad47SMarcel Moolenaar
1277750ad47SMarcel Moolenaar.endif
128bee3d4bfSSimon J. Gerraty.endif
1297750ad47SMarcel Moolenaar
1307750ad47SMarcel Moolenaar# Are we, after all, in meta mode?
131be19d90bSSimon J. Gerraty.if ${.MAKE.MODE:Uno:Mmeta*} != ""
1323b26e5a4SSimon J. GerratyMKDEP_MK ?= meta.autodep.mk
133ee7b0571SSimon J. Gerraty
1340806d0efSSimon J. Gerraty# we can afford to use cookies to prevent some targets
1350806d0efSSimon J. Gerraty# re-running needlessly
136462b35acSSimon J. GerratyMETA_COOKIE_TOUCH?= touch ${COOKIE.${.TARGET}:U${.OBJDIR}/${.TARGET:T}}
1370806d0efSSimon J. GerratyMETA_NOPHONY=
138a6589ab7SSimon J. GerratyMETA_NOECHO= :
1390806d0efSSimon J. Gerraty
1400806d0efSSimon J. Gerraty# some targets involve old pre-built targets
1410806d0efSSimon J. Gerraty# ignore mtime of shell
1420806d0efSSimon J. Gerraty# and mtime of makefiles does not matter in meta mode
1430806d0efSSimon J. Gerraty.MAKE.META.IGNORE_PATHS += \
1440806d0efSSimon J. Gerraty	${MAKEFILE} \
145960b77beSSimon J. Gerraty	${MAKE_SHELL} \
1460806d0efSSimon J. Gerraty	${SHELL} \
147960b77beSSimon J. Gerraty	${SYS_MK_DIR} \
148960b77beSSimon J. Gerraty
1490806d0efSSimon J. Gerraty
150a6589ab7SSimon J. Gerraty.if ${UPDATE_DEPENDFILE:Uyes:tl} != "no"
151a6589ab7SSimon J. Gerraty.if ${.MAKEFLAGS:Uno:M-k} != ""
152a6589ab7SSimon J. Gerraty# make this more obvious
153a6589ab7SSimon J. Gerraty.warning Setting UPDATE_DEPENDFILE=NO due to -k
154a6589ab7SSimon J. GerratyUPDATE_DEPENDFILE= NO
155a6589ab7SSimon J. Gerraty.export UPDATE_DEPENDFILE
1563b26e5a4SSimon J. Gerraty.elif ${_filemon:T} == "filemon" && !exists(${_filemon})
15742d08829SSimon J. Gerraty.error ${.newline}ERROR: The filemon module (${_filemon}) is not loaded.
158ee7b0571SSimon J. Gerraty.endif
159a6589ab7SSimon J. Gerraty.endif
1607750ad47SMarcel Moolenaar
161bee3d4bfSSimon J. Gerraty.else				# in meta mode?
1627750ad47SMarcel Moolenaar
163462b35acSSimon J. GerratyMETA_COOKIE_TOUCH=
164462b35acSSimon J. Gerraty# some targets need to be .PHONY in non-meta mode
165462b35acSSimon J. GerratyMETA_NOPHONY= .PHONY
166a6589ab7SSimon J. GerratyMETA_NOECHO= echo
167bee3d4bfSSimon J. Gerraty
168bee3d4bfSSimon J. Gerraty.endif				# in meta mode?
169f957a32dSSimon J. Gerraty
170f957a32dSSimon J. Gerraty.-include <local.meta.sys.mk>
171