All of lore.kernel.org
 help / color / mirror / Atom feed
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

  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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.