[PATCH v4 4/5] env: Allow environment files to use the C preprocessor

2021-09-19 Thread Simon Glass
In many cases environment variables need access to the U-Boot CONFIG
variables to select different options. Enable this so that the environment
scripts can be as useful as the ones currently in the board config files.

Also support += to allow variables to be appended to. This is needed when
using the preprocessor.

Signed-off-by: Simon Glass 
---

Changes in v4:
- Add documentation in rST format instead of README

Changes in v3:
- Define __UBOOT_CONFIG__ when collecting environment files

Changes in v2:
- Add separate patch to enable C preprocessor for environment files
- Enable var+=value form to simplify composing variables in multiple steps

 Makefile  | 7 ++-
 doc/usage/environment.rst | 8 
 scripts/env2string.awk| 6 ++
 3 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/Makefile b/Makefile
index 9e44af2ccb1..6315de93506 100644
--- a/Makefile
+++ b/Makefile
@@ -1813,7 +1813,12 @@ ENV_FILE := $(if $(wildcard 
$(ENV_FILE_BOARD)),$(ENV_FILE_BOARD),$(ENV_FILE_COMM
 quiet_cmd_gen_envp = ENVP$@
   cmd_gen_envp = \
if [ -f "$(ENV_FILE)" ]; then \
-   cat $(ENV_FILE) >$@; \
+   $(CPP) -P $(CFLAGS) -x assembler-with-cpp -D__ASSEMBLY__ \
+   -D__UBOOT_CONFIG__ \
+   -I . -I include \
+   -I $(srctree)/include -include include/config.h \
+   -I$(srctree)/arch/$(ARCH)/include \
+   $(ENV_FILE) -o $@; \
else \
echo -n >$@ ; \
fi
diff --git a/doc/usage/environment.rst b/doc/usage/environment.rst
index 81130d17f85..5df55cdfa8f 100644
--- a/doc/usage/environment.rst
+++ b/doc/usage/environment.rst
@@ -31,6 +31,14 @@ and has an equals sign immediately afterwards. Spaces before 
the = are not
 permitted. It is a good idea to indent your scripts so that only the 'var='
 appears at the start of a line.
 
+To add additional text to a variable you can use var+=value. This text is
+merged into the variable during the make process and made available as a
+single value to U-Boot.
+
+This file can include C-style comments. Blank lines and multi-line
+variables are supported, and you can use normal C preprocessor directives
+and CONFIG defines from your board config also.
+
 For example, for snapper9260 you would create a text file called
 `board/bluewater/env/snapper9260.env` containing the environment text.
 
diff --git a/scripts/env2string.awk b/scripts/env2string.awk
index f442d3b7c44..9851925d877 100644
--- a/scripts/env2string.awk
+++ b/scripts/env2string.awk
@@ -29,6 +29,12 @@ NF {
}
var = arr[1]
env = arr[2]
+
+   # Deal with +=
+   if (match(var, "(.*)[+]$", var_arr)) {
+   var = var_arr[1]
+   env = vars[var] env
+   }
} else {
# Change newline to \n
env = env "\\n" $0;
-- 
2.33.0.464.g1972c5931b-goog



Re: [PATCH v4 4/5] env: Allow environment files to use the C preprocessor

2021-09-20 Thread Wolfgang Denk
Dear Simon,

In message 
<20210919125937.v4.4.Ie78bfbfca0d01d9cba501e127f446ec48e1f7afe@changeid> you 
wrote:
>
> +To add additional text to a variable you can use var+=value. This text is
> +merged into the variable during the make process and made available as a
> +single value to U-Boot.

Explained after use.  Move documentation to previous patch?

> + # Deal with +=
> + if (match(var, "(.*)[+]$", var_arr)) {
> + var = var_arr[1]
> + env = vars[var] env
> + }


Hm...  this is (so far) a legal command:

=> setenv foobar+ foo+=bar


Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH,  Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: w...@denx.de
"Summit meetings tend to be like panda matings. The expectations  are
always high, and the results usually disappointing."   - Robert Orben