cr50: rebuild board image if essential make variables change

When building Cr50 board image, some make variables get converted into
compilation flags, which affect image composition. Changes of these
variables go unnoticed as they do not directly affect make
dependencies.

Let's define the set of essential variables in ENV_VARS, and save the
state of these variables at build time in a generated .h file,
updating it only if any of the variables' values changed since the
previous make run.

The generated .h file is included in board.h, which guarantees that
files dependent on board.h are recompiled if the generated .h file
changes.

BRANCH=cr50
BUG=none
TEST=verified that changing of CR50_DEV and/or H1_RED_BOARD or
     CR50_SQA values triggers full rebuild of the Cr50 image.

      Verified that 'emerge-atlas ec-utils' also succeeds.

Change-Id: Id0589a3b6a66fe4da90a9aea894bc83eb6337c8c
Signed-off-by: Vadim Bendebury <vbendeb@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/707915
Reviewed-by: Keith Short <keithshort@chromium.org>
This commit is contained in:
Vadim Bendebury 2019-03-26 14:57:54 -07:00 committed by chrome-bot
parent 8dadabb681
commit 22b1008446
4 changed files with 49 additions and 1 deletions

View File

@ -86,6 +86,15 @@ not_cfg = $(subst ro rw,y,$(filter-out $(1:y=ro rw),ro rw))
# The board makefile sets $CHIP and the chip makefile sets $CORE.
# Include those now, since they must be defined for _flag_cfg below.
include $(BDIR)/build.mk
ifneq ($(ENV_VARS),)
# Let's make sure $(out)/env_config.h changes if value any of the above
# variables has changed since the prvious make invocation. This in turn will
# make sure that relevant object files are re-built.
current_set = $(foreach env_flag, $(ENV_VARS), $(env_flag)=$($(env_flag)))
$(shell util/env_changed.sh "$(out)/env_config.h" "$(current_set)")
endif
# Baseboard directory
ifneq (,$(BASEBOARD))
BASEDIR:=baseboard/$(BASEBOARD)
@ -153,7 +162,10 @@ CPPFLAGS_RO+=$(foreach t,$(_tsk_cfg_ro),-D$(t)) \
CPPFLAGS_RW+=$(foreach t,$(_tsk_cfg_rw),-D$(t)) \
$(foreach t,$(_tsk_cfg_ro),-D$(t)_RO)
CPPFLAGS+=$(foreach t,$(_tsk_cfg),-D$(t))
ifneq ($(ENV_VARS),)
CPPFLAGS += -DINCLUDE_ENV_CONFIG
CFLAGS += -I$(realpath $(out))
endif
# Get the CONFIG_ and VARIANT_ options that are defined for this target and make
# them into variables available to this build script
_flag_cfg_ro:=$(shell $(CPP) $(CPPFLAGS) -P -dM -Ichip/$(CHIP) \

View File

@ -15,6 +15,11 @@ CHIP_VARIANT ?= cr50_fpga
# a guard so that recipe definitions and variable extensions only happen the
# second time.
ifeq ($(BOARD_MK_INCLUDED_ONCE),)
# List of variables which can be defined in the environment or set in the make
# command line.
ENV_VARS := CR50_DEV CR50_SQA H1_RED_BOARD
BOARD_MK_INCLUDED_ONCE=1
SIG_EXTRA = --cros
else

View File

@ -18,6 +18,14 @@
#ifndef __CROS_EC_CONFIG_H
#define __CROS_EC_CONFIG_H
#ifdef INCLUDE_ENV_CONFIG
/*
* When building for an EC target, pick up the .h file which allows to
* keep track of changing make variables.
*/
#include "env_config.h"
#endif
/*
* All config options are listed alphabetically and described here.
*

23
util/env_changed.sh Executable file
View File

@ -0,0 +1,23 @@
#!/bin/bash
# Copyright 2019 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# This script accepts two parameters: a file name and a string.
#
# If the file does not exist, or does not contain the passed in string wrapped
# in '/*... */, the file is written with the wrapped passed in string.
h_file="$1"
current_set="/* $2 */"
if [[ -f "${h_file}" ]]; then
old_set="$(cat "${h_file}")"
if [[ "${current_set}" == "${old_set}" ]]; then
exit 0
fi
else
dest_dir="$(dirname "${h_file}")"
[[ -d "${dest_dir}" ]] || mkdir -p "${dest_dir}"
fi
printf "${current_set}" > "${h_file}"