1# SPDX-License-Identifier: BSD-2-Clause 2# 3# $Id: meta.sys.mk,v 1.54 2024/03/10 15:53:51 sjg Exp $ 4 5# 6# @(#) Copyright (c) 2010-2023, Simon J. Gerraty 7# 8# This file is provided in the hope that it will 9# be of use. There is absolutely NO WARRANTY. 10# Permission to copy, redistribute or otherwise 11# use this file is hereby granted provided that 12# the above copyright notice and this notice are 13# left intact. 14# 15# Please send copies of changes and bug-fixes to: 16# sjg@crufty.net 17# 18 19# include this if you want to enable meta mode 20# for maximum benefit, requires filemon(4) driver. 21 22# absolute path to what we are reading. 23_PARSEDIR ?= ${.PARSEDIR:tA} 24 25.-include <local.meta.sys.env.mk> 26 27.if !defined(SYS_MK_DIR) 28SYS_MK_DIR := ${_PARSEDIR} 29.endif 30 31.if !target(.ERROR) 32 33META_MODE += meta 34.if empty(.MAKEFLAGS:M-s) 35META_MODE += verbose 36.endif 37.if ${MAKE_VERSION:U0} > 20130323 && empty(.MAKE.PATH_FILEMON) 38# we do not support filemon 39META_MODE += nofilemon 40MKDEP_MK ?= auto.dep.mk 41.endif 42 43.MAKE.MODE ?= ${META_MODE} 44 45_filemon := ${.MAKE.PATH_FILEMON:U/dev/filemon} 46 47.if empty(UPDATE_DEPENDFILE) 48_make_mode := ${.MAKE.MODE} ${META_MODE} 49.if ${_make_mode:M*read*} != "" || ${_make_mode:M*nofilemon*} != "" 50# tell everyone we are not updating Makefile.depend* 51UPDATE_DEPENDFILE = NO 52.export UPDATE_DEPENDFILE 53.endif 54.if ${_filemon:T:Mfilemon} == "filemon" 55.if ${UPDATE_DEPENDFILE:Uyes:tl} == "no" && !exists(${_filemon}) 56# we should not get upset 57META_MODE += nofilemon 58.export META_MODE 59.endif 60.endif 61.endif 62 63.if !defined(NO_SILENT) 64.if ${MAKE_VERSION} > 20110818 65# only be silent when we have a .meta file 66META_MODE += silent=yes 67.else 68.SILENT: 69.endif 70.endif 71 72.if ${MK_DIRDEPS_BUILD:Uno} == "yes" 73 74.if !defined(META2DEPS) 75.if defined(PYTHON) && exists(${PYTHON}) 76# we prefer the python version of this - it is much faster 77META2DEPS ?= ${.PARSEDIR}/meta2deps.py 78.else 79META2DEPS ?= ${.PARSEDIR}/meta2deps.sh 80.endif 81META2DEPS := ${META2DEPS} 82.export META2DEPS 83.endif 84 85MAKE_PRINT_VAR_ON_ERROR += \ 86 .ERROR_TARGET \ 87 .ERROR_EXIT \ 88 .ERROR_META_FILE \ 89 .MAKE.LEVEL \ 90 MAKEFILE \ 91 .MAKE.MODE 92 93MK_META_ERROR_TARGET = yes 94.endif 95 96.if ${MK_META_ERROR_TARGET:Uno} == "yes" 97 98.if !defined(SB) && defined(SRCTOP) 99SB = ${SRCTOP:H} 100.endif 101ERROR_LOGDIR ?= ${SB}/error 102meta_error_log = ${ERROR_LOGDIR}/meta-${.MAKE.PID}.log 103 104.ERROR: _metaError 105# We are interested here in the target(s) that caused the build to fail. 106# We want to ignore targets that were "aborted" due to failure 107# elsewhere per the message below or a sub-make may just exit 6. 108_metaError: .NOMETA .NOTMAIN 109 -@[ ${.ERROR_EXIT:U0} = 6 ] && exit 0; \ 110 [ "${.ERROR_META_FILE}" ] && { \ 111 grep -q 'failure has been detected in another branch' ${.ERROR_META_FILE} && exit 0; \ 112 mkdir -p ${meta_error_log:H}; \ 113 cp ${.ERROR_META_FILE} ${meta_error_log}; \ 114 echo "ERROR: log ${meta_error_log}" >&2; }; : 115 116.endif 117.endif 118 119# Are we, after all, in meta mode? 120.if ${.MAKE.MODE:Uno:Mmeta*} != "" 121MKDEP_MK ?= meta.autodep.mk 122 123# we can afford to use cookies to prevent some targets 124# re-running needlessly 125META_COOKIE_TOUCH?= touch ${COOKIE.${.TARGET}:U${.OBJDIR}/${.TARGET:T}} 126META_NOPHONY= 127META_NOECHO= : 128 129# some targets involve old pre-built targets 130# ignore mtime of shell 131# and mtime of makefiles does not matter in meta mode 132.MAKE.META.IGNORE_PATHS += \ 133 ${MAKEFILE} \ 134 ${MAKE_SHELL} \ 135 ${SHELL} \ 136 ${SYS_MK_DIR} \ 137 138 139.if ${UPDATE_DEPENDFILE:Uyes:tl} != "no" 140.if ${.MAKEFLAGS:Uno:M-k} != "" 141# make this more obvious 142.warning Setting UPDATE_DEPENDFILE=NO due to -k 143UPDATE_DEPENDFILE= NO 144.export UPDATE_DEPENDFILE 145.elif ${_filemon:T} == "filemon" && !exists(${_filemon}) 146.error ${.newline}ERROR: The filemon module (${_filemon}) is not loaded. 147.endif 148.endif 149 150.else # in meta mode? 151 152META_COOKIE_TOUCH= 153# some targets need to be .PHONY in non-meta mode 154META_NOPHONY= .PHONY 155META_NOECHO= echo 156 157.endif # in meta mode? 158 159.-include <local.meta.sys.mk> 160