xref: /freebsd/contrib/bmake/mk/meta.sys.mk (revision 6a7405f5a6b639682cacf01e35d561411ff556aa)
1c59c3bf3SSimon J. Gerraty# SPDX-License-Identifier: BSD-2-Clause
2c59c3bf3SSimon J. Gerraty#
3*6a7405f5SSimon J. Gerraty# $Id: meta.sys.mk,v 1.56 2024/11/22 23:51:48 sjg Exp $
43cbdda60SSimon J. Gerraty
53cbdda60SSimon J. Gerraty#
6c1d01b5fSSimon J. Gerraty#	@(#) Copyright (c) 2010-2023, Simon J. Gerraty
73cbdda60SSimon J. Gerraty#
83cbdda60SSimon J. Gerraty#	This file is provided in the hope that it will
93cbdda60SSimon J. Gerraty#	be of use.  There is absolutely NO WARRANTY.
103cbdda60SSimon J. Gerraty#	Permission to copy, redistribute or otherwise
113cbdda60SSimon J. Gerraty#	use this file is hereby granted provided that
123cbdda60SSimon J. Gerraty#	the above copyright notice and this notice are
133cbdda60SSimon J. Gerraty#	left intact.
143cbdda60SSimon J. Gerraty#
153cbdda60SSimon J. Gerraty#	Please send copies of changes and bug-fixes to:
163cbdda60SSimon J. Gerraty#	sjg@crufty.net
173cbdda60SSimon J. Gerraty#
183cbdda60SSimon J. Gerraty
193cbdda60SSimon J. Gerraty# include this if you want to enable meta mode
203cbdda60SSimon J. Gerraty# for maximum benefit, requires filemon(4) driver.
213cbdda60SSimon J. Gerraty
22c1d01b5fSSimon J. Gerraty# absolute path to what we are reading.
23c1d01b5fSSimon J. Gerraty_PARSEDIR ?= ${.PARSEDIR:tA}
243cbdda60SSimon J. Gerraty
258c973ee2SSimon J. Gerraty.-include <local.meta.sys.env.mk>
268c973ee2SSimon J. Gerraty
2795e3ed2cSSimon J. Gerraty.if !defined(SYS_MK_DIR)
2895e3ed2cSSimon J. GerratySYS_MK_DIR := ${_PARSEDIR}
2995e3ed2cSSimon J. Gerraty.endif
3095e3ed2cSSimon J. Gerraty
31c1d01b5fSSimon J. Gerraty.if !target(.ERROR)
32c1d01b5fSSimon J. Gerraty
33c1d01b5fSSimon J. GerratyMETA_MODE += meta
34c1d01b5fSSimon J. Gerraty.if empty(.MAKEFLAGS:M-s)
35c1d01b5fSSimon J. GerratyMETA_MODE += verbose
36c1d01b5fSSimon J. Gerraty.endif
3712904384SSimon J. Gerraty.if ${MAKE_VERSION:U0} > 20130323 && empty(.MAKE.PATH_FILEMON)
3812904384SSimon J. Gerraty# we do not support filemon
3912904384SSimon J. GerratyMETA_MODE += nofilemon
4012904384SSimon J. GerratyMKDEP_MK ?= auto.dep.mk
4112904384SSimon J. Gerraty.endif
4212904384SSimon J. Gerraty
43*6a7405f5SSimon J. Gerraty# META_MODE_XTRAS makes it easier to add things like 'env'
44*6a7405f5SSimon J. Gerraty# from the command line when debugging
45*6a7405f5SSimon J. Gerraty# :U avoids problems from := below
46*6a7405f5SSimon J. GerratyMETA_MODE += ${META_MODE_XTRAS:U}
47*6a7405f5SSimon J. Gerraty
483cbdda60SSimon J. Gerraty.MAKE.MODE ?= ${META_MODE}
493cbdda60SSimon J. Gerraty
5012904384SSimon J. Gerraty_filemon := ${.MAKE.PATH_FILEMON:U/dev/filemon}
5112904384SSimon J. Gerraty
5212904384SSimon J. Gerraty.if empty(UPDATE_DEPENDFILE)
533cbdda60SSimon J. Gerraty_make_mode := ${.MAKE.MODE} ${META_MODE}
543cbdda60SSimon J. Gerraty.if ${_make_mode:M*read*} != "" || ${_make_mode:M*nofilemon*} != ""
553cbdda60SSimon J. Gerraty# tell everyone we are not updating Makefile.depend*
563cbdda60SSimon J. GerratyUPDATE_DEPENDFILE = NO
573cbdda60SSimon J. Gerraty.export UPDATE_DEPENDFILE
583cbdda60SSimon J. Gerraty.endif
5912904384SSimon J. Gerraty.if ${_filemon:T:Mfilemon} == "filemon"
6012904384SSimon J. Gerraty.if ${UPDATE_DEPENDFILE:Uyes:tl} == "no" && !exists(${_filemon})
613cbdda60SSimon J. Gerraty# we should not get upset
623cbdda60SSimon J. GerratyMETA_MODE += nofilemon
633cbdda60SSimon J. Gerraty.export META_MODE
643cbdda60SSimon J. Gerraty.endif
653cbdda60SSimon J. Gerraty.endif
6612904384SSimon J. Gerraty.endif
673cbdda60SSimon J. Gerraty
683cbdda60SSimon J. Gerraty.if !defined(NO_SILENT)
693cbdda60SSimon J. Gerraty.if ${MAKE_VERSION} > 20110818
703cbdda60SSimon J. Gerraty# only be silent when we have a .meta file
713cbdda60SSimon J. GerratyMETA_MODE += silent=yes
723cbdda60SSimon J. Gerraty.else
733cbdda60SSimon J. Gerraty.SILENT:
743cbdda60SSimon J. Gerraty.endif
753cbdda60SSimon J. Gerraty.endif
763cbdda60SSimon J. Gerraty
77c1d01b5fSSimon J. Gerraty.if ${MK_DIRDEPS_BUILD:Uno} == "yes"
783cbdda60SSimon J. Gerraty
7949caa483SSimon J. Gerraty.if !defined(META2DEPS)
803cbdda60SSimon J. Gerraty.if defined(PYTHON) && exists(${PYTHON})
813cbdda60SSimon J. Gerraty# we prefer the python version of this - it is much faster
823cbdda60SSimon J. GerratyMETA2DEPS ?= ${.PARSEDIR}/meta2deps.py
833cbdda60SSimon J. Gerraty.else
843cbdda60SSimon J. GerratyMETA2DEPS ?= ${.PARSEDIR}/meta2deps.sh
853cbdda60SSimon J. Gerraty.endif
863cbdda60SSimon J. GerratyMETA2DEPS := ${META2DEPS}
873cbdda60SSimon J. Gerraty.export META2DEPS
883cbdda60SSimon J. Gerraty.endif
893cbdda60SSimon J. Gerraty
903cbdda60SSimon J. GerratyMAKE_PRINT_VAR_ON_ERROR += \
913cbdda60SSimon J. Gerraty	.ERROR_TARGET \
92c59c3bf3SSimon J. Gerraty	.ERROR_EXIT \
933cbdda60SSimon J. Gerraty	.ERROR_META_FILE \
943cbdda60SSimon J. Gerraty	.MAKE.LEVEL \
953cbdda60SSimon J. Gerraty	MAKEFILE \
963cbdda60SSimon J. Gerraty	.MAKE.MODE
973cbdda60SSimon J. Gerraty
98c1d01b5fSSimon J. GerratyMK_META_ERROR_TARGET = yes
99c1d01b5fSSimon J. Gerraty.endif
100c1d01b5fSSimon J. Gerraty
101c1d01b5fSSimon J. Gerraty.if ${MK_META_ERROR_TARGET:Uno} == "yes"
102c1d01b5fSSimon J. Gerraty
1033cbdda60SSimon J. Gerraty.if !defined(SB) && defined(SRCTOP)
1043cbdda60SSimon J. GerratySB = ${SRCTOP:H}
1053cbdda60SSimon J. Gerraty.endif
1063cbdda60SSimon J. GerratyERROR_LOGDIR ?= ${SB}/error
1073cbdda60SSimon J. Gerratymeta_error_log = ${ERROR_LOGDIR}/meta-${.MAKE.PID}.log
1083cbdda60SSimon J. Gerraty
109*6a7405f5SSimon J. Gerraty.if ${.MAKE.LEVEL} == 0 && !empty(NEWLOG_SH) && exists(${ERROR_LOGDIR})
110*6a7405f5SSimon J. Gerraty.BEGIN:	_rotateErrorLog
111*6a7405f5SSimon J. Gerraty_rotateErrorLog: .NOMETA .NOTMAIN
112*6a7405f5SSimon J. Gerraty	@${NEWLOG_SH} -d -S -n ${ERROR_LOG_GENS:U4} ${ERROR_LOGDIR}
113*6a7405f5SSimon J. Gerraty.endif
114*6a7405f5SSimon J. Gerraty
1153cbdda60SSimon J. Gerraty.ERROR: _metaError
116c59c3bf3SSimon J. Gerraty# We are interested here in the target(s) that caused the build to fail.
117c59c3bf3SSimon J. Gerraty# We want to ignore targets that were "aborted" due to failure
118c59c3bf3SSimon J. Gerraty# elsewhere per the message below or a sub-make may just exit 6.
1193cbdda60SSimon J. Gerraty_metaError: .NOMETA .NOTMAIN
120c59c3bf3SSimon J. Gerraty	-@[ ${.ERROR_EXIT:U0} = 6 ] && exit 0; \
121c59c3bf3SSimon J. Gerraty	[ "${.ERROR_META_FILE}" ] && { \
1223cbdda60SSimon J. Gerraty	grep -q 'failure has been detected in another branch' ${.ERROR_META_FILE} && exit 0; \
1233cbdda60SSimon J. Gerraty	mkdir -p ${meta_error_log:H}; \
1243cbdda60SSimon J. Gerraty	cp ${.ERROR_META_FILE} ${meta_error_log}; \
1253cbdda60SSimon J. Gerraty	echo "ERROR: log ${meta_error_log}" >&2; }; :
1263cbdda60SSimon J. Gerraty
1273cbdda60SSimon J. Gerraty.endif
128c1d01b5fSSimon J. Gerraty.endif
1293cbdda60SSimon J. Gerraty
1303cbdda60SSimon J. Gerraty# Are we, after all, in meta mode?
131be19d90bSSimon J. Gerraty.if ${.MAKE.MODE:Uno:Mmeta*} != ""
13212904384SSimon J. GerratyMKDEP_MK ?= meta.autodep.mk
133db29cad8SSimon J. Gerraty
134ac3446e9SSimon J. Gerraty# we can afford to use cookies to prevent some targets
135ac3446e9SSimon J. Gerraty# re-running needlessly
13645447996SSimon J. GerratyMETA_COOKIE_TOUCH?= touch ${COOKIE.${.TARGET}:U${.OBJDIR}/${.TARGET:T}}
137ac3446e9SSimon J. GerratyMETA_NOPHONY=
1388695518cSSimon J. GerratyMETA_NOECHO= :
13995e3ed2cSSimon J. Gerraty
14095e3ed2cSSimon J. Gerraty# some targets involve old pre-built targets
14195e3ed2cSSimon J. Gerraty# ignore mtime of shell
14295e3ed2cSSimon J. Gerraty# and mtime of makefiles does not matter in meta mode
14395e3ed2cSSimon J. Gerraty.MAKE.META.IGNORE_PATHS += \
14495e3ed2cSSimon J. Gerraty	${MAKEFILE} \
14549caa483SSimon J. Gerraty	${MAKE_SHELL} \
14695e3ed2cSSimon J. Gerraty	${SHELL} \
14749caa483SSimon J. Gerraty	${SYS_MK_DIR} \
14849caa483SSimon J. Gerraty
14995e3ed2cSSimon J. Gerraty
150128a4105SSimon J. Gerraty.if ${UPDATE_DEPENDFILE:Uyes:tl} != "no"
151128a4105SSimon J. Gerraty.if ${.MAKEFLAGS:Uno:M-k} != ""
152128a4105SSimon J. Gerraty# make this more obvious
153128a4105SSimon J. Gerraty.warning Setting UPDATE_DEPENDFILE=NO due to -k
154128a4105SSimon J. GerratyUPDATE_DEPENDFILE= NO
155128a4105SSimon J. Gerraty.export UPDATE_DEPENDFILE
15612904384SSimon J. Gerraty.elif ${_filemon:T} == "filemon" && !exists(${_filemon})
15712904384SSimon J. Gerraty.error ${.newline}ERROR: The filemon module (${_filemon}) is not loaded.
158db29cad8SSimon J. Gerraty.endif
159128a4105SSimon J. Gerraty.endif
1603cbdda60SSimon J. Gerraty
161c1d01b5fSSimon J. Gerraty.else				# in meta mode?
1623cbdda60SSimon J. Gerraty
16345447996SSimon J. GerratyMETA_COOKIE_TOUCH=
16445447996SSimon J. Gerraty# some targets need to be .PHONY in non-meta mode
16545447996SSimon J. GerratyMETA_NOPHONY= .PHONY
1668695518cSSimon J. GerratyMETA_NOECHO= echo
167c1d01b5fSSimon J. Gerraty
168c1d01b5fSSimon J. Gerraty.endif				# in meta mode?
1698c973ee2SSimon J. Gerraty
1708c973ee2SSimon J. Gerraty.-include <local.meta.sys.mk>
171