From: Yann E. MORIN <yann.morin.1998@free.fr>
To: buildroot@busybox.net
Subject: [Buildroot] [PATCH 13/16 v3] core: add support for multiple br2-external trees
Date: Mon, 25 Jul 2016 23:25:02 +0200 [thread overview]
Message-ID: <20160725212502.GB5958@free.fr> (raw)
In-Reply-To: <c881f465-12bb-6f38-ce21-fdc743b137fa@gmail.com>
On 2016-07-24 22:25 +0200, Romain Naour spake thusly:
> Hi Yann,
>
> Le 17/07/2016 ? 12:34, Yann E. MORIN a ?crit :
> > Currently, we only support at most one br2-external tree. Being able
> > to use more than one br2-external tree can be very useful.
> >
> > A use-case would be for having a br2-external to contain the basic
> > packages, basic board defconfigs and board files, provided by one team
> > responsible for the "board-bringup", while other teams consume that
> > br2-external as a base, and complements it each with their own set of
> > packages, defconfigs and extra board files.
> >
> > Another use-case would be for third-parties to provide their own
> > Buildroot packaging in a br2-external tree, along-side the archives for
> > their stuff.
> >
> > Finally, another use-case is to be able to add FLOSS packages in a
> > br2-external tree, and proprietary packages in another. This allows
> > to not touch the Buildroot tree at all, and still be able to get in
> > compliance by providing only that br2-external tree(s) that contains
> > FLOSS packages, leaving aside the br2-external tree(s) with the
> > proprietary bits.
> >
> > What we do is to treat BR2_EXTERNAL as a space-separated list of paths,
> > which we iterate to construct:
> >
> > - the list of all br2-external IDs, BR_EXTERNAL_IDS
> ^
> There are several occurrence of BR_EXTERNAL_IDS instead of BR2_EXTERNAL_IDS.
>
> Did you named BR_EXTERNAL_IDS to avoid confusion between BR2_EXTERNAL_ID and
> BR2_EXTERNAL_IDS.
>
> Ha ok, BR_ variables are Buildroot internal variables not saved in .config file,
> right ?
Mostly, yes.
BR2_ variables are user-defined, either variables from the .config (i.e.
from kconfig), variables from the environment, variables from variables
on the command line or variables we pass to the user.
BR_ variables are internal variables, thus-prefixed to avoid
namespace-clashing.
So yes, BR_EXTERNAL_IDS is an internal variable, so is not BR2_-prefixed.
Regards,
Yann E. MORIN.
> Best regards,
> Romain
>
> >
> > - the per-br2-external tree BR2_EXTERNAL_$(ID) variables, which points
> > to the actual location of the corresponding tree,
> >
> > - EXTRA_ENV which now needs to contain all BR2_EXTERNAL_$(ID)
> > variables, and thus needs to be set early.
> >
> > Once we have all those variables, we replace references to BR2_EXTERNAL
> > with either:
> >
> > - a $(patsubst ...) to include the external.mk files (and docs),
> > or
> >
> > - a $(foreach ...) iteration to generate other Makefile code.
> >
> > To be noted: we also use $(foreach ...) in the kconfig-snippet
> > generating rule, because it is cleaner than doing so in the shell
> >
> > Finally, we double-quote $(BR2_EXTERNAL) when assigning it to
> > environment variables.
> >
> > Now, when more than one br2-external tree is used, each gets its own
> > sub-menu in the "User-provided options" menu. The sub-menu is labelled
> > with that br2-external tree's ID (prefixed with 'BR2_EXTERNAL_') and the
> > sub-menu's first item is a comment with the path to that br2-external
> > tree.
> >
> > If there's only one br2-external tree, then there is no sub-menu, but
> > we still add the comment with the path to the br2-external tree (which
> > we did not have previously). If the br2-external tree has an ID, it is
> > displayed as well as a comment.
> >
> > Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
> > Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
> > Cc: Peter Korsgaard <jacmet@uclibc.org>
> > Cc: Thomas De Schampheleire <patrickdepinguin@gmail.com>
> > Cc: Arnout Vandecappelle <arnout@mind.be>
> >
> > ---
> > Changes v3 -> v4:
> > - drop check for file existence (Thomas)
> > - fix check for empty ID (Thomas)
> > - simpler code to check number of br2-external trees
> > ---
> > Makefile | 99 +++++++++++++++++++++++++++++++++++++----------------
> > package/Makefile.in | 2 +-
> > 2 files changed, 70 insertions(+), 31 deletions(-)
> >
> > diff --git a/Makefile b/Makefile
> > index 67334e5..7b3542c 100644
> > --- a/Makefile
> > +++ b/Makefile
> > @@ -145,32 +145,57 @@ $(if $(BASE_DIR),, $(error output directory "$(O)" does not exist))
> > # The value of BR2_EXTERNAL is stored in .br-external in the output directory.
> > # On subsequent invocations of make, it is read in. It can still be overridden
> > # on the command line, therefore the file is re-created every time make is run.
> > -#
> > -# If the br2-external tree defines its ID, then export the path in the
> > -# BR2_EXTERNAL_$(ID) variable.
> >
> > BR2_EXTERNAL_FILE = $(BASE_DIR)/.br-external
> > -include $(BR2_EXTERNAL_FILE)
> > -ifneq ($(BR2_EXTERNAL),)
> > - _BR2_EXTERNAL = $(shell cd $(BR2_EXTERNAL) >/dev/null 2>&1 && pwd)
> > - ifeq ($(_BR2_EXTERNAL),)
> > - $(error BR2_EXTERNAL='$(BR2_EXTERNAL)' does not exist, relative to $(TOPDIR))
> > - endif
> > - override BR2_EXTERNAL := $(_BR2_EXTERNAL)
> > - ifneq ($(wildcard $(BR2_EXTERNAL)/external.id),)
> > - BR2_EXTERNAL_ID := $(shell cat $(BR2_EXTERNAL)/external.id 2>/dev/null)
> > - ifeq ($(BR2_EXTERNAL_ID),)
> > - $(error $(BR2_EXTERNAL) has no ID (in file 'external.id'))
> > - endif
> > - BR2_EXTERNAL_$(BR2_EXTERNAL_ID) = $(BR2_EXTERNAL)
> > - endif
> > - BR2_EXTERNAL_MK = $(BR2_EXTERNAL)/external.mk
> > -endif
> >
> > -# This needs to be *after* we compute BR_EXTERNAL, above.
> > .PHONY: $(BR2_EXTERNAL_FILE)
> > $(BR2_EXTERNAL_FILE):
> > - @echo BR2_EXTERNAL ?= $(BR_EXTERNAL) >$@
> > + @echo BR2_EXTERNAL ?= $(BR2_EXTERNAL) >$@
> > +
> > +# Those two variables need to be defined as simply-expanded variables, they
> > +# can't be recursively-expanded, because the values they are assigned change
> > +# with each iteration of the foreach, below.
> > +BR_EXTERNAL_IDS :=
> > +EXTRA_ENV :=
> > +
> > +# If there is no or one br2-external trees used, then we don't require (but
> > +# accept) an ID; otherwise (i.e. there are two or more br2-external trees)
> > +# we require they do all define their ID.
> > +ifeq ($(filter-out 0 1,$(words $(BR2_EXTERNAL))),)
> > +BR2_EXTERNAL_NEED_ID := loose
> > +else
> > +BR2_EXTERNAL_NEED_ID := strict
> > +endif
> > +
> > +# Validate the br2-external tree passed as $(1):
> > +# - check the directory actually exists
> > +# - check if we need and have a non-empty ID
> > +# - check the ID is not a duplicate
> > +# - set variables for later use
> > +define BR2_EXTERNAL_VALIDATE
> > + _BR_EXT_DIR := $$(shell cd $(1) >/dev/null 2>&1 && pwd)
> > + ifeq ($$(_BR_EXT_DIR),)
> > + $$(error BR2_EXTERNAL='$(1)' does not exist, relative to $$(TOPDIR))
> > + endif
> > + _BR_EXT_ID := $$(shell cat $$(_BR_EXT_DIR)/external.id 2>/dev/null)
> > + ifeq ($$(_BR_EXT_ID),)
> > + ifeq ($(BR2_EXTERNAL_NEED_ID),strict)
> > + $$(error BR2_EXTERNAL='$(1)' has no ID (in file 'external.id'),\
> > + mandatory to use more than one br2-external tree at once)
> > + endif # BR2_EXTERNAL_NEED_ID strict
> > + endif # No ID
> > + ifneq ($$(filter $$(_BR_EXT_ID),$$(BR_EXTERNAL_IDS)),)
> > + $$(error Duplicate ID '$$(_BR_EXT_ID)' in '$(1)', previously defined in '$$(BR2_EXTERNAL_$$(_BR_EXT_ID))')
> > + endif
> > + ifneq ($$(_BR_EXT_ID),)
> > + BR2_EXTERNAL_$$(_BR_EXT_ID) := $$(_BR_EXT_DIR)
> > + BR_EXTERNAL_IDS += $$(_BR_EXT_ID)
> > + EXTRA_ENV += BR2_EXTERNAL_$$(_BR_EXT_ID)=$$(_BR_EXT_DIR)
> > + endif # _BR_EXT_ID not empty
> > +endef # BR2_EXTERNAL_VALIDATE
> > +
> > +$(eval $(foreach d,$(BR2_EXTERNAL),$(call BR2_EXTERNAL_VALIDATE,$(d))$(sep)))
> >
> > # To make sure that the environment variable overrides the .config option,
> > # set this before including .config.
> > @@ -469,9 +494,10 @@ include fs/common.mk
> > # If the br2-external tree defines its ID, then the BR2_EXTERNAL_$(ID)
> > # variable is also present in .config, so it is quoted. We must unquote
> > # it before feeding it to the br2-external makefile.
> > -BR2_EXTERNAL_$(BR2_EXTERNAL_ID) := $(call qstrip,$(BR2_EXTERNAL_$(BR2_EXTERNAL_ID)))
> > +$(eval $(foreach id,$(BR_EXTERNAL_IDS),\
> > + BR2_EXTERNAL_$(id) := $(call qstrip,$(BR2_EXTERNAL_$(id)))$(sep)))
> > # Nothing to include if no BR2_EXTERNAL tree in use
> > -include $(BR2_EXTERNAL_MK)
> > +include $(patsubst %,%/external.mk,$(BR2_EXTERNAL))
> >
> > # Now we are sure we have all the packages scanned and defined. We now
> > # check for each package in the list of enabled packages, that all its
> > @@ -787,7 +813,7 @@ COMMON_CONFIG_ENV = \
> > KCONFIG_AUTOHEADER=$(BUILD_DIR)/buildroot-config/autoconf.h \
> > KCONFIG_TRISTATE=$(BUILD_DIR)/buildroot-config/tristate.config \
> > BR2_CONFIG=$(BR2_CONFIG) \
> > - BR2_EXTERNAL=$(BR2_EXTERNAL) \
> > + BR2_EXTERNAL="$(BR2_EXTERNAL)" \
> > HOST_GCC_VERSION="$(HOSTCC_VERSION)" \
> > BUILD_DIR=$(BUILD_DIR) \
> > SKIP_LEGACY=
> > @@ -895,12 +921,25 @@ $(BUILD_DIR)/.br2-external.in: $(BUILD_DIR)
> > $(Q)if [ -n '$(BR2_EXTERNAL)' ]; then \
> > printf "#\n# Automatically generated file; DO NOT EDIT.\n#\n\n"; \
> > printf 'menu "User-provided options"\n\n'; \
> > - if [ -z "$(BR2_EXTERNAL_ID)" ]; then \
> > + if [ -z "$(call strip,$(BR_EXTERNAL_IDS))" ]; then \
> > + printf 'comment "%s"\n\n' $(BR2_EXTERNAL); \
> > printf 'source "%s/Config.in"\n\n' $$(cd $(BR2_EXTERNAL) >/dev/null 2>&1 && pwd); \
> > else \
> > - printf 'config BR2_EXTERNAL_%s\n' $(BR2_EXTERNAL_ID); \
> > - printf '\tstring\n\tdefault "%s"\n\n' $(BR2_EXTERNAL_$(BR2_EXTERNAL_ID)); \
> > - printf 'source "$$BR2_EXTERNAL_%s/Config.in"\n\n' $(BR2_EXTERNAL_ID); \
> > + $(foreach id,$(BR_EXTERNAL_IDS),\
> > + for i in $$(seq 1 80); do printf '#'; done; printf '\n\n'; \
> > + if [ $(words $(call strip,$(BR_EXTERNAL_IDS))) -gt 1 ]; then \
> > + printf 'menu "BR2_EXTERNAL_%s"\n\n' $(id); \
> > + else \
> > + printf 'comment "BR2_EXTERNAL_%s"\n\n' $(id); \
> > + fi; \
> > + printf 'comment "%s"\n\n' $(BR2_EXTERNAL_$(id)); \
> > + printf 'config BR2_EXTERNAL_%s\n' $(id); \
> > + printf '\tstring\n\tdefault "%s"\n\n' $(BR2_EXTERNAL_$(id)); \
> > + printf 'source "$$BR2_EXTERNAL_%s/Config.in"\n\n' $(id); \
> > + if [ $(words $(call strip,$(BR_EXTERNAL_IDS))) -gt 1 ]; then \
> > + printf 'endmenu # BR2_EXTERNAL_%s\n\n' $(id); \
> > + fi; ) \
> > + for i in $$(seq 1 80); do printf '#'; done; printf '\n\n'; \
> > fi; \
> > printf 'endmenu # User-provided options\n'; \
> > fi >$@
> > @@ -1004,10 +1043,10 @@ list-defconfigs:
> > @echo 'Built-in configs:'
> > @$(foreach b, $(sort $(notdir $(wildcard $(TOPDIR)/configs/*_defconfig))), \
> > printf " %-35s - Build for %s\\n" $(b) $(b:_defconfig=);)
> > -ifneq ($(wildcard $(BR2_EXTERNAL)/configs/*_defconfig),)
> > +ifneq ($(wildcard $(patsubst %,%/configs/*_defconfig,$(BR2_EXTERNAL))),)
> > @echo
> > @echo 'User-provided configs:'
> > - @$(foreach b, $(sort $(notdir $(wildcard $(BR2_EXTERNAL)/configs/*_defconfig))), \
> > + @$(foreach b, $(sort $(notdir $(wildcard $(patsubst %,%/configs/*_defconfig,$(BR2_EXTERNAL))))), \
> > printf " %-35s - Build for %s\\n" $(b) $(b:_defconfig=);)
> > endif
> > @echo
> > @@ -1029,7 +1068,7 @@ print-version:
> > @echo $(BR2_VERSION_FULL)
> >
> > include docs/manual/manual.mk
> > --include $(BR2_EXTERNAL)/docs/*/*.mk
> > +-include $(patsubst %,%/docs/*/*.mk,$(BR2_EXTERNAL))
> >
> > .PHONY: $(noconfig_targets)
> >
> > diff --git a/package/Makefile.in b/package/Makefile.in
> > index afd5d3a..fe8ee68 100644
> > --- a/package/Makefile.in
> > +++ b/package/Makefile.in
> > @@ -319,7 +319,7 @@ EXTRA_ENV = \
> > PATH=$(BR_PATH) \
> > BR2_DL_DIR=$(BR2_DL_DIR) \
> > BUILD_DIR=$(BUILD_DIR) \
> > - BR2_EXTERNAL=$(BR2_EXTERNAL)
> > + BR2_EXTERNAL="$(BR2_EXTERNAL)"
> >
> > ################################################################################
> > # settings we need to pass to configure
> >
>
--
.-----------------.--------------------.------------------.--------------------.
| Yann E. MORIN | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software Designer | \ / CAMPAIGN | ___ |
| +33 223 225 172 `------------.-------: X AGAINST | \e/ There is no |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL | v conspiracy. |
'------------------------------^-------^------------------^--------------------'
next prev parent reply other threads:[~2016-07-25 21:25 UTC|newest]
Thread overview: 95+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-07-17 10:34 [Buildroot] [PATCH 00/16 v3] br2-external: support multiple trees at once (branch yem/multi-br2-external-ID-7) Yann E. MORIN
2016-07-17 10:34 ` [Buildroot] [PATCH 01/16 v3] core: move pkg-utils.mk to support/ Yann E. MORIN
2016-07-24 20:43 ` Romain Naour
2016-08-27 14:11 ` Thomas Petazzoni
2016-07-17 10:34 ` [Buildroot] [PATCH 02/16 v3] core: commonalise the bundled and br2-external %_defconfig rules Yann E. MORIN
2016-07-30 20:48 ` Romain Naour
2016-08-27 14:12 ` Thomas Petazzoni
2016-08-27 14:16 ` Yann E. MORIN
2016-08-27 17:10 ` Arnout Vandecappelle
2016-07-17 10:34 ` [Buildroot] [PATCH 03/16 v3] doc/asciidoc: add possibility to define document dependencies Yann E. MORIN
2016-08-06 15:02 ` Romain Naour
2016-08-27 14:14 ` Thomas Petazzoni
2016-08-27 14:42 ` Yann E. MORIN
2016-08-27 19:58 ` Thomas Petazzoni
2016-07-17 10:34 ` [Buildroot] [PATCH 04/16 v3] core: introduce an intermediate rule before the configurators Yann E. MORIN
2016-08-06 15:13 ` Romain Naour
2016-08-27 14:47 ` Yann E. MORIN
2016-08-27 19:39 ` Thomas Petazzoni
2016-07-17 10:34 ` [Buildroot] [PATCH 05/16 v3] core: move rule to create basic directories Yann E. MORIN
2016-08-06 15:16 ` Romain Naour
2016-08-27 14:14 ` Thomas Petazzoni
2016-08-27 14:34 ` Yann E. MORIN
2016-08-27 19:41 ` Thomas Petazzoni
2016-08-27 22:07 ` Yann E. MORIN
2016-07-17 10:34 ` [Buildroot] [PATCH 06/16 v3] core: introduce a generated kconfig snippet Yann E. MORIN
2016-08-06 15:18 ` Romain Naour
2016-08-27 14:16 ` Thomas Petazzoni
2016-08-27 15:01 ` Yann E. MORIN
2016-08-28 20:50 ` Peter Korsgaard
2016-08-29 7:19 ` Thomas Petazzoni
2016-08-29 7:50 ` Peter Korsgaard
2016-08-29 10:02 ` Thomas Petazzoni
2016-08-29 22:14 ` Arnout Vandecappelle
2016-08-29 22:25 ` Yann E. MORIN
2016-08-29 22:16 ` Yann E. MORIN
2016-08-29 22:46 ` Arnout Vandecappelle
2016-08-30 9:00 ` Yann E. MORIN
2016-08-30 9:40 ` Peter Korsgaard
2016-08-30 20:01 ` Arnout Vandecappelle
2016-09-01 17:52 ` Yann E. MORIN
2016-09-01 18:57 ` Peter Korsgaard
2016-09-01 21:30 ` Arnout Vandecappelle
2016-09-01 21:51 ` Peter Korsgaard
2016-08-27 19:46 ` Thomas Petazzoni
2016-07-17 10:34 ` [Buildroot] [PATCH 07/16 v3] docs/manual: prepare-config can be used as a dependency of documents Yann E. MORIN
2016-08-06 15:19 ` Romain Naour
2016-08-27 19:58 ` Thomas Petazzoni
2016-07-17 10:34 ` [Buildroot] [PATCH 08/16 v3] core: do not hard-code inclusion of br2-external in Kconfig Yann E. MORIN
2016-08-06 15:21 ` Romain Naour
2016-08-27 20:00 ` Thomas Petazzoni
2016-08-27 22:14 ` Yann E. MORIN
2016-07-17 10:34 ` [Buildroot] [PATCH 09/16 v3] core: get rid of our dummy br2-external tree Yann E. MORIN
2016-08-06 15:30 ` Romain Naour
2016-08-06 15:37 ` Yann E. MORIN
2016-07-17 10:34 ` [Buildroot] [PATCH 10/16 v3] core: introduce per br2-external ID Yann E. MORIN
2016-08-06 15:41 ` Romain Naour
2016-08-27 20:10 ` Thomas Petazzoni
2016-08-27 22:15 ` Yann E. MORIN
2016-08-27 21:49 ` Arnout Vandecappelle
2016-08-27 21:59 ` Yann E. MORIN
2016-08-28 10:48 ` Thomas Petazzoni
2016-07-17 10:34 ` [Buildroot] [PATCH 11/16 v3] docs/manual: document the " Yann E. MORIN
2016-08-06 15:48 ` Romain Naour
2016-08-27 15:05 ` Yann E. MORIN
2016-08-27 20:13 ` Thomas Petazzoni
2016-08-27 22:19 ` Yann E. MORIN
2016-08-30 20:36 ` Arnout Vandecappelle
2016-07-17 10:34 ` [Buildroot] [PATCH 12/16 v3] core: handle .br-external in a make rule Yann E. MORIN
2016-07-24 20:05 ` Romain Naour
2016-07-25 21:13 ` Yann E. MORIN
2016-08-27 15:51 ` Yann E. MORIN
2016-08-27 20:16 ` Thomas Petazzoni
2016-08-27 22:22 ` Yann E. MORIN
2016-08-28 10:49 ` Thomas Petazzoni
2016-07-17 10:34 ` [Buildroot] [PATCH 13/16 v3] core: add support for multiple br2-external trees Yann E. MORIN
2016-07-24 20:25 ` Romain Naour
2016-07-25 21:25 ` Yann E. MORIN [this message]
2016-08-27 20:20 ` Thomas Petazzoni
2016-08-29 22:11 ` Yann E. MORIN
2016-07-17 10:34 ` [Buildroot] [PATCH 14/16 v3] support/scripts: teach gen-manual-lists about BR2_EXTERNAL Yann E. MORIN
2016-08-06 15:59 ` Romain Naour
2016-07-17 10:34 ` [Buildroot] [PATCH 15/16 v3] docs/manual: include packages from BR2_EXTERNAL if set Yann E. MORIN
2016-08-06 16:07 ` Romain Naour
2016-07-17 10:34 ` [Buildroot] [PATCH 16/16 v3] docs/manual: document multi br2-external Yann E. MORIN
2016-08-06 16:15 ` Romain Naour
2016-08-30 21:37 ` [Buildroot] [PATCH 00/16 v3] br2-external: support multiple trees at once (branch yem/multi-br2-external-ID-7) Arnout Vandecappelle
2016-08-31 6:15 ` Peter Korsgaard
2016-08-31 7:14 ` Thomas Petazzoni
2016-08-31 9:26 ` Yann E. MORIN
2016-09-01 21:43 ` Arnout Vandecappelle
2016-09-01 21:46 ` Yann E. MORIN
2016-09-01 22:04 ` Arnout Vandecappelle
2016-09-04 18:42 ` Peter Korsgaard
2016-09-04 21:14 ` Yann E. MORIN
2016-09-05 10:31 ` Peter Korsgaard
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160725212502.GB5958@free.fr \
--to=yann.morin.1998@free.fr \
--cc=buildroot@busybox.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox