Re: linux-next: manual merge of the rust tree with the kbuild tree

From: Nick Desaulniers
Date: Wed Aug 11 2021 - 13:04:53 EST


On Wed, Aug 11, 2021 at 12:26 AM Stephen Rothwell <sfr@xxxxxxxxxxxxxxxx> wrote:
>
> Hi all,
>
> Today's linux-next merge of the rust tree got a conflict in:
>
> Makefile
>
> between commit:
>
> 6f5b41a2f5a6 ("Makefile: move initial clang flag handling into scripts/Makefile.clang")
> 231ad7f409f1 ("Makefile: infer --target from ARCH for CC=clang")
> f12b034afeb3 ("scripts/Makefile.clang: default to LLVM_IAS=1")
>
> from the kbuild tree and commit:
>
> e17f1b1f3e01 ("Makefile: generate `CLANG_FLAGS` even in GCC builds")
>
> from the rust tree.
>
> I fixed it up (Makefile fix up at the bottom, plus the following patch)
> and can carry the fix as necessary. This is now fixed as far as
> linux-next is concerned, but any non trivial conflicts should be
> mentioned to your upstream maintainer when your tree is submitted for
> merging. You may also want to consider cooperating with the maintainer
> of the conflicting tree to minimise any particularly complex conflicts.
>
> From: Stephen Rothwell <sfr@xxxxxxxxxxxxxxxx>
> Date: Wed, 11 Aug 2021 17:18:36 +1000
> Subject: [PATCH] fixup for rust integration with Makefile.clang creation
>
> Signed-off-by: Stephen Rothwell <sfr@xxxxxxxxxxxxxxxx>
> ---
> Makefile | 17 -----------------
> scripts/Makefile.clang | 19 +++++++++++++------
> 2 files changed, 13 insertions(+), 23 deletions(-)
>
> diff --git a/Makefile b/Makefile
> index 5d504a1dcb06..3638ce07f208 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -625,24 +625,7 @@ endif
> # and from include/config/auto.conf.cmd to detect the compiler upgrade.
> CC_VERSION_TEXT = $(subst $(pound),,$(shell LC_ALL=C $(CC) --version 2>/dev/null | head -n 1))
>
> -TENTATIVE_CLANG_FLAGS := -Werror=unknown-warning-option
> -
> -ifneq ($(CROSS_COMPILE),)
> -TENTATIVE_CLANG_FLAGS += --target=$(notdir $(CROSS_COMPILE:%-=%))
> -endif
> -ifeq ($(LLVM_IAS),1)
> -TENTATIVE_CLANG_FLAGS += -integrated-as
> -else
> -TENTATIVE_CLANG_FLAGS += -no-integrated-as
> -GCC_TOOLCHAIN_DIR := $(dir $(shell which $(CROSS_COMPILE)elfedit))
> -TENTATIVE_CLANG_FLAGS += --prefix=$(GCC_TOOLCHAIN_DIR)$(notdir $(CROSS_COMPILE))
> -endif
> -
> -export TENTATIVE_CLANG_FLAGS
> -
> -ifneq ($(findstring clang,$(CC_VERSION_TEXT)),)
> include $(srctree)/scripts/Makefile.clang
> -endif

Thanks Stephen for taking the time to resolve this and send a patch.
We owe you one. We knew this conflict was coming.

Miguel, would you mind rolling this patch into your tree, then
crediting Stephen if possible (on the patch that adds
TENTATIVE_CLANG_FLAGS)?

I think the above `ifneq ($(findstring clang,$(CC_VERSION_TEXT)),)`
should stay in the top level Makefile though. It does look nicer to
bury it in scripts/Makefile.clang, but I worry that someone doing a
GCC build might trip the $(error) in that file (if CROSS_COMPILE was
set and we're building a non-llvm-supported target).

Also, if you're rebasing the related patches, I hope we can use a
shorter identifier than TENTATIVE_CLANG_FLAGS? If they're used for
bindgen, maybe BINDGEN_FLAGS?

>
> # Include this also for config targets because some architectures need
> # cc-cross-prefix to determine CROSS_COMPILE.
> diff --git a/scripts/Makefile.clang b/scripts/Makefile.clang
> index 3ae63bd35582..555b5255d9b3 100644
> --- a/scripts/Makefile.clang
> +++ b/scripts/Makefile.clang
> @@ -12,24 +12,31 @@ CLANG_TARGET_FLAGS_s390 := s390x-linux-gnu
> CLANG_TARGET_FLAGS_x86 := x86_64-linux-gnu
> CLANG_TARGET_FLAGS := $(CLANG_TARGET_FLAGS_$(SRCARCH))
>
> +TENTATIVE_CLANG_FLAGS := -Werror=unknown-warning-option
> +
> ifeq ($(CROSS_COMPILE),)
> ifeq ($(CLANG_TARGET_FLAGS),)
> $(error Specify CROSS_COMPILE or add '--target=' option to scripts/Makefile.clang)
> else
> -CLANG_FLAGS += --target=$(CLANG_TARGET_FLAGS)
> +TENTATIVE_CLANG_FLAGS += --target=$(CLANG_TARGET_FLAGS)
> endif # CLANG_TARGET_FLAGS
> else
> -CLANG_FLAGS += --target=$(notdir $(CROSS_COMPILE:%-=%))
> +TENTATIVE_CLANG_FLAGS += --target=$(notdir $(CROSS_COMPILE:%-=%))
> endif # CROSS_COMPILE
>
> ifeq ($(LLVM_IAS),0)
> -CLANG_FLAGS += -no-integrated-as
> +TENTATIVE_CLANG_FLAGS += -no-integrated-as
> GCC_TOOLCHAIN_DIR := $(dir $(shell which $(CROSS_COMPILE)elfedit))
> -CLANG_FLAGS += --prefix=$(GCC_TOOLCHAIN_DIR)$(notdir $(CROSS_COMPILE))
> +TENTATIVE_CLANG_FLAGS += --prefix=$(GCC_TOOLCHAIN_DIR)$(notdir $(CROSS_COMPILE))
> else
> -CLANG_FLAGS += -integrated-as
> +TENTATIVE_CLANG_FLAGS += -integrated-as
> endif
> -CLANG_FLAGS += -Werror=unknown-warning-option
> +
> +export TENTATIVE_CLANG_FLAGS
> +
> +ifneq ($(findstring clang,$(CC_VERSION_TEXT)),)
> +CLANG_FLAGS += $(TENTATIVE_CLANG_FLAGS)
> KBUILD_CFLAGS += $(CLANG_FLAGS)
> KBUILD_AFLAGS += $(CLANG_FLAGS)
> export CLANG_FLAGS
> +endif
> --
> 2.30.2
>
> --
> Cheers,
> Stephen Rothwell
>
> diff --cc Makefile
> index fcda81da6c20,c814b209b6c9..000000000000
> --- a/Makefile
> +++ b/Makefile
> @@@ -581,10 -613,28 +623,25 @@@ endi
> # Some architectures define CROSS_COMPILE in arch/$(SRCARCH)/Makefile.
> # CC_VERSION_TEXT is referenced from Kconfig (so it needs export),
> # and from include/config/auto.conf.cmd to detect the compiler upgrade.
> -CC_VERSION_TEXT = $(subst $(pound),,$(shell $(CC) --version 2>/dev/null | head -n 1))
> +CC_VERSION_TEXT = $(subst $(pound),,$(shell LC_ALL=C $(CC) --version 2>/dev/null | head -n 1))
>
> + TENTATIVE_CLANG_FLAGS := -Werror=unknown-warning-option
> +
> + ifneq ($(CROSS_COMPILE),)
> + TENTATIVE_CLANG_FLAGS += --target=$(notdir $(CROSS_COMPILE:%-=%))
> + endif
> + ifeq ($(LLVM_IAS),1)
> + TENTATIVE_CLANG_FLAGS += -integrated-as
> + else
> + TENTATIVE_CLANG_FLAGS += -no-integrated-as
> + GCC_TOOLCHAIN_DIR := $(dir $(shell which $(CROSS_COMPILE)elfedit))
> + TENTATIVE_CLANG_FLAGS += --prefix=$(GCC_TOOLCHAIN_DIR)$(notdir $(CROSS_COMPILE))
> + endif
> +
> + export TENTATIVE_CLANG_FLAGS
> +
> ifneq ($(findstring clang,$(CC_VERSION_TEXT)),)
> -CLANG_FLAGS += $(TENTATIVE_CLANG_FLAGS)
> -KBUILD_CFLAGS += $(CLANG_FLAGS)
> -KBUILD_AFLAGS += $(CLANG_FLAGS)
> -export CLANG_FLAGS
> +include $(srctree)/scripts/Makefile.clang
> endif
>
> # Include this also for config targets because some architectures need
> @@@ -713,12 -763,11 +770,12 @@@ $(KCONFIG_CONFIG)
> # This exploits the 'multi-target pattern rule' trick.
> # The syncconfig should be executed only once to make all the targets.
> # (Note: use the grouped target '&:' when we bump to GNU Make 4.3)
> -quiet_cmd_syncconfig = SYNC $@
> - cmd_syncconfig = $(MAKE) -f $(srctree)/Makefile syncconfig
> -
> +#
> +# Do not use $(call cmd,...) here. That would suppress prompts from syncconfig,
> +# so you cannot notice that Kconfig is waiting for the user input.
> - %/config/auto.conf %/config/auto.conf.cmd %/generated/autoconf.h: $(KCONFIG_CONFIG)
> + %/config/auto.conf %/config/auto.conf.cmd %/generated/autoconf.h %/generated/rustc_cfg: $(KCONFIG_CONFIG)
> - +$(call cmd,syncconfig)
> + $(Q)$(kecho) " SYNC $@"
> + $(Q)$(MAKE) -f $(srctree)/Makefile syncconfig
> else # !may-sync-config
> # External modules and some install targets need include/generated/autoconf.h
> # and include/config/auto.conf but do not care if they are up-to-date.
> @@@ -848,8 -926,13 +939,13 @@@ els
> DEBUG_CFLAGS += -g
> endif
>
> -ifneq ($(LLVM_IAS),1)
> +ifndef CONFIG_AS_IS_LLVM
> KBUILD_AFLAGS += -Wa,-gdwarf-2
> + ifdef CONFIG_DEBUG_INFO_REDUCED
> + DEBUG_RUSTFLAGS += -Cdebuginfo=1
> + else
> + DEBUG_RUSTFLAGS += -Cdebuginfo=2
> + endif
> endif
>
> ifndef CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT
> @@@ -1201,9 -1327,12 +1305,12 @@@ archprepare: outputmakefile archheader
> prepare0: archprepare
> $(Q)$(MAKE) $(build)=scripts/mod
> $(Q)$(MAKE) $(build)=.
> + ifdef CONFIG_RUST
> + $(Q)$(MAKE) $(build)=rust
> + endif
>
> # All the preparing..
> -prepare: prepare0 prepare-objtool prepare-resolve_btfids
> +prepare: prepare0
>
> PHONY += remove-stale-files
> remove-stale-files:



--
Thanks,
~Nick Desaulniers