Skip to contentSkip to conversation

kbuild: Allow scripts/* to be cross compiled

PATCH In review Mark Brown 3 participants 8 messages Aug 9, 2013

Subsystems (2)
lore
Share & tools
lore

Mark Brown

author
#0 lore raw

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
index 547e15d..09aa90c 100644
@@ -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
index d5d859c..de35192 100644
@@ -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
index 844bc9d..c58f912 100644
@@ -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
index c11212f..8967d55 100644
@@ -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
#1 lore raw
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

author
#2 lore raw
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.

#3 lore raw
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

author
#4 lore raw
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.

#5 lore raw
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_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.

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

author
#6 lore raw
Quoted 6 lines · Michal Marek
Quoted 3 lines · Mark Brown

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 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?

#7 lore raw
In reply to Mark Brown
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_SCRIPTROOT that 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_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

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
index 547e15d..09aa90c 100644
@@ -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