Update meta.sys.mk and related local*mk

Move the setting of TARGET_SPEC_VARS to local.sys.env.mk
so meta.sys.mk can do the processing, and include local.meta.sys.mk
later.

Move the setting of GENDIRDEPS_FILTER*_VARS from local.gendirdeps.mk
to local.meta.sys.mk so we can automatically set DEP_* at level 1+
to avoid syntax errors when DEP_* variables are used in conditionals
in Makefile.depend files.

Update gendirdeps.mk just to get the documentation about the above.
No functional change.

local.dirdeps.mk be more careful about adding to DIRDEPS to avoid
unnecessary overhead, and introducing cycles in the graph.
Also set DEP_MACHINE_CPUARCH.

Reviewed by:	stevek
Sponsored by:	Juniper Networks, Inc.
Differential Revision:	https://reviews.freebsd.org/D39737
This commit is contained in:
Simon J. Gerraty 2023-04-20 20:38:53 -07:00
parent 559b94a122
commit f957a32dac
6 changed files with 112 additions and 51 deletions

View File

@ -1,5 +1,7 @@
# $Id: gendirdeps.mk,v 1.48 2022/09/09 17:44:29 sjg Exp $
# $Id: gendirdeps.mk,v 1.49 2023/04/20 17:45:03 sjg Exp $
# SPDX-License-Identifier: BSD-2-Clause
#
# Copyright (c) 2011-2020, Simon J. Gerraty
# Copyright (c) 2010-2018, Juniper Networks, Inc.
# All rights reserved.
@ -41,6 +43,37 @@
# symlink to another filesystem.
# _objroot must be a prefix match for _objtop
# If any of GENDIRDEPS_FILTER, GENDIRDEPS_FILTER_DIR_VARS
# or GENDIRDEPS_FILTER_VARS are set, we use them to filter the
# output from filemon(4).
# Any references to variables that dirdeps.mk will set
# such as DEP_MACHINE, DEP_RELDIR etc, should use that form.
# Thus we want ${DEP_MACHINE} not ${MACHINE} used in DIRDEPS.
#
# If any manually maintained Makefile.depend files will use any
# DEP_* variables in conditionals, precautions are needed to avoid
# errors when Makefile.depend is read at level 1+ (ie not via
# dirdeps.mk)
# Using MACHINE as an example; such makefiles can do:
#
# DEP_MACHINE ?= ${MACHINE}
# .if ${DEP_MACHINE} == "xyz"
#
# or:
#
# .if ${DEP_MACHINE:U${MACHINE}} == "xyz"
#
# but it might be safer to set GENDIRDEPS_FILTER_DIR_VARS and
# GENDIRDEPS_FILTER_VARS via local.meta.sys.mk rather than
# local.gendirdeps.mk and then:
#
# .if ${.MAKE.LEVEL} > 0
# .for V in ${GENDIRDEPS_FILTER_DIR_VARS:MDEP_*} \
# ${GENDIRDEPS_FILTER_VARS:MDEP_*}
# $V ?= ${${V:S,DEP_,,}}
# .endfor
# .endif
#
.MAIN: all
# keep this simple

View File

@ -207,12 +207,13 @@ DIRDEPS+= ${_lib${_lib}reldir}
.if ${MK_STAGING} == "yes"
# we need targets/pseudo/stage to prep the stage tree
.if ${DEP_RELDIR} != "targets/pseudo/stage"
.if ${DEP_RELDIR:N.:N${SRCTOP}:N*pseudo/stage} != ""
DIRDEPS += targets/pseudo/stage
.endif
.endif
DEP_MACHINE_ARCH = ${MACHINE_ARCH.${DEP_MACHINE}}
DEP_MACHINE_CPUARCH = ${DEP_MACHINE_ARCH:${__TO_CPUARCH}}
CSU_DIR.${DEP_MACHINE_ARCH} ?= csu/${DEP_MACHINE_ARCH}
CSU_DIR := ${CSU_DIR.${DEP_MACHINE_ARCH}}
BOOT_MACHINE_DIR:= ${BOOT_MACHINE_DIR.${DEP_MACHINE}}

View File

@ -53,20 +53,8 @@ GENDIRDEPS_FILTER+= ${GENDIRDEPS_FILTER_HOST_TOOLS}
GENDIRDEPS_FILTER+= ${GENDIRDEPS_FILTER.${MACHINE}:U}
# gendirdeps.mk will turn _{VAR} into ${VAR} which keeps this simple
# order of this list matters!
GENDIRDEPS_FILTER_DIR_VARS+= \
CSU_DIR \
BOOT_MACHINE_DIR
# order of this list matters!
GENDIRDEPS_FILTER_VARS+= \
KERNEL_NAME \
MACHINE_CPUARCH \
MACHINE_ARCH \
MACHINE
GENDIRDEPS_FILTER+= ${GENDIRDEPS_FILTER_DIR_VARS:@v@S,${$v},_{${v}},@}
GENDIRDEPS_FILTER+= ${GENDIRDEPS_FILTER_VARS:@v@S,/${$v}/,/_{${v}}/,@:NS,//,*:u}
# see local.meta.sys.mk for GENDIRDEPS_FILTER_DIR_VARS and
# GENDIRDEPS_FILTER_VARS
# avoid churn for now
LOCAL_DEPENDS_GUARD= _{DEP_RELDIR} == _{_DEP_RELDIR}

View File

@ -1,7 +1,6 @@
# $FreeBSD$
# local configuration specific to meta mode
# XXX some of this should be in meta.sys.mk
# we assume that MK_DIRDEPS_BUILD=yes
# we need this until there is an alternative
@ -34,7 +33,6 @@ MACHINE_ARCH.$m?= ${MACHINE_ARCH_LIST.$m:[1]}
BOOT_MACHINE_DIR.$m ?= boot/$m
.endfor
.ifndef _TARGET_SPEC
.if empty(MACHINE_ARCH)
.if !empty(TARGET_ARCH)
MACHINE_ARCH= ${TARGET_ARCH}
@ -44,36 +42,6 @@ MACHINE_ARCH= ${MACHINE_ARCH.${MACHINE}}
.endif
MACHINE_ARCH?= ${MACHINE_ARCH.${MACHINE}}
MACHINE_ARCH:= ${MACHINE_ARCH}
.else
# we got here via dirdeps
MACHINE_ARCH:= ${MACHINE_ARCH.${MACHINE}}
.endif
# now because for universe we want to potentially
# build for multiple MACHINE_ARCH per MACHINE
# we need more than MACHINE in TARGET_SPEC
TARGET_SPEC_VARS?= MACHINE MACHINE_ARCH
# see dirdeps.mk
.if ${TARGET_SPEC:Uno:M*,*} != ""
_tspec := ${TARGET_SPEC:S/,/ /g}
MACHINE := ${_tspec:[1]}
MACHINE_ARCH := ${_tspec:[2]}
# etc.
# We need to stop that TARGET_SPEC affecting any submakes
# and deal with MACHINE=${TARGET_SPEC} in the environment.
TARGET_SPEC=
# export but do not track
.export-env TARGET_SPEC
.export ${TARGET_SPEC_VARS}
.for v in ${TARGET_SPEC_VARS:O:u}
.if empty($v)
.undef $v
.endif
.endfor
.endif
# make sure we know what TARGET_SPEC is
# as we may need it to find Makefile.depend*
TARGET_SPEC = ${TARGET_SPEC_VARS:@v@${$v:U}@:ts,}
# to be consistent with src/Makefile just concatenate with '.'s
TARGET_OBJ_SPEC:= ${TARGET_SPEC:S;,;.;g}
@ -96,6 +64,7 @@ TARGET_MACHINE= host
.endif
.if ${MACHINE} == "host"
OBJTOP := ${HOST_OBJTOP}
MACHINE_ARCH= ${MACHINE_ARCH.${MACHINE}}
.endif
.if ${.MAKE.LEVEL} == 0 || empty(PYTHON)
@ -267,3 +236,30 @@ META_MODE+= missing-meta=yes
.if empty(META_MODE:Mnofilemon)
META_MODE+= missing-filemon=yes
.endif
.if ${MK_DIRDEPS_BUILD} == "yes"
# we set these here, rather than local.gendirdeps.mk
# so we can ensure any DEP_* values that might be used in
# conditionals do not cause syntax errors when Makefile.depend
# is included at level 1+
# order of this list matters!
GENDIRDEPS_FILTER_DIR_VARS+= \
CSU_DIR \
BOOT_MACHINE_DIR
# order of this list matters!
GENDIRDEPS_FILTER_VARS+= \
KERNEL_NAME \
DEP_MACHINE_CPUARCH \
DEP_MACHINE_ARCH \
DEP_MACHINE
.if ${.MAKE.LEVEL} > 0
.for V in ${GENDIRDEPS_FILTER_DIR_VARS:MDEP_*:O:u} \
${GENDIRDEPS_FILTER_VARS:MDEP_*:O:u}
$V?= ${${V:S,DEP_,,}}
.endfor
.endif
.endif

View File

@ -50,3 +50,8 @@ ECHO_TRACE?= true
.include "src.sys.env.mk"
.-include <site.sys.env.mk>
# For universe we want to potentially
# build for multiple MACHINE_ARCH per MACHINE
# so we need more than MACHINE in TARGET_SPEC
TARGET_SPEC_VARS?= MACHINE MACHINE_ARCH

View File

@ -1,5 +1,4 @@
# $FreeBSD$
# $Id: meta.sys.mk,v 1.42 2021/12/13 05:50:55 sjg Exp $
# $Id: meta.sys.mk,v 1.46 2023/04/18 18:43:00 sjg Exp $
#
# @(#) Copyright (c) 2010-2021, Simon J. Gerraty
@ -21,7 +20,44 @@
.if ${MAKE_VERSION:U0} > 20100901
.if !target(.ERROR)
.-include <local.meta.sys.mk>
.-include <local.meta.sys.env.mk>
# If TARGET_SPEC_VARS is other than just MACHINE
# it should be set by now.
# TARGET_SPEC must not contain any '.'s.
TARGET_SPEC_VARS ?= MACHINE
.if !target(_meta_tspec_env_done_)
_meta_tspec_env_done_: .NOTMAIN
# Allow for local.meta.sys.env.mk to have done this
.if ${TARGET_SPEC:Uno:M*,*} != ""
# deal with TARGET_SPEC from env
_tspec := ${TARGET_SPEC:S/,/ /g}
.for i in ${TARGET_SPEC_VARS:${M_RANGE:Urange}}
${TARGET_SPEC_VARS:[$i]} := ${_tspec:[$i]}
.endfor
# We need to stop that TARGET_SPEC affecting any submakes
TARGET_SPEC=
# so export but do not track
.export-env TARGET_SPEC
.export ${TARGET_SPEC_VARS}
.for v in ${TARGET_SPEC_VARS:O:u}
.if empty($v)
.undef $v
.endif
.endfor
.endif
.endif
# Now make sure we know what TARGET_SPEC is
# as we may need it to find Makefile.depend*
.if ${MACHINE:Mhost*} != ""
# host is special
TARGET_SPEC = ${MACHINE}
.else
TARGET_SPEC = ${TARGET_SPEC_VARS:@v@${$v:U}@:ts,}
.endif
# absolute path to what we are reading.
_PARSEDIR = ${.PARSEDIR:tA}
@ -178,3 +214,5 @@ META_NOPHONY= .PHONY
META_NOECHO= echo
.endif
.endif
.-include <local.meta.sys.mk>