kbuild: Allow scripts/* to be cross compiled
PATCH 1/1 kbuild: Allow scripts/* to be cross compiled
From: John Rigby <[email protected]>
Cross compiling the binaries in scripts/* is not possible because various makefiles assume that $(obj)/whatever is executable on the build host.
This patch introduces a new variable called KBUILD_SCRIPTROOT that points to script/binaries to use while cross compiling.
Usage:
Build scripts for the build host:
make O=path/to/buildhost/buildscripts \ silentoldconfig prepare scripts Then cross build script for target: make O=path/to/target/buildscripts \ HOSTCC=$CROSS_COMPILE \ KBUILD_SCRIPTROOT=path/to/buildhost/buildscripts silentoldconfig prepare scripts
This patch does not use KBUILD_SCRIPTROOT for all script invocations it only redefines the following if KBUILD_SCRIPTROOT is defined.
scripts/Makefile.build
scripts/basic/fixdep --> $(KBUILD_SCRIPTROOT)/scripts/basic/fixdep
scripts/kconfig/Makefile
$(obj)/conf --> $(KBUILD_SCRIPTROOT)/scripts/kconfig/conf
scripts/mod/Makefile
$(obj)mk_elfconfig --> $(KBUILD_SCRIPTROOT)/scripts/mod/mk_elfconfig
--- scripts/Kbuild.include | 6 +++++- scripts/Makefile.build | 6 +++++- scripts/kconfig/Makefile | 30 ++++++++++++++++++------------ scripts/mod/Makefile | 10 ++++++++-- 4 files changed, 36 insertions(+), 16 deletions(-)
scripts/Kbuild.include +5 -1
@@ -222,11 +222,15 @@ if_changed = $(if $(strip $(any-prereq) $(arg-check)), \ $(echo-cmd) $(cmd_$(1)); \ echo 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd) +ifeq ($(KBUILD_SCRIPTROOT),) +KBUILD_SCRIPTROOT=. +endif + # Execute the command and also postprocess generated .d dependencies file. if_changed_dep = $(if $(strip $(any-prereq) $(arg-check) ), \ @set -e; \ $(echo-cmd) $(cmd_$(1)); \ - scripts/basic/fixdep $(depfile) $@ '$(make-cmd)' > $(dot-target).tmp;\ + $(KBUILD_SCRIPTROOT)/scripts/basic/fixdep $(depfile) $@ '$(make-cmd)' > $(dot-target).tmp;\ rm -f $(depfile); \ mv -f $(dot-target).tmp $(dot-target).cmd)
scripts/Makefile.build +5 -1
@@ -291,13 +291,17 @@ cmd_record_mcount = \ fi; endif +ifeq ($(KBUILD_SCRIPTROOT),) +KBUILD_SCRIPTROOT=. +endif + define rule_cc_o_c $(call echo-cmd,checksrc) $(cmd_checksrc) \ $(call echo-cmd,cc_o_c) $(cmd_cc_o_c); \ $(cmd_modversions) \ $(call echo-cmd,record_mcount) \ $(cmd_record_mcount) \ - scripts/basic/fixdep $(depfile) $@ '$(call make-cmd,cc_o_c)' > \ + $(KBUILD_SCRIPTROOT)/scripts/basic/fixdep $(depfile) $@ '$(call make-cmd,cc_o_c)' > \ $(dot-target).tmp; \ rm -f $(depfile); \ mv -f $(dot-target).tmp $(dot-target).cmd
scripts/kconfig/Makefile +18 -12
@@ -14,6 +14,12 @@ endif # We need this, in case the user has it in its environment unexport CONFIG_ +ifdef KBUILD_SCRIPTROOT +CONF = $(KBUILD_SCRIPTROOT)/scripts/kconfig/conf +else +CONF = $(obj)/conf +endif + xconfig: $(obj)/qconf $< $(Kconfig)
@@ -23,31 +29,31 @@ gconfig: $(obj)/gconf menuconfig: $(obj)/mconf $< $(Kconfig) -config: $(obj)/conf +config: $(CONF) $< --oldaskconfig $(Kconfig) nconfig: $(obj)/nconf $< $(Kconfig) -oldconfig: $(obj)/conf +oldconfig: $(CONF) $< --$@ $(Kconfig) -silentoldconfig: $(obj)/conf +silentoldconfig: $(CONF) $(Q)mkdir -p include/generated $< --$@ $(Kconfig) -localyesconfig localmodconfig: $(obj)/streamline_config.pl $(obj)/conf +localyesconfig localmodconfig: $(obj)/streamline_config.pl $(CONF) $(Q)mkdir -p include/generated $(Q)perl $< --$@ $(srctree) $(Kconfig) > .tmp.config $(Q)if [ -f .config ]; then \ cmp -s .tmp.config .config || \ (mv -f .config .config.old.1; \ mv -f .tmp.config .config; \ - $(obj)/conf --silentoldconfig $(Kconfig); \ + $(CONF) --silentoldconfig $(Kconfig); \ mv -f .config.old.1 .config.old) \ else \ mv -f .tmp.config .config; \ - $(obj)/conf --silentoldconfig $(Kconfig); \ + $(CONF) --silentoldconfig $(Kconfig); \ fi $(Q)rm -f .tmp.config
@@ -76,24 +82,24 @@ update-po-config: $(obj)/kxgettext $(obj)/gconf.glade.h PHONY += allnoconfig allyesconfig allmodconfig alldefconfig randconfig -allnoconfig allyesconfig allmodconfig alldefconfig randconfig: $(obj)/conf +allnoconfig allyesconfig allmodconfig alldefconfig randconfig: $(CONF) $< --$@ $(Kconfig) PHONY += listnewconfig olddefconfig oldnoconfig savedefconfig defconfig -listnewconfig olddefconfig: $(obj)/conf +listnewconfig olddefconfig: $(CONF) $< --$@ $(Kconfig) # oldnoconfig is an alias of olddefconfig, because people already are dependent # on its behavior(sets new symbols to their default value but not 'n') with the # counter-intuitive name. -oldnoconfig: $(obj)/conf +oldnoconfig: $(CONF) $< --olddefconfig $(Kconfig) -savedefconfig: $(obj)/conf +savedefconfig: $(CONF) $< --$@=defconfig $(Kconfig) -defconfig: $(obj)/conf +defconfig: $(CONF) ifeq ($(KBUILD_DEFCONFIG),) $< --defconfig $(Kconfig) else
@@ -101,7 +107,7 @@ else $(Q)$< --defconfig=arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG) $(Kconfig) endif -%_defconfig: $(obj)/conf +%_defconfig: $(CONF) $(Q)$< --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig) # Help text used by make help
scripts/mod/Makefile +8 -2
@@ -1,6 +1,12 @@ hostprogs-y := modpost mk_elfconfig always := $(hostprogs-y) empty.o +ifdef KBUILD_SCRIPTROOT +MKELFCONFIG = $(KBUILD_SCRIPTROOT)/scripts/mod/mk_elfconfig +else +MKELFCONFIG = $(obj)/mk_elfconfig +endif + modpost-objs := modpost.o file2alias.o sumversion.o devicetable-offsets-file := devicetable-offsets.h
@@ -40,9 +46,9 @@ $(obj)/modpost.o $(obj)/file2alias.o $(obj)/sumversion.o: $(obj)/elfconfig.h $(obj)/file2alias.o: $(obj)/$(devicetable-offsets-file) quiet_cmd_elfconfig = MKELF $@ - cmd_elfconfig = $(obj)/mk_elfconfig < $< > $@ + cmd_elfconfig = $(MKELFCONFIG) < $< > $@ -$(obj)/elfconfig.h: $(obj)/empty.o $(obj)/mk_elfconfig FORCE +$(obj)/elfconfig.h: $(obj)/empty.o $(MKELFCONFIG) FORCE $(call if_changed,elfconfig) targets += elfconfig.h
Signature · 1 line
1.8.4.rc1
Quoted 5 lines · Mark Brown
From: John Rigby <[email protected]>
Cross compiling the binaries in
scripts/*is not possible because various makefiles assume that $(obj)/whatever is executable on the build host.
Please explain what problem you are trying to solve with this. I do not understand the rationale behind this patch from the above.
Sam
Quoted 9 lines · Sam Ravnborg
Quoted 5 lines · Mark Brown
From: John Rigby <[email protected]>
Cross compiling the binaries in
scripts/*is not possible because various makefiles assume that $(obj)/whatever is executable on the build host.Please explain what problem you are trying to solve with this. I do not understand the rationale behind this patch from the above.
OK... I'd have thought that cross compliation was enough of a rationale to be honest.
Quoted 8 lines · Mark Brown
Quoted 6 lines · Sam Ravnborg
Quoted 5 lines · Mark Brown
From: John Rigby <[email protected]>
Cross compiling the binaries in
scripts/*is not possible because various makefiles assume that $(obj)/whatever is executable on the build host.
Quoted 5 lines
Quoted 2 lines
Please explain what problem you are trying to solve with this. I do not understand the rationale behind this patch from the above.
OK... I'd have thought that cross compliation was enough of a rationale to be honest.
The way I understand cross compilation is that for example you build for arm - on your x86 box.
This is supported today.
So you need to explain your interpretation of cross compilation and why this patch is needed.
Because I do not get it.
Sam
Quoted 5 lines · Sam Ravnborg
Quoted 2 lines · Mark Brown
OK... I'd have thought that cross compliation was enough of a rationale to be honest.
Quoted 7 lines
The way I understand cross compilation is that for example you build for arm - on your x86 box.
This is supported today.So you need to explain your interpretation of cross compilation and why this patch is needed.
Because I do not get it.
I thought that was covered by:
Cross compiling the binaries in scripts/* is not possible because various makefiles assume that $(obj)/whatever is executable on the build host.
ie, we can cross build the kernel but not fixdep, conf or mk_elfconfig since those are assumed to be runnable for the kernel build, meaning they can't be deployed onto a target system without hoop jumping.
Quoted 16 lines · Mark Brown
Quoted 5 lines · Sam Ravnborg
Quoted 2 lines · Mark Brown
OK... I'd have thought that cross compliation was enough of a rationale to be honest.
Quoted 7 lines
The way I understand cross compilation is that for example you build for arm - on your x86 box.
This is supported today.So you need to explain your interpretation of cross compilation and why this patch is needed.
Because I do not get it.I thought that was covered by:
Quoted 7 lines
Cross compiling the binaries in
scripts/*is not possible because various makefiles assume that $(obj)/whatever is executable on the build host.ie, we can cross build the kernel but not fixdep, conf or
mk_elfconfigsince those are assumed to be runnable for the kernel build, meaning they can't be deployed onto a target system without hoop jumping.
OK, but what what do you need cross compile them and deploy on the target? Their job is to build the kernel. So if you are going to build the kernel on the target, you can also build the tools there, can't you? Or are you using the tools from something else than building the kernel?
I think that we are missing some detail of your use case and it does not make sense without that detail.
Michal
Quoted 6 lines · Michal Marek
Quoted 3 lines · Mark Brown
ie, we can cross build the kernel but not fixdep, conf or
mk_elfconfigsince those are assumed to be runnable for the kernel build, meaning they can't be deployed onto a target system without hoop jumping.
Quoted 7 lines
OK, but what what do you need cross compile them and deploy on the target? Their job is to build the kernel. So if you are going to build the kernel on the target, you can also build the tools there, can't you? Or are you using the tools from something else than building the kernel?
I think that we are missing some detail of your use case and it does not make sense without that detail.
Well, fixdep in particular seems like a generically useful thing that you might want installed but in general I agree - Andrey, why are we carrying this patch?
Quoted 5 lines · Mark Brown
From: John Rigby <[email protected]>
Cross compiling the binaries in
scripts/*is not possible because various makefiles assume that $(obj)/whatever is executable on the build host.
What is the use case for cross-compiling them? If you have a powerful enough target machine to build the kernel on it, you can as well compile the host scripts natively, can't you? But maybe I'm missing something, I do not cross-compile the kernel on a daily basis. Are there other projects that have such feature in their build system?
Quoted 5 lines
This patch introduces a new variable called
KBUILD_SCRIPTROOTthat points to script/binaries to use while cross compiling.Usage:
Quoted 8 lines
Build scripts for the build host:
make O=path/to/buildhost/buildscripts \ silentoldconfig prepare scripts Then cross build script for target: make O=path/to/target/buildscripts \ HOSTCC=$CROSS_COMPILE \ KBUILD_SCRIPTROOT=path/to/buildhost/buildscripts silentoldconfig prepare scripts
Note that a build that uses KBUILD_SCRIPTROOT cannot detect if the scripts are up to date and cannot rebuild them. This must be documented.
Quoted 11 lines
This patch does not use
KBUILD_SCRIPTROOTfor all script invocations it only redefines the following ifKBUILD_SCRIPTROOTis defined.
scripts/Makefile.buildscripts/basic/fixdep --> $(KBUILD_SCRIPTROOT)/scripts/basic/fixdep
scripts/kconfig/Makefile$(obj)/conf --> $(KBUILD_SCRIPTROOT)/scripts/kconfig/conf
scripts/mod/Makefile$(obj)mk_elfconfig --> $(KBUILD_SCRIPTROOT)/scripts/mod/mk_elfconfig
OK, but you might need to add a couple of more of them, like lib/gen_crc32table.
scripts/Kbuild.include if_changed = $(if $(strip $(any-prereq) $(arg-check)), \ · line 228
Quoted 12 lines
scripts/Kbuild.include +4
-0@@ -222,11 +222,15 @@ if_changed = $(if $(strip $(any-prereq) $(arg-check)), \ $(echo-cmd) $(cmd_$(1)); \ echo 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd) +ifeq ($(KBUILD_SCRIPTROOT),) +KBUILD_SCRIPTROOT=. +endif +
This should be set in the top level Makefile once.
Thanks,
Michal