[Buildroot] [RFC v2] boot/uboot: add option to install custom environment file
Heiko Thiery
heiko.thiery at gmail.com
Fri Aug 4 07:04:22 UTC 2023
Hi Yann,
Am Do., 3. Aug. 2023 um 21:41 Uhr schrieb Yann E. MORIN
<yann.morin.1998 at free.fr>:
>
> Heiko, All,
>
> On 2023-08-03 14:10 +0200, Heiko Thiery spake thusly:
> > U-Boot has the capability to set the environment variables via a text file.
> > The text file has to be located in the U-Boot board source directory and
> > selected via the CONFIG_ENV_SOURCE_FILE option. The CONFIG_ENV_SOURCE_FILE
> > must only contain the filename without the '.env' suffix.
> >
> > Thus the buildroot option BR2_TARGET_UBOOT_CUSTOM_ENVIRONMENT is added
> > that needs the information about the source of the file in the buildroot
> > environment (BR2_TARGET_UBOOT_CUSTOM_ENVIRONMENT_SOURCE).
> >
> > Since the environment file must be located in the U-Boot board source
> > directory. This directory is <SRC>/board/<VENDOR>/<BOARDNAME>.
> >
> > Thes information about vendor name and board name are available in the
> > U-Boot .config file and can be extracted from there to determine the
> > destination directoy.
> >
> > Cc: Michael Walle <michael at walle.cc>
> > Signed-off-by: Heiko Thiery <heiko.thiery at gmail.com>
> > ---
> [--SNIP--]
> > diff --git a/boot/uboot/Config.in b/boot/uboot/Config.in
> > index 8b726eaa57..894a0bd3b2 100644
> > --- a/boot/uboot/Config.in
> > +++ b/boot/uboot/Config.in
> > @@ -607,6 +607,22 @@ config BR2_TARGET_UBOOT_CUSTOM_DTS_PATH
> >
> > endif
> >
> > +config BR2_TARGET_UBOOT_CUSTOM_ENVIRONMENT
> > + bool "custom environment"
> > + help
> > + Provide a custom u-boot environment file. This will be
> > + copied to the U-Boot source path and enabled via the
> > + U-Boot config option CONFIG_ENV_SOURCE_FILE. The target
> > + path will be determined based on the U-Boot configuration.
> > +
> > +if BR2_TARGET_UBOOT_CUSTOM_ENVIRONMENT
> > +config BR2_TARGET_UBOOT_CUSTOM_ENVIRONMENT_SOURCE
> > + string "Custom environment source file"
> > + help
> > + Path to U-Boot custom environment file.
> > +
> > +endif
>
> We don't really need a boolean option to guard a single string option. I
> know we tend to do that a lot, but I find that to be an anti-pattern.
>
> In this case, the empty string is as good as saying "no" to the boolean
> option, so we can just live with the sting option, and then (see below)...
>
> (of course, if the empty string _has_ a special meaning, then we'd need
> a boolean, but that's usually not the case in such situations).
Ok, makes sense. Previously I had 2 config options for source and
destination and removed the destination in v2.
> > config BR2_TARGET_UBOOT_CUSTOM_MAKEOPTS
> > string "Custom make options"
> > help
> > diff --git a/boot/uboot/uboot.mk b/boot/uboot/uboot.mk
> > index b3d26b16fe..35e26ade2d 100644
> > --- a/boot/uboot/uboot.mk
> > +++ b/boot/uboot/uboot.mk
> > @@ -181,6 +181,26 @@ UBOOT_PRE_BUILD_HOOKS += UBOOT_COPY_ATF_FIRMWARE
> > endif
> > endif
> >
> > +#
> > +# Prepare for custom environment
> > +#
> > +ifeq ($(BR2_TARGET_UBOOT_CUSTOM_ENVIRONMENT),y)
> > +ifeq ($(call qstrip,$(BR2_TARGET_UBOOT_CUSTOM_ENVIRONMENT_SOURCE)),)
> > +$(error No custom environment source file specified, check your BR2_TARGET_UBOOT_CUSTOM_ENVIRONMENT_SOURCE setting)
> > +endif
>
> ... we don't need to check the sanity of the settings: empty means don't
> use a custom env file, set means use that file as custom env file.
Ok
>
> > +define UBOOT_COPY_CUSTOM_ENVIRONMENT_FILE
> > + cp -f $(BR2_TARGET_UBOOT_CUSTOM_ENVIRONMENT_SOURCE) $(@D)/board/$(shell grep CONFIG_SYS_VENDOR $(@D)/.config | sed 's/.*=//' | sed 's/"//g')/$(shell grep CONFIG_SYS_BOARD $(@D)/.config | sed 's/.*=//' | sed 's/"//g')/
>
> Please split this line into easier-to-parse construct, see below...
>
> > +endef
> > +UBOOT_PRE_BUILD_HOOKS += UBOOT_COPY_CUSTOM_ENVIRONMENT_FILE
>
> Is it a pre-build or a post-configure hook? I would think it should be a
> post-configure one...
I wanted to do it like the other steps, copy the files to the source
folder before building.
- UBOOT_COPY_ATF_FIRMWARE
- UBOOT_COPY_IMX_FW_FILES
>
> > +
> > +
> > +UBOOT_ENV_FILE_NAME=$(subst .env,,$(notdir $(call qstrip,$(BR2_TARGET_UBOOT_CUSTOM_ENVIRONMENT_SOURCE))))
>
> $(patsubst %.env,%,$(notdir $(UBOOT_CUSTOM_ENVIRONMENT_SOURCE)))
>
> > +define UBOOT_KCONFIG_CUSTOM_ENV_SOURCE
> > + $(call KCONFIG_SET_OPT,CONFIG_ENV_SOURCE_FILE,"$(UBOOT_ENV_FILE_NAME)")
> > +endef
> > +endif
>
> So, the .mk code would look like;
>
> UBOOT_CUSTOM_ENVIRONMENT_SOURCE = $(call qstrip,$(BR2_TARGET_UBOOT_CUSTOM_ENVIRONMENT_SOURCE)))
> UBOOT_ENV_FILE_NAME=$(patsubst %.env,%,$(notdir $(UBOOT_CUSTOM_ENVIRONMENT_SOURCE)))
> ifneq ($(UBOOT_CUSTOM_ENVIRONMENT_SOURCE),)
> define UBOOT_COPY_CUSTOM_ENVIRONMENT_FILE
> sys_config=$( ./utils/config --file $(@D)/.config -s CONFIG_SYS_VENDOR ); \
Creating a subshell to get the output of uitls/config does not work
that way. I have to do $(shell ...). But with that it works ;-)
> sys_board=$( ./utils/config --file $(@D)/.config -s CONFIG_SYS_BOARD ); \
> cp -f $(UBOOT_CUSTOM_ENVIRONMENT_SOURCE) $(@D)/board/$${sys_config}/$${sys_board}
> endef
> UBOOT_POST_CONFIGURE_HOOKS += UBOOT_COPY_CUSTOM_ENVIRONMENT_FILE
>
> define UBOOT_KCONFIG_CUSTOM_ENV_SOURCE
> $(call KCONFIG_SET_OPT,CONFIG_ENV_SOURCE_FILE,"$(UBOOT_ENV_FILE_NAME)")
> endef
> endif # UBOOT_CUSTOM_ENVIRONMENT_SOURCE != ""
>
> Regards,
> Yann E. MORIN.
Many thanks for your comments! I will retest and prepare a v3.
--
Heiko
More information about the buildroot
mailing list