Re: [PATCH v2 0/4] kconfig: store default ARCH in .config

From: Paul Bolle
Date: Wed Dec 10 2014 - 15:24:33 EST


Hi Konstantin,

On Mon, 2014-10-27 at 21:20 +0400, Konstantin Khlebnikov wrote:
> Bump.
>
> On Mon, Sep 1, 2014 at 11:16 AM, Konstantin Khlebnikov <koct9i@xxxxxxxxx> wrote:
> > This is second attempt of fixing target archecture amnesia.
> > v1 patch: http://lkml.kernel.org/r/20140706080234.19520.96704.stgit@zurg
> >
> > First version saved ARCH as CONFIG_DEFAULT_ARCH and used it as defult ARCH.
> >
> > This version changes semantic of Kconfig option env="...", now it acts more
> > like the user input, except that the value comes from the environment.
> > Variable from environment overrides all defaults and value from config file.
> > If environment variable is not defined this option has no effect.
> >
> > So, now ARCH is saved as CONFIG_ARCH.
> >
> > Also this patchset links CONFIG_CROSS_COMPILE and CROSS_COMPILE in the same way.
> > Changing it in command line/environment also updates value in the config file.
> >
> > ---
> >
> > Konstantin Khlebnikov (4):
> > kconfig: save values imported from environment into config file
> > scripts/config: add option for changing output for undefined options
> > kconfig: get target architecture from config file
> > kconfig: link CONFIG_CROSS_COMPILE with environment variable
> >
> >
> > Documentation/kbuild/kconfig-language.txt | 10 ++++------
> > Documentation/kbuild/makefiles.txt | 3 ++-
> > Makefile | 21 +++++++++++++++------
> > init/Kconfig | 1 +
> > scripts/config | 15 ++++++++++++---
> > scripts/kconfig/confdata.c | 26 ++++++++++++++++++++++++++
> > scripts/kconfig/expr.h | 2 +-
> > scripts/kconfig/symbol.c | 3 ---
> > 8 files changed, 61 insertions(+), 20 deletions(-)

It's been a few months since you submitted this series and you've
received little feedback. So I tried to review this series. That didn't
go too well. Mainly because the kconfig code makes answering questions
like "What does sym_calc_value() actually do?" harder than it should be.
(And because make and the kernel Makefiles scare me, but I don't like to
admit that.)

Anyhow, I think what you want to accomplish, is basically to save make's
ARCH as CONFIG_ARCH and, likewise, save make's CROSS_COMPILE as
CONFIG_CROSS_COMPILE. You jump through quite a few hoops to do that in
this series.

Now I'm not clear whether saving those variables should actually be
done. But I did cobble together a much smaller _hack_ that seems to
achieve what you want. I've pasted it at the end of this message. It's
lightly tested on top of today's linux-next. (Does it break building
UML?) But does it do what you basically care about?


Paul Bolle
---
diff --git a/Makefile b/Makefile
index ec2f22615d3d..a8bc3290f2e9 100644
--- a/Makefile
+++ b/Makefile
@@ -228,6 +228,9 @@ SUBARCH := $(shell uname -m | sed -e s/i.86/x86/ -e s/x86_64/x86/ \
-e s/ppc.*/powerpc/ -e s/mips.*/mips/ \
-e s/sh[234].*/sh/ -e s/aarch64.*/arm64/ )

+KCONFIG_CONFIG ?= .config
+export KCONFIG_CONFIG
+
# Cross compiling and selecting different set of gcc/bin-utils
# ---------------------------------------------------------------------------
#
@@ -248,6 +251,10 @@ SUBARCH := $(shell uname -m | sed -e s/i.86/x86/ -e s/x86_64/x86/ \
# "make" in the configured kernel build directory always uses that.
# Default value for CROSS_COMPILE is not to prefix executables
# Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile
+ARCH ?= $(shell grep -s ^CONFIG_ARCH= $(KCONFIG_CONFIG) | sed -e s/^CONFIG_ARCH=// -e s/\"//g)
+ifeq ($(ARCH),)
+ undefine ARCH
+endif
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)

@@ -287,9 +294,6 @@ endif
# Where to locate arch specific headers
hdr-arch := $(SRCARCH)

-KCONFIG_CONFIG ?= .config
-export KCONFIG_CONFIG
-
# SHELL used by kbuild
CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
else if [ -x /bin/bash ]; then echo /bin/bash; \
diff --git a/scripts/kconfig/symbol.c b/scripts/kconfig/symbol.c
index 7d09e029a779..77c8341af494 100644
--- a/scripts/kconfig/symbol.c
+++ b/scripts/kconfig/symbol.c
@@ -1364,8 +1364,12 @@ static void prop_add_env(const char *env)
sym_env_list->right.sym = sym;

p = getenv(env);
- if (p)
+ if (p) {
sym_add_default(sym, p);
- else
+ if ((strcmp(sym->name, "ARCH") == 0) ||
+ (strcmp(sym->name, "CROSS_COMPILE") == 0))
+ sym->flags &= ~SYMBOL_AUTO;
+ } else {
menu_warn(current_entry, "environment variable %s undefined", env);
+ }
}

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/