[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [XEN PATCH v8 15/47] build: hook kconfig into xen build system
Now that xen's build system is very close to Linux's ones, we can hook "Makefile.host" into Xen's build system, and we can build Kconfig with that. "tools/kconfig/Makefile" now needs a workaround to not rebuild "$(XEN_ROOT)/.config", as `make` tries the rules "%.config" which fails with: tools/kconfig/Makefile:95: *** No configuration exists for this target on this architecture. Stop. Signed-off-by: Anthony PERARD <anthony.perard@xxxxxxxxxx> Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx> --- Notes: v8: - reviewed - adjust Makefile.host to use the renamed macro "multi-depend". - move .config empty rules workaround into kconfig/Makefile (from Rules.mk) and merge the change of patch build: add an other explicite rules to not build $(XEN_ROOT)/.config into build: hook kconfig into xen build system xen/Makefile | 34 ++++-- xen/Rules.mk | 13 ++- xen/scripts/Kbuild.include | 31 ++++++ xen/scripts/Makefile.clean | 11 +- xen/{tools/kconfig => scripts}/Makefile.host | 11 +- xen/tools/kconfig/Makefile | 3 + xen/tools/kconfig/Makefile.kconfig | 106 ------------------- 7 files changed, 86 insertions(+), 123 deletions(-) rename xen/{tools/kconfig => scripts}/Makefile.host (95%) delete mode 100644 xen/tools/kconfig/Makefile.kconfig diff --git a/xen/Makefile b/xen/Makefile index d38425234c6c..c26c44818916 100644 --- a/xen/Makefile +++ b/xen/Makefile @@ -40,6 +40,7 @@ ARCH=$(XEN_TARGET_ARCH) SRCARCH=$(shell echo $(ARCH) | \ sed -e 's/x86.*/x86/' -e s'/arm\(32\|64\)/arm/g' \ -e s'/riscv.*/riscv/g') +export ARCH SRCARCH # Don't break if the build process wasn't called from the top level # we need XEN_TARGET_ARCH to generate the proper config @@ -163,6 +164,13 @@ ifneq ($(filter %config,$(MAKECMDGOALS)),) config-build := y endif +export CONFIG_SHELL := $(SHELL) +export YACC = $(if $(BISON),$(BISON),bison) +export LEX = $(if $(FLEX),$(FLEX),flex) + +# Default file for 'make defconfig'. +export KBUILD_DEFCONFIG := $(ARCH)_defconfig + # CLANG_FLAGS needs to be calculated before calling Kconfig ifneq ($(shell $(CC) --version 2>&1 | head -n 1 | grep clang),) CLANG_FLAGS := @@ -203,9 +211,6 @@ PHONY += tools_fixdep tools_fixdep: $(MAKE) -C tools fixdep -# Shorthand for kconfig -kconfig = -f $(BASEDIR)/tools/kconfig/Makefile.kconfig ARCH=$(ARCH) SRCARCH=$(SRCARCH) HOSTCC="$(HOSTCC)" HOSTCXX="$(HOSTCXX)" - ifeq ($(config-build),y) # =========================================================================== # *config targets only - make sure prerequisites are updated, and descend @@ -221,14 +226,14 @@ filechk_kconfig_allconfig = \ .allconfig.tmp: FORCE set -e; { $(call filechk_kconfig_allconfig); } > $@ -config: FORCE - $(MAKE) $(kconfig) $@ +config: tools_fixdep FORCE + $(Q)$(MAKE) $(build)=tools/kconfig $@ # Config.mk tries to include .config file, don't try to remake it %/.config: ; -%config: .allconfig.tmp FORCE - $(MAKE) $(kconfig) KCONFIG_ALLCONFIG=$< $@ +%config: .allconfig.tmp tools_fixdep FORCE + $(Q)$(MAKE) $(build)=tools/kconfig KCONFIG_ALLCONFIG=$< $@ else # !config-build @@ -238,9 +243,15 @@ ifeq ($(need-config),y) # changes are detected. -include include/config/auto.conf.cmd +# This allows make to build fixdep before invoking defconfig. We can't use +# "tools_fixdep" which is a .PHONY target and would force make to call +# "defconfig" again to update $(KCONFIG_CONFIG). +tools/fixdep: + $(MAKE) -C tools fixdep + # Allow people to just run `make` as before and not force them to configure -$(KCONFIG_CONFIG): - $(MAKE) $(kconfig) defconfig +$(KCONFIG_CONFIG): tools/fixdep + $(Q)$(MAKE) $(build)=tools/kconfig defconfig # The actual configuration files used during the build are stored in # include/generated/ and include/config/. Update them if .config is newer than @@ -249,7 +260,7 @@ $(KCONFIG_CONFIG): # This exploits the 'multi-target pattern rule' trick. # The syncconfig should be executed only once to make all the targets. include/config/%.conf include/config/%.conf.cmd: $(KCONFIG_CONFIG) - $(MAKE) $(kconfig) syncconfig + $(Q)$(MAKE) $(build)=tools/kconfig syncconfig ifeq ($(CONFIG_DEBUG),y) CFLAGS += -O1 @@ -409,9 +420,10 @@ _clean: $(MAKE) $(clean) arch/riscv $(MAKE) $(clean) arch/x86 $(MAKE) $(clean) test - $(MAKE) $(kconfig) clean + $(MAKE) $(clean) tools/kconfig find . \( -name "*.o" -o -name ".*.d" -o -name ".*.d2" \ -o -name ".*.o.tmp" -o -name "*~" -o -name "core" \ + -o -name '*.lex.c' -o -name '*.tab.[ch]' \ -o -name "*.gcno" -o -name ".*.cmd" -o -name "lib.a" \) -exec rm -f {} \; rm -f include/asm $(TARGET) $(TARGET).gz $(TARGET).efi $(TARGET).efi.map $(TARGET)-syms $(TARGET)-syms.map *~ core rm -f asm-offsets.s arch/*/include/asm/asm-offsets.h diff --git a/xen/Rules.mk b/xen/Rules.mk index d32fec0ae037..f452a821cc86 100644 --- a/xen/Rules.mk +++ b/xen/Rules.mk @@ -89,6 +89,13 @@ subdir-y := $(addprefix $(obj)/,$(subdir-y)) nocov-y := $(addprefix $(obj)/,$(nocov-y)) noubsan-y := $(addprefix $(obj)/,$(noubsan-y)) +# Do not include hostprogs rules unless needed. +# $(sort ...) is used here to remove duplicated words and excessive spaces. +hostprogs-y := $(sort $(hostprogs-y)) +ifneq ($(hostprogs-y),) +include scripts/Makefile.host +endif + # subdir-builtin may contain duplications. Use $(sort ...) subdir-builtin := $(sort $(filter %/built_in.o, $(obj-y))) @@ -267,7 +274,11 @@ intermediate_targets = $(foreach sfx, $(2), \ $(patsubst %$(strip $(1)),%$(sfx), \ $(filter %$(strip $(1)), $(targets)))) # %.init.o <- %.o -targets += $(call intermediate_targets, .init.o, .o) +# %.lex.o <- %.lex.c <- %.l +# %.tab.o <- %.tab.[ch] <- %.y +targets += $(call intermediate_targets, .init.o, .o) \ + $(call intermediate_targets, .lex.o, .lex.c) \ + $(call intermediate_targets, .tab.o, .tab.c .tab.h) # Build # --------------------------------------------------------------------------- diff --git a/xen/scripts/Kbuild.include b/xen/scripts/Kbuild.include index 6be38301e835..79b42e1252d6 100644 --- a/xen/scripts/Kbuild.include +++ b/xen/scripts/Kbuild.include @@ -25,6 +25,37 @@ real-prereqs = $(filter-out $(PHONY), $^) # Escape single quote for use in echo statements escsq = $(subst $(squote),'\$(squote)',$1) +### +# Easy method for doing a status message + kecho := : + quiet_kecho := echo +silent_kecho := : +kecho := $($(quiet)kecho) + +### +# filechk is used to check if the content of a generated file is updated. +# Sample usage: +# +# filechk_sample = echo $(KERNELRELEASE) +# version.h: FORCE +# $(call filechk,sample) +# +# The rule defined shall write to stdout the content of the new file. +# The existing file will be compared with the new one. +# - If no file exist it is created +# - If the content differ the new file is used +# - If they are equal no change, and no timestamp update +define filechk + $(Q)set -e; \ + mkdir -p $(dir $@); \ + trap "rm -f $(dot-target).tmp" EXIT; \ + { $(filechk_$(1)); } > $(dot-target).tmp; \ + if [ ! -r $@ ] || ! cmp -s $@ $(dot-target).tmp; then \ + $(kecho) ' UPD $@'; \ + mv -f $(dot-target).tmp $@; \ + fi +endef + # as-insn: Check whether assembler supports an instruction. # Usage: cflags-y += $(call as-insn,CC FLAGS,"insn",option-yes,option-no) as-insn = $(if $(shell echo 'void _(void) { asm volatile ( $(2) ); }' \ diff --git a/xen/scripts/Makefile.clean b/xen/scripts/Makefile.clean index c3b0681611da..156d6307cf83 100644 --- a/xen/scripts/Makefile.clean +++ b/xen/scripts/Makefile.clean @@ -17,8 +17,17 @@ include $(src)/Makefile subdir-all := $(subdir-y) $(subdir-n) $(subdir-) \ $(patsubst %/,%, $(filter %/, $(obj-y) $(obj-n) $(obj-))) +__clean-files := \ + $(clean-files) $(hostprogs-y) $(hostprogs-) + +__clean-files := $(wildcard $(__clean-files)) + .PHONY: clean -clean:: $(subdir-all) ; +clean:: $(subdir-all) +ifneq ($(strip $(__clean-files)),) + rm -rf $(__clean-files) +endif + @: # Descending # --------------------------------------------------------------------------- diff --git a/xen/tools/kconfig/Makefile.host b/xen/scripts/Makefile.host similarity index 95% rename from xen/tools/kconfig/Makefile.host rename to xen/scripts/Makefile.host index 4c51c95d40f4..8a85f94316bc 100644 --- a/xen/tools/kconfig/Makefile.host +++ b/xen/scripts/Makefile.host @@ -1,5 +1,8 @@ # SPDX-License-Identifier: GPL-2.0 +# target with $(obj)/ and its suffix stripped +target-stem = $(basename $(patsubst $(obj)/%,%,$@)) + # LEX # --------------------------------------------------------------------------- quiet_cmd_flex = LEX $@ @@ -114,7 +117,7 @@ quiet_cmd_host-cmulti = HOSTLD $@ $(KBUILD_HOSTLDLIBS) $(HOSTLDLIBS_$(target-stem)) $(host-cmulti): FORCE $(call if_changed,host-cmulti) -$(call multi_depend, $(host-cmulti), , -objs) +$(call multi-depend, $(host-cmulti), , -objs) # Create .o file from a single .c file # host-cobjs -> .o @@ -132,7 +135,7 @@ quiet_cmd_host-cxxmulti = HOSTLD $@ $(KBUILD_HOSTLDLIBS) $(HOSTLDLIBS_$(target-stem)) $(host-cxxmulti): FORCE $(call if_changed,host-cxxmulti) -$(call multi_depend, $(host-cxxmulti), , -objs -cxxobjs) +$(call multi-depend, $(host-cxxmulti), , -objs -cxxobjs) # Create .o file from a single .cc (C++) file quiet_cmd_host-cxxobjs = HOSTCXX $@ @@ -165,7 +168,7 @@ quiet_cmd_host-cshlib = HOSTLLD -shared $@ $(KBUILD_HOSTLDLIBS) $(HOSTLDLIBS_$(target-stem).so) $(host-cshlib): FORCE $(call if_changed,host-cshlib) -$(call multi_depend, $(host-cshlib), .so, -objs) +$(call multi-depend, $(host-cshlib), .so, -objs) # Link a shared library, based on position independent .o files # *.o -> .so shared library (host-cxxshlib) @@ -175,7 +178,7 @@ quiet_cmd_host-cxxshlib = HOSTLLD -shared $@ $(KBUILD_HOSTLDLIBS) $(HOSTLDLIBS_$(target-stem).so) $(host-cxxshlib): FORCE $(call if_changed,host-cxxshlib) -$(call multi_depend, $(host-cxxshlib), .so, -objs) +$(call multi-depend, $(host-cxxshlib), .so, -objs) targets += $(host-csingle) $(host-cmulti) $(host-cobjs)\ $(host-cxxmulti) $(host-cxxobjs) $(host-cshlib) $(host-cshobjs) $(host-cxxshlib) $(host-cxxshobjs) diff --git a/xen/tools/kconfig/Makefile b/xen/tools/kconfig/Makefile index f39521a0ed5b..b7b9a419ad59 100644 --- a/xen/tools/kconfig/Makefile +++ b/xen/tools/kconfig/Makefile @@ -91,6 +91,9 @@ endif configfiles=$(wildcard $(srctree)/kernel/configs/$@ $(srctree)/arch/$(SRCARCH)/configs/$@) +# Don't try to remake this file included by Config.mk. +$(XEN_ROOT)/.config: ; + %.config: $(obj)/conf $(if $(call configfiles),, $(error No configuration exists for this target on this architecture)) $(Q)$(CONFIG_SHELL) $(srctree)/tools/kconfig/merge_config.sh -m .config $(configfiles) diff --git a/xen/tools/kconfig/Makefile.kconfig b/xen/tools/kconfig/Makefile.kconfig deleted file mode 100644 index 799321ec4d07..000000000000 --- a/xen/tools/kconfig/Makefile.kconfig +++ /dev/null @@ -1,106 +0,0 @@ -# xen/tools/kconfig - -# default rule to do nothing -all: - -# Xen doesn't have a silent build flag -quiet := -Q := -kecho := : - -# eventually you'll want to do out of tree builds -srctree := $(BASEDIR) -objtree := $(srctree) -src := tools/kconfig -obj := $(src) - -# handle functions (most of these lifted from different Linux makefiles -dot-target = $(dir $@).$(notdir $@) -depfile = $(subst $(comma),,$(dot-target).d) -basetarget = $(basename $(notdir $@)) -# target with $(obj)/ and its suffix stripped -target-stem = $(basename $(patsubst $(obj)/%,%,$@)) -cmd = $(cmd_$(1)) -if_changed = $(cmd_$(1)) -if_changed_dep = $(cmd_$(1)) - -### -# filechk is used to check if the content of a generated file is updated. -# Sample usage: -# -# filechk_sample = echo $(KERNELRELEASE) -# version.h: FORCE -# $(call filechk,sample) -# -# The rule defined shall write to stdout the content of the new file. -# The existing file will be compared with the new one. -# - If no file exist it is created -# - If the content differ the new file is used -# - If they are equal no change, and no timestamp update -# - stdin is piped in from the first prerequisite ($<) so one has -# to specify a valid file as first prerequisite (often the kbuild file) -define filechk - $(Q)set -e; \ - mkdir -p $(dir $@); \ - { $(filechk_$(1)); } > $@.tmp; \ - if [ -r $@ ] && cmp -s $@ $@.tmp; then \ - rm -f $@.tmp; \ - else \ - $(kecho) ' UPD $@'; \ - mv -f $@.tmp $@; \ - fi -endef - -define multi_depend -$(foreach m, $(notdir $1), \ - $(eval $(obj)/$m: \ - $(addprefix $(obj)/, $(foreach s, $3, $($(m:%$(strip $2)=%$(s))))))) -endef - -# Set our default defconfig file -KBUILD_DEFCONFIG := $(ARCH)_defconfig - -# provide our shell -CONFIG_SHELL := $(SHELL) - -# provide the host compiler -HOSTCC ?= gcc -HOSTCXX ?= g++ -YACC = $(if $(BISON),$(BISON),bison) -LEX = $(if $(FLEX),$(FLEX),flex) - -# force target -PHONY += FORCE - -FORCE: - -# include the original Makefile and Makefile.host from Linux -include $(src)/Makefile -include $(src)/Makefile.host - -# Add intermediate targets: -# When building objects with specific suffix patterns, add intermediate -# targets that the final targets are derived from. -intermediate_targets = $(foreach sfx, $(2), \ - $(patsubst %$(strip $(1)),%$(sfx), \ - $(filter %$(strip $(1)), $(targets)))) - -# %.lex.o <- %.lex.c <- %.l -# %.tab.o <- %.tab.[ch] <- %.y -targets += $(call intermediate_targets, .lex.o, .lex.c) \ - $(call intermediate_targets, .tab.o, .tab.c .tab.h) - -# clean up rule -clean-deps = $(foreach f,$(host-cobjs) $(host-cxxobjs),$(dir $f).$(notdir $f).d) -clean-shipped = $(patsubst %_shipped,%,$(wildcard $(obj)/*_shipped)) - -clean: - rm -rf $(clean-files) - rm -rf $(clean-deps) - rm -rf $(host-csingle) $(host-cmulti) $(host-cxxmulti) $(host-cobjs) $(host-cxxobjs) - rm -rf $(clean-shipped) - -$(obj)/zconf%: $(src)/zconf%_shipped - cp -f $< $@ - -.PHONY: $(PHONY) -- Anthony PERARD
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |