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