Re: [RFC/RFT] kbuild: save ARCH & CROSS_COMPILE

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, 8 Oct 2007 22:02:55 +0200
Sam Ravnborg <[email protected]> wrote:

> One of the complaints that I continue to hear is that kbuild
> is lacking a way to 'remember' the ARCH and CROSS_COMPILE
> values originally used.
> Likewise we have people that change ARCH settings and get
> a lot of build errors due to asm symlink pointing at the
> wrong directory.
Yeah, almost happens at daily basis for me :)

> 
> This patch tries to address this by saving ARCH and
> CROSS_COMPILE settings and error out if user specify
> anohter ARCH or CROSS_COMPILE setting.
> If there is inconsistency then error out and suggest
> to run make mrproper.
> 
> This will as a side-effect prevent a build with the wrong
> asm symlink.
Sounds like a good idea.

> 
> The settings are stored in the build directory in a file
> named "Kbuild.config" (should it be a .dot file?).
> 
> I have tested it here with success - but please give
> it a try in your setup and let me know if anything breaks.
> 
> The patch is on top of latest linus tree but should apply
> with some fuzz to -mm too (at least it apply on top of 
> my kbuild.git tree).
> 
> PS. I do not like adding additional cruft to the top-level
> Makefile but did not find an easy way to push this to
> kconfig.
> 
> 	Sam
> 
> diff --git a/Makefile b/Makefile
> index 6fc97bf..9f6d03f 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -182,8 +182,33 @@ SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
>  # Default value for CROSS_COMPILE is not to prefix executables
>  # Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile
>  
> -ARCH		?= $(SUBARCH)
> -CROSS_COMPILE	?=
> +# Kbuild save the ARCH and CROSS_COMPILE setting in Kbuild.config
> +# Restore these settings and check that user did not specify
> +# conflicting values.
> +Kbuild.config: ;
> +noconfigcheck-targets := clean mrproper distclean help %config
> +
> +ifneq ($(wildcard Kbuild.config),)
> +        -include Kbuild.config
> +        ifeq ($(filter $(noconfigcheck-targets),$(MAKECMDGOALS)),)
> +                ifneq ($(CROSS_COMPILE),)
> +                        ifneq ($(CROSS_COMPILE),$(KBUILD_CROSS_COMPILE))
> +                                $(error CROSS_COMPILE changed from "$(KBUILD_CROSS_COMPILE)" \
> +                                        to "$(CROSS_COMPILE)". Use "make mrproper" to fix it up)
> +                        endif
> +                endif
> +                ifneq ($(ARCH),)
> +                        ifneq ($(KBUILD_ARCH),$(ARCH))
> +                                $(error ARCH changed from "$(KBUILD_ARCH)" \
> +                                        to "$(ARCH)". Use "make mrproper" to fix it up)
> +                        endif
> +                endif   
> +        endif
> +        CROSS_COMPILE := $(KBUILD_CROSS_COMPILE)
> +        ARCH := $(KBUILD_ARCH)
> +else
> +        ARCH ?= $(SUBARCH)
> +endif
>  
>  # Architecture as present in compile.h
>  UTS_MACHINE := $(ARCH)
> @@ -351,6 +376,12 @@ scripts_basic:
>  # To avoid any implicit rule to kick in, define an empty command.
>  scripts/basic/%: scripts_basic ;
>  
> +# Save CROSS_COMPILE and ARCH for subsequent make invocations
> +PHONY += Kbuild.config.save
> +Kbuild.config.save:
> +	$(Q)echo KBUILD_ARCH := $(ARCH)                   >  Kbuild.config
> +	$(Q)echo KBUILD_CROSS_COMPILE := $(CROSS_COMPILE) >> Kbuild.config
> +
>  PHONY += outputmakefile
>  # outputmakefile generates a Makefile in the output directory, if using a
>  # separate output directory. This allows convenient use of make in the
> @@ -413,7 +444,7 @@ ifeq ($(config-targets),1)
>  include $(srctree)/arch/$(ARCH)/Makefile
>  export KBUILD_DEFCONFIG
>  
> -config %config: scripts_basic outputmakefile FORCE
> +config %config: scripts_basic outputmakefile Kbuild.config.save FORCE
>  	$(Q)mkdir -p include/linux include/config
>  	$(Q)$(MAKE) $(build)=scripts/kconfig $@
>  
> @@ -853,7 +884,10 @@ PHONY += prepare archprepare prepare0 prepare1 prepare2 prepare3
>  # and if so do:
>  # 1) Check that make has not been executed in the kernel src $(srctree)
>  # 2) Create the include2 directory, used for the second asm symlink
> -prepare3: include/config/kernel.release
> +prepare3: include/config/kernel.release Kbuild.config.save
> +ifneq ($(KBUILD_CROSS_COMPILE)$(KBUILD_ARCH),)
> +	$(Q)echo '  Using ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE)'
> +endif
>  ifneq ($(KBUILD_SRC),)
>  	@echo '  Using $(srctree) as source for kernel'
>  	$(Q)if [ -f $(srctree)/.config -o -d $(srctree)/include/config ]; then \
> @@ -919,10 +953,10 @@ define filechk_version.h
>  	echo '#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))';)
>  endef
>  
> -include/linux/version.h: $(srctree)/Makefile FORCE
> +include/linux/version.h: $(srctree)/Makefile prepare2 FORCE
>  	$(call filechk,version.h)
>  
> -include/linux/utsrelease.h: include/config/kernel.release FORCE
> +include/linux/utsrelease.h: include/config/kernel.release prepare2 FORCE
>  	$(call filechk,utsrelease.h)
>  
>  # ---------------------------------------------------------------------------
> @@ -1050,7 +1084,7 @@ CLEAN_FILES +=	vmlinux System.map \
>  MRPROPER_DIRS  += include/config include2 usr/include
>  MRPROPER_FILES += .config .config.old include/asm .version .old_version \
>                    include/linux/autoconf.h include/linux/version.h      \
> -                  include/linux/utsrelease.h                            \
> +                  include/linux/utsrelease.h Kbuild.config              \
>  		  Module.symvers tags TAGS cscope*
>  
>  # clean - Delete most, but leave enough to build external modules
> -
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to [email protected]
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux