xref: /freebsd/contrib/bmake/mk/gendirdeps.mk (revision 0b46a53a2f50b5ab0f4598104119a049b9c42cc9)
1*0b46a53aSSimon J. Gerraty# $Id: gendirdeps.mk,v 1.53 2025/05/20 17:42:49 sjg Exp $
23cbdda60SSimon J. Gerraty
38c973ee2SSimon J. Gerraty# SPDX-License-Identifier: BSD-2-Clause
48c973ee2SSimon J. Gerraty#
5*0b46a53aSSimon J. Gerraty# Copyright (c) 2011-2025, Simon J. Gerraty
649caa483SSimon J. Gerraty# Copyright (c) 2010-2018, Juniper Networks, Inc.
71748de26SSimon J. Gerraty# All rights reserved.
83cbdda60SSimon J. Gerraty#
93cbdda60SSimon J. Gerraty# Redistribution and use in source and binary forms, with or without
103cbdda60SSimon J. Gerraty# modification, are permitted provided that the following conditions
113cbdda60SSimon J. Gerraty# are met:
123cbdda60SSimon J. Gerraty# 1. Redistributions of source code must retain the above copyright
133cbdda60SSimon J. Gerraty#    notice, this list of conditions and the following disclaimer.
143cbdda60SSimon J. Gerraty# 2. Redistributions in binary form must reproduce the above copyright
153cbdda60SSimon J. Gerraty#    notice, this list of conditions and the following disclaimer in the
163cbdda60SSimon J. Gerraty#    documentation and/or other materials provided with the distribution.
173cbdda60SSimon J. Gerraty#
183cbdda60SSimon J. Gerraty# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
193cbdda60SSimon J. Gerraty# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
203cbdda60SSimon J. Gerraty# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
213cbdda60SSimon J. Gerraty# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
223cbdda60SSimon J. Gerraty# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
233cbdda60SSimon J. Gerraty# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
243cbdda60SSimon J. Gerraty# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
253cbdda60SSimon J. Gerraty# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
263cbdda60SSimon J. Gerraty# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
273cbdda60SSimon J. Gerraty# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
283cbdda60SSimon J. Gerraty# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
293cbdda60SSimon J. Gerraty
303cbdda60SSimon J. Gerraty#
313cbdda60SSimon J. Gerraty# This makefile [re]generates ${.MAKE.DEPENDFILE}
323cbdda60SSimon J. Gerraty#
333cbdda60SSimon J. Gerraty
343cbdda60SSimon J. Gerraty.include <install-new.mk>
353cbdda60SSimon J. Gerraty
363cbdda60SSimon J. Gerraty# Assumptions:
373cbdda60SSimon J. Gerraty#	RELDIR is the relative path from ${SRCTOP} to ${_CURDIR}
383cbdda60SSimon J. Gerraty#		(SRCTOP is ${SB}/src)
393cbdda60SSimon J. Gerraty#	_CURDIR is the absolute version of ${.CURDIR}
403cbdda60SSimon J. Gerraty#	_OBJDIR is the absolute version of ${.OBJDIR}
413cbdda60SSimon J. Gerraty#	_objroot is realpath of ${_OBJTOP} without ${MACHINE}
423cbdda60SSimon J. Gerraty#		this may be different from _OBJROOT if $SB/obj is a
433cbdda60SSimon J. Gerraty#		symlink to another filesystem.
443cbdda60SSimon J. Gerraty#		_objroot must be a prefix match for _objtop
453cbdda60SSimon J. Gerraty
468c973ee2SSimon J. Gerraty# If any of GENDIRDEPS_FILTER, GENDIRDEPS_FILTER_DIR_VARS
478c973ee2SSimon J. Gerraty# or GENDIRDEPS_FILTER_VARS are set, we use them to filter the
488c973ee2SSimon J. Gerraty# output from filemon(4).
498c973ee2SSimon J. Gerraty# Any references to variables that dirdeps.mk will set
508c973ee2SSimon J. Gerraty# such as DEP_MACHINE, DEP_RELDIR etc, should use that form.
518c973ee2SSimon J. Gerraty# Thus we want ${DEP_MACHINE} not ${MACHINE} used in DIRDEPS.
528c973ee2SSimon J. Gerraty#
538c973ee2SSimon J. Gerraty# If any manually maintained Makefile.depend files will use any
548c973ee2SSimon J. Gerraty# DEP_* variables in conditionals, precautions are needed to avoid
558c973ee2SSimon J. Gerraty# errors when Makefile.depend is read at level 1+ (ie not via
568c973ee2SSimon J. Gerraty# dirdeps.mk)
578c973ee2SSimon J. Gerraty# Using MACHINE as an example; such makefiles can do:
588c973ee2SSimon J. Gerraty#
598c973ee2SSimon J. Gerraty# 	DEP_MACHINE ?= ${MACHINE}
608c973ee2SSimon J. Gerraty# 	.if ${DEP_MACHINE} == "xyz"
618c973ee2SSimon J. Gerraty#
628c973ee2SSimon J. Gerraty# or:
638c973ee2SSimon J. Gerraty#
648c973ee2SSimon J. Gerraty# 	.if ${DEP_MACHINE:U${MACHINE}} == "xyz"
658c973ee2SSimon J. Gerraty#
668c973ee2SSimon J. Gerraty# but it might be safer to set GENDIRDEPS_FILTER_DIR_VARS and
678c973ee2SSimon J. Gerraty# GENDIRDEPS_FILTER_VARS via local.meta.sys.mk rather than
688c973ee2SSimon J. Gerraty# local.gendirdeps.mk and then:
698c973ee2SSimon J. Gerraty#
708c973ee2SSimon J. Gerraty# 	.if ${.MAKE.LEVEL} > 0
718c973ee2SSimon J. Gerraty# 	.for V in ${GENDIRDEPS_FILTER_DIR_VARS:MDEP_*} \
728c973ee2SSimon J. Gerraty# 		${GENDIRDEPS_FILTER_VARS:MDEP_*}
738c973ee2SSimon J. Gerraty# 	$V ?= ${${V:S,DEP_,,}}
748c973ee2SSimon J. Gerraty# 	.endfor
758c973ee2SSimon J. Gerraty# 	.endif
768c973ee2SSimon J. Gerraty#
773cbdda60SSimon J. Gerraty.MAIN: all
783cbdda60SSimon J. Gerraty
79*0b46a53aSSimon J. Gerraty.if ${DEBUG_GENDIRDEPS:Uno:@m@${RELDIR:M$m}@} != ""
80*0b46a53aSSimon J. Gerraty_debug.gendirdeps = 1
81*0b46a53aSSimon J. Gerraty.else
82*0b46a53aSSimon J. Gerraty_debug.gendirdeps = 0
83*0b46a53aSSimon J. Gerraty.endif
84*0b46a53aSSimon J. Gerraty
853cbdda60SSimon J. Gerraty# keep this simple
863cbdda60SSimon J. Gerraty.MAKE.MODE = compat
873cbdda60SSimon J. Gerraty
883cbdda60SSimon J. Gerratyall:
893cbdda60SSimon J. Gerraty
903cbdda60SSimon J. Gerraty_CURDIR ?= ${.CURDIR}
913cbdda60SSimon J. Gerraty_OBJDIR ?= ${.OBJDIR}
923cbdda60SSimon J. Gerraty_OBJTOP ?= ${OBJTOP}
933841c287SSimon J. Gerraty_OBJROOT ?= ${OBJROOT:U${_OBJTOP:H}}
941748de26SSimon J. Gerraty.if ${_OBJROOT:M*/}
951748de26SSimon J. Gerraty_slash=/
961748de26SSimon J. Gerraty.else
971748de26SSimon J. Gerraty_slash=
981748de26SSimon J. Gerraty.endif
991748de26SSimon J. Gerraty_objroot ?= ${_OBJROOT:tA}${_slash}
1003cbdda60SSimon J. Gerraty
1013cbdda60SSimon J. Gerraty_this = ${.PARSEDIR}/${.PARSEFILE}
1023cbdda60SSimon J. Gerraty
1033cbdda60SSimon J. Gerraty# remember what to make
1043cbdda60SSimon J. Gerraty_DEPENDFILE := ${_CURDIR}/${.MAKE.DEPENDFILE:T}
1053cbdda60SSimon J. Gerraty
1063cbdda60SSimon J. Gerraty# We do _not_ want to read our own output!
1073cbdda60SSimon J. Gerraty.MAKE.DEPENDFILE = /dev/null
1083cbdda60SSimon J. Gerraty
1093cbdda60SSimon J. Gerraty# caller should have set this
1103cbdda60SSimon J. GerratyMETA_FILES ?= ${.MAKE.META.FILES}
111d5e0a182SSimon J. Gerraty# this sometimes needs to be passed separately
112d5e0a182SSimon J. Gerraty.if !empty(META_XTRAS)
113d5e0a182SSimon J. GerratyMETA_FILES += ${META_XTRAS:N\*.meta}
114d5e0a182SSimon J. Gerraty.endif
1153cbdda60SSimon J. Gerraty
1163cbdda60SSimon J. Gerraty.if !empty(META_FILES)
117*0b46a53aSSimon J. Gerraty.if ${_debug.gendirdeps} && ${DEBUG_GENDIRDEPS:Mmeta*} != ""
118*0b46a53aSSimon J. Gerraty.info ${RELDIR}: META_FILES=${META_FILES}
119*0b46a53aSSimon J. Gerraty.endif
1203cbdda60SSimon J. Gerraty
1213cbdda60SSimon J. Gerraty.if ${.MAKE.LEVEL} > 0 && !empty(GENDIRDEPS_FILTER)
1223cbdda60SSimon J. Gerraty# so we can compare below
1233cbdda60SSimon J. Gerraty.-include <${_DEPENDFILE}>
1243cbdda60SSimon J. Gerraty# yes, I mean :U with no value
1253cbdda60SSimon J. Gerraty_DIRDEPS := ${DIRDEPS:U:O:u}
1263cbdda60SSimon J. Gerraty.endif
1273cbdda60SSimon J. Gerraty
1283cbdda60SSimon J. GerratyMETA_FILES := ${META_FILES:T:O:u}
1293cbdda60SSimon J. Gerraty
1303cbdda60SSimon J. Gerraty# pickup customizations
131e48f47ddSSimon J. Gerraty.-include <local.gendirdeps.mk>
1323cbdda60SSimon J. Gerraty
1333cbdda60SSimon J. Gerraty# these are actually prefixes that we'll skip
1343cbdda60SSimon J. Gerraty# they should all be absolute paths
1353cbdda60SSimon J. GerratySKIP_GENDIRDEPS ?=
1363cbdda60SSimon J. Gerraty.if !empty(SKIP_GENDIRDEPS)
1374fde40d9SSimon J. Gerraty_skip_gendirdeps = ${EGREP:Uegrep} -v '^(${SKIP_GENDIRDEPS:O:u:ts|})' |
1383cbdda60SSimon J. Gerraty.else
1393cbdda60SSimon J. Gerraty_skip_gendirdeps =
1403cbdda60SSimon J. Gerraty.endif
1413cbdda60SSimon J. Gerraty
142db29cad8SSimon J. Gerraty# Below we will turn _{VAR} into ${VAR} which keeps this simple
143db29cad8SSimon J. Gerraty# GENDIRDEPS_FILTER_DIR_VARS is a list of dirs to be substiuted for.
144db29cad8SSimon J. Gerraty# GENDIRDEPS_FILTER_VARS is more general.
145db29cad8SSimon J. Gerraty# In each case order matters.
146db29cad8SSimon J. Gerraty.if !empty(GENDIRDEPS_FILTER_DIR_VARS)
147db29cad8SSimon J. GerratyGENDIRDEPS_FILTER += ${GENDIRDEPS_FILTER_DIR_VARS:@v@S,${$v},_{${v}},@}
148db29cad8SSimon J. Gerraty.endif
149db29cad8SSimon J. Gerraty.if !empty(GENDIRDEPS_FILTER_VARS)
150db29cad8SSimon J. GerratyGENDIRDEPS_FILTER += ${GENDIRDEPS_FILTER_VARS:@v@S,/${$v}/,/_{${v}}/,@:NS,//,*:u}
151db29cad8SSimon J. Gerraty.endif
152db29cad8SSimon J. Gerraty
1533cbdda60SSimon J. Gerraty# this (*should* be set in meta.sys.mk)
1543cbdda60SSimon J. Gerraty# is the script that extracts what we want.
1553cbdda60SSimon J. GerratyMETA2DEPS ?= ${.PARSEDIR}/meta2deps.sh
1563cbdda60SSimon J. GerratyMETA2DEPS := ${META2DEPS}
1573cbdda60SSimon J. Gerraty
158*0b46a53aSSimon J. Gerraty.if ${_debug.gendirdeps} && ${DEBUG_GENDIRDEPS:Mmeta2d*} != ""
1593cbdda60SSimon J. Gerraty_time = time
1603cbdda60SSimon J. Gerraty_sh_x = sh -x
1613cbdda60SSimon J. Gerraty_py_d = -ddd
1623cbdda60SSimon J. Gerraty.else
1633cbdda60SSimon J. Gerraty_time =
1643cbdda60SSimon J. Gerraty_sh_x =
1653cbdda60SSimon J. Gerraty_py_d =
1663cbdda60SSimon J. Gerraty.endif
1673cbdda60SSimon J. Gerraty
1683cbdda60SSimon J. Gerraty.if ${META2DEPS:E} == "py"
1693cbdda60SSimon J. Gerraty# we can afford to do this all the time.
1703cbdda60SSimon J. GerratyDPDEPS ?= no
17152d86256SSimon J. GerratyMETA2DEPS_CMD = ${_time} ${PYTHON} ${META2DEPS} ${_py_d}
1723cbdda60SSimon J. Gerraty.if ${DPDEPS:tl} != "no"
1733cbdda60SSimon J. GerratyMETA2DEPS_CMD += -D ${DPDEPS}
1743cbdda60SSimon J. Gerraty.endif
17552d86256SSimon J. GerratyMETA2DEPS_FILTER = sed 's,^src:,${SRCTOP}/,;s,^\([^/]\),${OBJTOP}/\1,' |
17652d86256SSimon J. Gerraty.elif ${META2DEPS:E} == "sh"
17752d86256SSimon J. GerratyMETA2DEPS_CMD = ${_time} ${_sh_x} ${META2DEPS} OBJTOP=${_OBJTOP}
17852d86256SSimon J. Gerraty.else
17952d86256SSimon J. GerratyMETA2DEPS_CMD ?= ${META2DEPS}
18052d86256SSimon J. Gerraty.endif
18152d86256SSimon J. Gerraty
18252d86256SSimon J. Gerraty.if ${TARGET_OBJ_SPEC:U${MACHINE}} != ${MACHINE}
18352d86256SSimon J. GerratyMETA2DEPS_CMD += -T ${TARGET_OBJ_SPEC}
18452d86256SSimon J. Gerraty.endif
18552d86256SSimon J. GerratyMETA2DEPS_CMD += \
18652d86256SSimon J. Gerraty	-R ${RELDIR} -H ${HOST_TARGET} \
187e48f47ddSSimon J. Gerraty	${M2D_OBJROOTS:O:u:@o@-O $o@} \
188e48f47ddSSimon J. Gerraty	${M2D_EXCLUDES:O:u:@o@-X $o@} \
18952d86256SSimon J. Gerraty
1901748de26SSimon J. Gerraty
1911748de26SSimon J. GerratyM2D_OBJROOTS += ${OBJTOP} ${_OBJROOT} ${_objroot}
1921748de26SSimon J. Gerraty.if defined(SB_OBJROOT)
1931748de26SSimon J. GerratyM2D_OBJROOTS += ${SB_OBJROOT}
1941748de26SSimon J. Gerraty.endif
19545447996SSimon J. Gerraty.if defined(STAGE_ROOT)
19645447996SSimon J. GerratyM2D_OBJROOTS += ${STAGE_ROOT}
19745447996SSimon J. Gerraty.endif
1983cbdda60SSimon J. Gerraty.if ${.MAKE.DEPENDFILE_PREFERENCE:U${.MAKE.DEPENDFILE}:M*.${MACHINE}} == ""
1993cbdda60SSimon J. Gerraty# meta2deps.py only groks objroot
2003cbdda60SSimon J. Gerraty# so we need to give it what it expects
2013cbdda60SSimon J. Gerraty# and tell it not to add machine qualifiers
2023cbdda60SSimon J. GerratyMETA2DEPS_ARGS += MACHINE=none
2033cbdda60SSimon J. Gerraty.endif
2043cbdda60SSimon J. Gerraty.if defined(SB_BACKING_SB)
2051748de26SSimon J. GerratyMETA2DEPS_CMD += -S ${SB_BACKING_SB}/src
2061748de26SSimon J. GerratyM2D_OBJROOTS += ${SB_BACKING_SB}/${SB_OBJPREFIX}
2073cbdda60SSimon J. Gerraty.endif
2083cbdda60SSimon J. Gerraty
209494f7191SSimon J. GerratyGENDIRDEPS_SEDCMDS += \
210494f7191SSimon J. Gerraty	-e 's,//*$$,,;s,\.${HOST_TARGET:Uhost}$$,.host,' \
211494f7191SSimon J. Gerraty	-e 's,\.${HOST_TARGET32:Uhost32}$$,.host32,' \
212494f7191SSimon J. Gerraty	-e 's,\.${MACHINE}$$,,' \
213494f7191SSimon J. Gerraty	-e 's:\.${TARGET_SPEC:U${MACHINE}}$$::'
214494f7191SSimon J. Gerraty
2153cbdda60SSimon J. Gerraty# we are only interested in the dirs
2164c620fe5SSimon J. Gerraty# specifically those we read something from.
2173cbdda60SSimon J. Gerraty# we canonicalize them to keep things simple
2183cbdda60SSimon J. Gerraty# if we are using a split-fs sandbox, it gets a little messier.
2193cbdda60SSimon J. Gerraty_objtop := ${_OBJTOP:tA}
2202eae894cSSimon J. Gerraty
2212eae894cSSimon J. Gerraty# some people put *.meta in META_XTRAS to make sure we get here
2222eae894cSSimon J. Gerraty_meta_files := ${META_FILES:N\*.meta:O:u}
2232eae894cSSimon J. Gerraty# assume a big list
2242eae894cSSimon J. Gerraty_meta_files_arg= @meta.list
2252eae894cSSimon J. Gerraty.if empty(_meta_files) && ${META_FILES:M\*.meta} != ""
2262eae894cSSimon J. Gerraty# XXX this should be considered a bad idea,
2272eae894cSSimon J. Gerraty# since we cannot ignore stale .meta
2282eae894cSSimon J. Gerratyx != cd ${_OBJDIR} && find . -name '*.meta' -print -o \( -type d ! -name . -prune \) | sed 's,^./,,' > meta.list; echo
2292eae894cSSimon J. Gerraty.elif ${_meta_files:[#]} > 500
2302eae894cSSimon J. Gerraty.export _meta_files
2312eae894cSSimon J. Gerratyx != echo; for m in $$_meta_files; do echo $$m; done > meta.list
23249caa483SSimon J. Gerraty# _meta_files is consuming a lot of env space
23349caa483SSimon J. Gerraty# that can impact command line length,
23449caa483SSimon J. Gerraty# and we do not need it any more
23549caa483SSimon J. Gerraty.undef _meta_files
23649caa483SSimon J. Gerraty.unexport _meta_files
2372eae894cSSimon J. Gerraty.else
2382eae894cSSimon J. Gerraty_meta_files_arg:= ${_meta_files}
2392eae894cSSimon J. Gerraty.endif
2402eae894cSSimon J. Gerraty
2413cbdda60SSimon J. Gerratydir_list != cd ${_OBJDIR} && \
2423cbdda60SSimon J. Gerraty	${META2DEPS_CMD} MACHINE=${MACHINE} \
2433cbdda60SSimon J. Gerraty	SRCTOP=${SRCTOP} RELDIR=${RELDIR} CURDIR=${_CURDIR} \
2443cbdda60SSimon J. Gerraty	${META2DEPS_ARGS} \
2452eae894cSSimon J. Gerraty	${_meta_files_arg} | ${META2DEPS_FILTER} ${_skip_gendirdeps} \
246494f7191SSimon J. Gerraty	sed ${GENDIRDEPS_SEDCMDS}
2473cbdda60SSimon J. Gerraty
2483cbdda60SSimon J. Gerraty.if ${dir_list:M*ERROR\:*} != ""
2496a7405f5SSimon J. Gerraty.warning ${dir_list:C,.*(ERROR),\1,W}
2503cbdda60SSimon J. Gerraty.warning Skipping ${_DEPENDFILE:S,${SRCTOP}/,,}
2513cbdda60SSimon J. Gerraty# we are not going to update anything
2523cbdda60SSimon J. Gerraty.else
2531bbe5942SSimon J. Gerratydpadd_dir_list=
2543cbdda60SSimon J. Gerraty.if !empty(DPADD)
2553cbdda60SSimon J. Gerraty_nonlibs := ${DPADD:T:Nlib*:N*include}
2563cbdda60SSimon J. Gerraty.if !empty(_nonlibs)
2571748de26SSimon J. Gerratyddep_list =
2581748de26SSimon J. Gerraty.for f in ${_nonlibs:@x@${DPADD:M*/$x}@}
2591748de26SSimon J. Gerraty.if exists($f.dirdep)
2601748de26SSimon J. Gerratyddep_list += $f.dirdep
2611748de26SSimon J. Gerraty.elif exists(${f:H}.dirdep)
2621748de26SSimon J. Gerratyddep_list += ${f:H}.dirdep
2631748de26SSimon J. Gerraty.else
2641748de26SSimon J. Gerratydir_list += ${f:H:tA}
2651bbe5942SSimon J. Gerratydpadd_dir_list += ${f:H:tA}
2661748de26SSimon J. Gerraty.endif
2671748de26SSimon J. Gerraty.endfor
2681748de26SSimon J. Gerraty.if !empty(ddep_list)
2691748de26SSimon J. Gerratyddeps != cat ${ddep_list:O:u} | ${META2DEPS_FILTER} ${_skip_gendirdeps} \
270494f7191SSimon J. Gerraty	sed ${GENDIRDEPS_SEDCMDS}
2711748de26SSimon J. Gerraty
272*0b46a53aSSimon J. Gerraty.if ${_debug.gendirdeps}
2731748de26SSimon J. Gerraty.info ${RELDIR}: raw_dir_list='${dir_list}'
2741748de26SSimon J. Gerraty.info ${RELDIR}: ddeps='${ddeps}'
2751748de26SSimon J. Gerraty.endif
2761748de26SSimon J. Gerratydir_list += ${ddeps}
2771748de26SSimon J. Gerraty.endif
2783cbdda60SSimon J. Gerraty.endif
2793cbdda60SSimon J. Gerraty.endif
2803cbdda60SSimon J. Gerraty
2813cbdda60SSimon J. Gerraty# DIRDEPS represent things that had to have been built first
2823cbdda60SSimon J. Gerraty# so they should all be undir OBJTOP.
2833cbdda60SSimon J. Gerraty# Note that ${_OBJTOP}/bsd/include/machine will get reported
2843cbdda60SSimon J. Gerraty# to us as $SRCTOP/bsd/sys/$MACHINE_ARCH/include meaning we
2853cbdda60SSimon J. Gerraty# will want to visit bsd/include
2863cbdda60SSimon J. Gerraty# so we add
2873cbdda60SSimon J. Gerraty# ${"${dir_list:M*bsd/sys/${MACHINE_ARCH}/include}":?bsd/include:}
2883cbdda60SSimon J. Gerraty# to GENDIRDEPS_DIR_LIST_XTRAS
2891bbe5942SSimon J. Gerraty_objtops = ${OBJTOP} ${_OBJTOP} ${_objtop}
2901748de26SSimon J. Gerraty_objtops := ${_objtops:O:u}
2913cbdda60SSimon J. Gerratydirdep_list = \
2921748de26SSimon J. Gerraty	${_objtops:@o@${dir_list:M$o*/*:C,$o[^/]*/,,}@} \
2933cbdda60SSimon J. Gerraty	${GENDIRDEPS_DIR_LIST_XTRAS}
2943cbdda60SSimon J. Gerraty
2951748de26SSimon J. Gerraty# sort longest first
2961748de26SSimon J. GerratyM2D_OBJROOTS := ${M2D_OBJROOTS:O:u:[-1..1]}
2971748de26SSimon J. Gerraty
2983cbdda60SSimon J. Gerraty# anything we use from an object dir other than ours
2993cbdda60SSimon J. Gerraty# needs to be qualified with its .<machine> suffix
3003cbdda60SSimon J. Gerraty# (we used the pseudo machine "host" for the HOST_TARGET).
3011748de26SSimon J. Gerratyskip_ql= ${SRCTOP}* ${_objtops:@o@$o*@}
3021748de26SSimon J. Gerraty.for o in ${M2D_OBJROOTS:${skip_ql:${M_ListToSkip}}}
3031748de26SSimon J. Gerraty# we need := so only skip_ql to this point applies
3041bbe5942SSimon J. Gerratyql.$o := ${dir_list:${skip_ql:${M_ListToSkip}}:M$o*/*/*:C,$o([^/]+)/(.*),\2.\1,:S,.${HOST_TARGET},.host,}
3051bbe5942SSimon J. Gerratyqualdir_list += ${ql.$o}
306*0b46a53aSSimon J. Gerraty.if ${_debug.gendirdeps}
3071bbe5942SSimon J. Gerraty.info ${RELDIR}: o=$o ${ql.$o qualdir_list:L:@v@$v=${$v}@}
3081bbe5942SSimon J. Gerraty.endif
3091748de26SSimon J. Gerratyskip_ql+= $o*
3101748de26SSimon J. Gerraty.endfor
3113cbdda60SSimon J. Gerraty
3123cbdda60SSimon J. Gerratydirdep_list := ${dirdep_list:O:u}
3131748de26SSimon J. Gerratyqualdir_list := ${qualdir_list:N*.${MACHINE}:O:u}
3143cbdda60SSimon J. Gerraty
3153cbdda60SSimon J. GerratyDIRDEPS = \
3163cbdda60SSimon J. Gerraty	${dirdep_list:N${RELDIR}:N${RELDIR}/*} \
3173cbdda60SSimon J. Gerraty	${qualdir_list:N${RELDIR}.*:N${RELDIR}/*}
3183cbdda60SSimon J. Gerraty
3193cbdda60SSimon J. Gerraty# We only consider things below $RELDIR/ if they have a makefile.
3205bcb7424SSimon J. Gerraty# This is the same test that _DIRDEP_USE applies.
3213cbdda60SSimon J. Gerraty# We have do a double test with dirdep_list as it _may_ contain
3223cbdda60SSimon J. Gerraty# qualified dirs - if we got anything from a stage dir.
3233cbdda60SSimon J. Gerraty# qualdir_list we know are all qualified.
3243cbdda60SSimon J. Gerraty# It would be nice do peform this check for all of DIRDEPS,
3253cbdda60SSimon J. Gerraty# but we cannot assume that all of the tree is present,
3263cbdda60SSimon J. Gerraty# in fact we can only assume that RELDIR is.
3273cbdda60SSimon J. GerratyDIRDEPS += \
3283cbdda60SSimon J. Gerraty	${dirdep_list:M${RELDIR}/*:@d@${.MAKE.MAKEFILE_PREFERENCE:@m@${exists(${SRCTOP}/$d/$m):?$d:${exists(${SRCTOP}/${d:R}/$m):?$d:}}@}@} \
3293cbdda60SSimon J. Gerraty	${qualdir_list:M${RELDIR}/*:@d@${.MAKE.MAKEFILE_PREFERENCE:@m@${exists(${SRCTOP}/${d:R}/$m):?$d:}@}@}
3303cbdda60SSimon J. Gerraty
33150d2e745SSimon J. Gerraty# what modifiers do we allow in GENDIRDEPS_FILTER
33250d2e745SSimon J. GerratyGENDIRDEPS_FILTER_MASK += @CMNS
33350d2e745SSimon J. GerratyDIRDEPS := ${DIRDEPS:${GENDIRDEPS_FILTER:UNno:M[${GENDIRDEPS_FILTER_MASK:O:u:ts}]*:ts:}:C,//+,/,g:O:u}
3343cbdda60SSimon J. Gerraty
335*0b46a53aSSimon J. Gerraty.if ${_debug.gendirdeps}
3361748de26SSimon J. Gerraty.info ${RELDIR}: M2D_OBJROOTS=${M2D_OBJROOTS}
337e48f47ddSSimon J. Gerraty.info ${RELDIR}: M2D_EXCLUDES=${M2D_EXCLUDES}
3383cbdda60SSimon J. Gerraty.info ${RELDIR}: dir_list='${dir_list}'
3391bbe5942SSimon J. Gerraty.info ${RELDIR}: dpadd_dir_list='${dpadd_dir_list}'
3403cbdda60SSimon J. Gerraty.info ${RELDIR}: dirdep_list='${dirdep_list}'
3413cbdda60SSimon J. Gerraty.info ${RELDIR}: qualdir_list='${qualdir_list}'
3423cbdda60SSimon J. Gerraty.info ${RELDIR}: SKIP_GENDIRDEPS='${SKIP_GENDIRDEPS}'
3433cbdda60SSimon J. Gerraty.info ${RELDIR}: GENDIRDEPS_FILTER='${GENDIRDEPS_FILTER}'
3443cbdda60SSimon J. Gerraty.info ${RELDIR}: FORCE_DPADD='${DPADD}'
3453cbdda60SSimon J. Gerraty.info ${RELDIR}: DIRDEPS='${DIRDEPS}'
3463cbdda60SSimon J. Gerraty.endif
3473cbdda60SSimon J. Gerraty
3483cbdda60SSimon J. Gerraty# SRC_DIRDEPS is for checkout logic
3493cbdda60SSimon J. Gerratysrc_dirdep_list = \
3503cbdda60SSimon J. Gerraty	${dir_list:M${SRCTOP}/*:S,${SRCTOP}/,,}
3513cbdda60SSimon J. Gerraty
3523cbdda60SSimon J. GerratySRC_DIRDEPS = \
3533cbdda60SSimon J. Gerraty	${src_dirdep_list:N${RELDIR}:N${RELDIR}/*:C,(/h)/.*,,}
3543cbdda60SSimon J. Gerraty
3555bcb7424SSimon J. GerratySRC_DIRDEPS := ${SRC_DIRDEPS:${GENDIRDEPS_SRC_FILTER:UN/*:ts:}:C,//+,/,g:O:u}
3563cbdda60SSimon J. Gerraty
3573cbdda60SSimon J. Gerraty# if you want to capture SRC_DIRDEPS in .MAKE.DEPENDFILE put
3583cbdda60SSimon J. Gerraty# SRC_DIRDEPS_FILE = ${_DEPENDFILE}
3593cbdda60SSimon J. Gerraty# in local.gendirdeps.mk
3603cbdda60SSimon J. Gerraty.if ${SRC_DIRDEPS_FILE:Uno:tl} != "no"
3613cbdda60SSimon J. GerratyECHO_SRC_DIRDEPS = echo 'SRC_DIRDEPS = \'; echo '${SRC_DIRDEPS:@d@	$d \\${.newline}@}'; echo;
3623cbdda60SSimon J. Gerraty
3633cbdda60SSimon J. Gerraty.if ${SRC_DIRDEPS_FILE:T} == ${_DEPENDFILE:T}
3643cbdda60SSimon J. Gerraty_include_src_dirdeps = ${ECHO_SRC_DIRDEPS}
3653cbdda60SSimon J. Gerraty.else
3663cbdda60SSimon J. Gerratyall: ${SRC_DIRDEPS_FILE}
3673cbdda60SSimon J. Gerraty.if !target(${SRC_DIRDEPS_FILE})
3683cbdda60SSimon J. Gerraty${SRC_DIRDEPS_FILE}: ${META_FILES} ${_this} ${META2DEPS}
3693cbdda60SSimon J. Gerraty	@(${ECHO_SRC_DIRDEPS}) > $@
3703cbdda60SSimon J. Gerraty.endif
3713cbdda60SSimon J. Gerraty.endif
3723cbdda60SSimon J. Gerraty.endif
3733cbdda60SSimon J. Gerraty_include_src_dirdeps ?=
3743cbdda60SSimon J. Gerraty
3753cbdda60SSimon J. Gerratyall:	${_DEPENDFILE}
3763cbdda60SSimon J. Gerraty
3773cbdda60SSimon J. Gerraty# if this is going to exist it would be there by now
3783cbdda60SSimon J. Gerraty.if !exists(.depend)
3793cbdda60SSimon J. GerratyCAT_DEPEND = /dev/null
3803cbdda60SSimon J. Gerraty.endif
3813cbdda60SSimon J. GerratyCAT_DEPEND ?= .depend
3823cbdda60SSimon J. Gerraty
3833cbdda60SSimon J. Gerraty.if !empty(_DIRDEPS) && ${DIRDEPS} != ${_DIRDEPS}
3843cbdda60SSimon J. Gerraty# we may have changed a filter
3853cbdda60SSimon J. Gerraty.PHONY: ${_DEPENDFILE}
3863cbdda60SSimon J. Gerraty.endif
3873cbdda60SSimon J. Gerraty
388954401e6SSimon J. Gerraty# set this to 'no' and we will not capture any
389954401e6SSimon J. Gerraty# local depends
3903841c287SSimon J. GerratyLOCAL_DEPENDS_GUARD ?= _{.MAKE.LEVEL} > 0
3913841c287SSimon J. Gerraty
3923cbdda60SSimon J. Gerraty# 'cat .depend' should suffice, but if we are mixing build modes
3933cbdda60SSimon J. Gerraty# .depend may contain things we don't want.
3943cbdda60SSimon J. Gerraty# The sed command at the end of the stream, allows for the filters
3953cbdda60SSimon J. Gerraty# to output _{VAR} tokens which we will turn into proper ${VAR} references.
396be19d90bSSimon J. Gerraty${_DEPENDFILE}: .NOMETA ${CAT_DEPEND:M.depend} ${META_FILES:O:u:@m@${exists($m):?$m:}@} ${_this} ${META2DEPS}
3974c620fe5SSimon J. Gerraty	@(${GENDIRDEPS_HEADER} echo '# Autogenerated - do NOT edit!'; echo; \
3983cbdda60SSimon J. Gerraty	echo 'DIRDEPS = \'; \
3993cbdda60SSimon J. Gerraty	echo '${DIRDEPS:@d@	$d \\${.newline}@}'; echo; \
4003cbdda60SSimon J. Gerraty	${_include_src_dirdeps} \
4013cbdda60SSimon J. Gerraty	echo '.include <dirdeps.mk>'; \
402954401e6SSimon J. Gerraty	[ "${LOCAL_DEPENDS_GUARD:[1]:tl}" != no ] || exit 0; \
4033cbdda60SSimon J. Gerraty	echo; \
4043841c287SSimon J. Gerraty	echo '.if ${LOCAL_DEPENDS_GUARD}'; \
4053cbdda60SSimon J. Gerraty	echo '# local dependencies - needed for -jN in clean tree'; \
4063cbdda60SSimon J. Gerraty	[ -s ${CAT_DEPEND} ] && { grep : ${CAT_DEPEND} | grep -v '[/\\]'; }; \
4073cbdda60SSimon J. Gerraty	echo '.endif' ) | sed 's,_\([{(]\),$$\1,g' > $@.new${.MAKE.PID}
4083cbdda60SSimon J. Gerraty	@${InstallNew}; InstallNew -s $@.new${.MAKE.PID}
4093cbdda60SSimon J. Gerraty
4103cbdda60SSimon J. Gerraty.endif				# meta2deps failed
4113cbdda60SSimon J. Gerraty.elif !empty(SUBDIR)
4123cbdda60SSimon J. Gerraty
4133cbdda60SSimon J. GerratyDIRDEPS := ${SUBDIR:S,^,${RELDIR}/,:O:u}
4143cbdda60SSimon J. Gerraty
4153cbdda60SSimon J. Gerratyall:	${_DEPENDFILE}
4163cbdda60SSimon J. Gerraty
417be19d90bSSimon J. Gerraty${_DEPENDFILE}: .NOMETA ${MAKEFILE} ${_this}
4184c620fe5SSimon J. Gerraty	@(${GENDIRDEPS_HEADER} echo '# Autogenerated - do NOT edit!'; echo; \
4193cbdda60SSimon J. Gerraty	echo 'DIRDEPS = \'; \
4203cbdda60SSimon J. Gerraty	echo '${DIRDEPS:@d@	$d \\${.newline}@}'; echo; \
4213cbdda60SSimon J. Gerraty	echo '.include <dirdeps.mk>'; \
4223cbdda60SSimon J. Gerraty	echo ) | sed 's,_\([{(]\),$$\1,g' > $@.new
4233cbdda60SSimon J. Gerraty	@${InstallNew}; InstallNew $@.new
4243cbdda60SSimon J. Gerraty
4253cbdda60SSimon J. Gerraty.else
4263cbdda60SSimon J. Gerraty
4273cbdda60SSimon J. Gerraty# nothing to do
4283cbdda60SSimon J. Gerratyall ${_DEPENDFILE}:
4293cbdda60SSimon J. Gerraty
4303cbdda60SSimon J. Gerraty.endif
4313cbdda60SSimon J. Gerraty${_DEPENDFILE}: .PRECIOUS
43249caa483SSimon J. Gerraty
43349caa483SSimon J. Gerraty# don't waste time looking for ways to make .meta files
43449caa483SSimon J. Gerraty.SUFFIXES:
435