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