Commit 575543347b5baed0ca927cb90ba8807396fe9cc9

Authored by Sam Ravnborg
1 parent caa27b66bd

kbuild: save ARCH & CROSS_COMPILE when building a kernel

When building a kernel for a different architecture
kbuild requires the user always to specify ARCH and
CROSS_COMPILE on the command-line.

We use the asm symlink to detect if user forgets to
specify the correct ARCH value - but that symlink
is about to die. And we do now want to loose this check.

This patch save the settings of ARCH and CROSS_COMPILE
in two files named:

    include/generated/kernel.arch
    include/generated/kernel.cross

The settings are saved during "make *config" time
and always read.

If user try to change the settings we error out.

This works both for plain builds and for O=...
builds.

So now you can do:
$ mkdir sparc64
$ make O=sparc64 ARCH=sparc64 CROSS_COMPILE=sparc64-linux- defconfig
$ cd sparc64
$ make

Notice that you no longer need to tell kbuild
the settings of ARCH and CROSS_COMPILE when you type make
in the output directory.

Likewise for plain builds where you do not use O=...

Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
Cc: Roland McGrath <roland@redhat.com>

Showing 1 changed file with 44 additions and 2 deletions Side-by-side Diff

... ... @@ -179,10 +179,47 @@
179 179 # Alternatively CROSS_COMPILE can be set in the environment.
180 180 # Default value for CROSS_COMPILE is not to prefix executables
181 181 # Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile
  182 +#
  183 +# To force ARCH and CROSS_COMPILE settings include kernel.* files
  184 +# in the kernel tree - do not patch this file.
182 185 export KBUILD_BUILDHOST := $(SUBARCH)
183   -ARCH ?= $(SUBARCH)
184   -CROSS_COMPILE ?=
185 186  
  187 +# Kbuild save the ARCH and CROSS_COMPILE setting in kernel.* files.
  188 +# Restore these settings and check that user did not specify
  189 +# conflicting values.
  190 +
  191 +saved_arch := $(shell cat include/generated/kernel.arch 2> /dev/null)
  192 +saved_cross := $(shell cat include/generated/kernel.cross 2> /dev/null)
  193 +
  194 +ifneq ($(CROSS_COMPILE),)
  195 + ifneq ($(saved_cross),)
  196 + ifneq ($(CROSS_COMPILE),$(saved_cross))
  197 + $(error CROSS_COMPILE changed from \
  198 + "$(saved_cross)" to \
  199 + to "$(CROSS_COMPILE)". \
  200 + Use "make mrproper" to fix it up)
  201 + endif
  202 + endif
  203 +else
  204 + CROSS_COMPILE := $(saved_cross)
  205 +endif
  206 +
  207 +ifneq ($(ARCH),)
  208 + ifneq ($(saved_arch),)
  209 + ifneq ($(saved_arch),$(ARCH))
  210 + $(error ARCH changed from \
  211 + "$(saved_arch)" to "$(ARCH)". \
  212 + Use "make mrproper" to fix it up)
  213 + endif
  214 + endif
  215 +else
  216 + ifneq ($(saved_arch),)
  217 + ARCH := $(saved_arch)
  218 + else
  219 + ARCH := $(SUBARCH)
  220 + endif
  221 +endif
  222 +
186 223 # Architecture as present in compile.h
187 224 UTS_MACHINE := $(ARCH)
188 225 SRCARCH := $(ARCH)
... ... @@ -445,6 +482,11 @@
445 482 # used for 'make defconfig'
446 483 include $(srctree)/arch/$(SRCARCH)/Makefile
447 484 export KBUILD_DEFCONFIG KBUILD_KCONFIG
  485 +
  486 +# save ARCH & CROSS_COMPILE settings
  487 +$(shell mkdir -p include/generated && \
  488 + echo $(ARCH) > include/generated/kernel.arch && \
  489 + echo $(CROSS_COMPILE) > include/generated/kernel.cross)
448 490  
449 491 config: scripts_basic outputmakefile FORCE
450 492 $(Q)mkdir -p include/linux include/config