Re: [PATCH v2 1/3] rust: Introduce HAVE_GENERATE_RUST_TARGET config option

From: Gary Guo
Date: Mon Sep 09 2024 - 11:29:09 EST


On Thu, 05 Sep 2024 14:33:05 +0100
Jiaxun Yang <jiaxun.yang@xxxxxxxxxxx> wrote:

> scripts/generate_rust_target.rs is used by several architectures
> to generate target.json target spec file.
>
> However the enablement of this feature was controlled by target
> specific Makefile pieces spreading everywhere.
>
> Introduce HAVE_GENERATE_RUST_TARGET config option as a centralized
> switch to control the per-arch usage of generate_rust_target.rs.
>
> Signed-off-by: Jiaxun Yang <jiaxun.yang@xxxxxxxxxxx>
> ---
> v2:
> - Reword Kconfig help
> - Remove x86 specific condition for UM
> ---
> Makefile | 3 +++
> arch/Kconfig | 8 ++++++++
> arch/um/Kconfig | 1 +
> arch/x86/Makefile | 1 -
> arch/x86/Makefile.um | 1 -
> rust/Makefile | 2 +-
> scripts/Makefile | 4 +---
> 7 files changed, 14 insertions(+), 6 deletions(-)
>
> diff --git a/Makefile b/Makefile
> index 2c1db7a6f793..b183855c34ea 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -807,6 +807,9 @@ KBUILD_CFLAGS += -Os
> KBUILD_RUSTFLAGS += -Copt-level=s
> endif
>
> +ifdef CONFIG_HAVE_GENERATE_RUST_TARGET
> +KBUILD_RUSTFLAGS += --target=$(objtree)/scripts/target.json
> +endif
> # Always set `debug-assertions` and `overflow-checks` because their default
> # depends on `opt-level` and `debug-assertions`, respectively.
> KBUILD_RUSTFLAGS += -Cdebug-assertions=$(if $(CONFIG_RUST_DEBUG_ASSERTIONS),y,n)
> diff --git a/arch/Kconfig b/arch/Kconfig
> index 4e2eaba9e305..0865ff4796e7 100644
> --- a/arch/Kconfig
> +++ b/arch/Kconfig
> @@ -377,6 +377,14 @@ config HAVE_RUST
> This symbol should be selected by an architecture if it
> supports Rust.
>
> +config HAVE_GENERATE_RUST_TARGET
> + bool
> + depends on HAVE_RUST
> + help
> + This symbol should be selected by an architecture if it
> + needs generating Rust target.json file with
> + scripts/generate_rust_target.rs.
> +
> config HAVE_FUNCTION_ARG_ACCESS_API
> bool
> help
> diff --git a/arch/um/Kconfig b/arch/um/Kconfig
> index dca84fd6d00a..6b1c8ae2422d 100644
> --- a/arch/um/Kconfig
> +++ b/arch/um/Kconfig
> @@ -32,6 +32,7 @@ config UML
> select TTY # Needed for line.c
> select HAVE_ARCH_VMAP_STACK
> select HAVE_RUST
> + select HAVE_GENERATE_RUST_TARGET
> select ARCH_HAS_UBSAN
>
> config MMU
> diff --git a/arch/x86/Makefile b/arch/x86/Makefile
> index a1883a30a5d8..cbd707f88a63 100644
> --- a/arch/x86/Makefile
> +++ b/arch/x86/Makefile
> @@ -75,7 +75,6 @@ export BITS
> # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53383
> #
> KBUILD_CFLAGS += -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -mno-avx
> -KBUILD_RUSTFLAGS += --target=$(objtree)/scripts/target.json
> KBUILD_RUSTFLAGS += -Ctarget-feature=-sse,-sse2,-sse3,-ssse3,-sse4.1,-sse4.2,-avx,-avx2
>
> #
> diff --git a/arch/x86/Makefile.um b/arch/x86/Makefile.um
> index a46b1397ad01..2106a2bd152b 100644
> --- a/arch/x86/Makefile.um
> +++ b/arch/x86/Makefile.um
> @@ -9,7 +9,6 @@ core-y += arch/x86/crypto/
> #
> ifeq ($(CONFIG_CC_IS_CLANG),y)
> KBUILD_CFLAGS += -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -mno-avx
> -KBUILD_RUSTFLAGS += --target=$(objtree)/scripts/target.json
> KBUILD_RUSTFLAGS += -Ctarget-feature=-sse,-sse2,-sse3,-ssse3,-sse4.1,-sse4.2,-avx,-avx2
> endif
>
> diff --git a/rust/Makefile b/rust/Makefile
> index 99204e33f1dd..fe3640b98011 100644
> --- a/rust/Makefile
> +++ b/rust/Makefile
> @@ -378,7 +378,7 @@ $(obj)/core.o: private rustc_objcopy = $(foreach sym,$(redirect-intrinsics),--re
> $(obj)/core.o: private rustc_target_flags = $(core-cfgs)
> $(obj)/core.o: $(RUST_LIB_SRC)/core/src/lib.rs FORCE
> +$(call if_changed_rule,rustc_library)
> -ifneq ($(or $(CONFIG_X86_64),$(CONFIG_X86_32)),)
> +ifdef CONFIG_HAVE_GENERATE_RUST_TARGET
> $(obj)/core.o: scripts/target.json
> endif
>
> diff --git a/scripts/Makefile b/scripts/Makefile
> index dccef663ca82..33258a856a1a 100644
> --- a/scripts/Makefile
> +++ b/scripts/Makefile
> @@ -12,13 +12,11 @@ hostprogs-always-$(CONFIG_SYSTEM_EXTRA_CERTIFICATE) += insert-sys-cert
> hostprogs-always-$(CONFIG_RUST_KERNEL_DOCTESTS) += rustdoc_test_builder
> hostprogs-always-$(CONFIG_RUST_KERNEL_DOCTESTS) += rustdoc_test_gen
>
> -ifneq ($(or $(CONFIG_X86_64),$(CONFIG_X86_32)),)
> -always-$(CONFIG_RUST) += target.json
> +always-$(CONFIG_HAVE_GENERATE_RUST_TARGET) += target.json
> filechk_rust_target = $< < include/config/auto.conf
>
> $(obj)/target.json: scripts/generate_rust_target include/config/auto.conf FORCE
> $(call filechk,rust_target)
> -endif

Wouldn't this change cause target.json to be built when
CONFIG_HAVE_GENERATE_RUST_TARGET is selected by arch but CONFIG_RUST is
disabled?

Best,
Gary

>
> hostprogs += generate_rust_target
> generate_rust_target-rust := y
>