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@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
Anthony PERARD authored and Jan Beulich committed 2022-02-25 11:03:35 +01:00
1 parent 04787e095a
commit 317c98cb91
7 files changed
+86 -123

No files matched your search

+23 -11
View File
@@ -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
@@ -406,9 +417,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
+12 -1
View File
@@ -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
# ---------------------------------------------------------------------------
+31
View File
@@ -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) ); }' \
+10 -1
View File
@@ -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
# ---------------------------------------------------------------------------
@@ -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)
+3
View File
@@ -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)
-106
View File
@@ -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)
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.