From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
To: buildroot@busybox.net
Subject: [Buildroot] [PATCH 13/16 v3] core: add support for multiple br2-external trees
Date: Sat, 27 Aug 2016 22:20:06 +0200 [thread overview]
Message-ID: <20160827222006.5f36e71f@free-electrons.com> (raw)
In-Reply-To: <09adf1c5d8cfad3134cbfc4d9d319099122d2219.1468750623.git.yann.morin.1998@free.fr>
Hello,
On Sun, 17 Jul 2016 12:34:33 +0200, Yann E. MORIN wrote:
> What we do is to treat BR2_EXTERNAL as a space-separated list of paths,
> which we iterate to construct:
As discussed on IRC, is the space-separated list the best choice? Most
environment variables that contain paths in Unix are colon-separated
instead (PATH, LD_LIBRARY_PATH, PKG_CONFIG_PATH, etc, etc.)
Making it space-separated makes it a bit annoying IMO.
> -# 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
This is really long and not so pretty to look at. Perhaps all the
"validation" aspects can be handled in the shell script that generates
the .br2-external.in Config.in snippet?
> # 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'; \
This is really where you want to start having a helper shell script IMO.
> -ifneq ($(wildcard $(BR2_EXTERNAL)/configs/*_defconfig),)
> +ifneq ($(wildcard $(patsubst %,%/configs/*_defconfig,$(BR2_EXTERNAL))),)
Everywhere you use a patsubst like this, a foreach would be more
appropriate I believe:
ifneq ($(wildcard $(foreach d,$(BR2_EXTERNAL),$(d)/configs/*_defconfig))
Thomas
--
Thomas Petazzoni, CTO, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com
next prev parent reply other threads:[~2016-08-27 20:20 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
2016-08-27 20:20 ` Thomas Petazzoni [this message]
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=20160827222006.5f36e71f@free-electrons.com \
--to=thomas.petazzoni@free-electrons.com \
--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