diff mbox series

[v2,1/3] kbuild: rust: Define probing macros for rustc

Message ID 20240812232910.2026387-2-mmaurer@google.com (mailing list archive)
State New
Headers show
Series [v2,1/3] kbuild: rust: Define probing macros for rustc | expand

Commit Message

Matthew Maurer Aug. 12, 2024, 11:29 p.m. UTC
Creates flag probe macro variants for `rustc`. These are helpful
because:

1. `rustc` support will soon be a minimum rather than a pinned version.
2. We already support multiple LLVMs linked into `rustc`, and these are
   needed to probe what LLVM parameters `rustc` will accept.

Signed-off-by: Matthew Maurer <mmaurer@google.com>
---
 scripts/Kconfig.include   |  8 ++++++++
 scripts/Makefile.compiler | 15 +++++++++++++++
 2 files changed, 23 insertions(+)

Comments

Miguel Ojeda Aug. 14, 2024, 11:27 a.m. UTC | #1
On Tue, Aug 13, 2024 at 1:29 AM Matthew Maurer <mmaurer@google.com> wrote:
>
> 1. `rustc` support will soon be a minimum rather than a pinned version.

In the meantime, this happened, so we should update this sentence.

> 2. We already support multiple LLVMs linked into `rustc`, and these are

I guess you mean `rustc` is able to use multiple major versions of
LLVM -- or what do you mean by "multiple LLVMs linked"?

> +# $(rustc-option,<flag>)
> +# Return y if the Rust compiler supports <flag>, n otherwise
> +# Calls to this should be guarded so that they are not evaluated if
> +# CONFIG_HAVE_RUST is not set.

Hmm... why `HAVE_RUST`? Should that be `RUST_IS_AVAILABLE`? Or what is
the intention? Perhaps a comment would help here -- e.g. something
like the comment I used in the original approach [1]. Otherwise we
will forget... :)

Also, I guess you wanted to relax the precondition as much as
possible, which is great, just to double check, do we expect a case
outside `RUST=y`?

> rustc-option = $(success,trap "rm -rf .tmp_$$" EXIT; mkdir .tmp_$$; $(RUSTC) $(1) --crate-type=rlib /dev/null -o .tmp_$$/tmp.rlib)

I also had `out-dir` [1] since, if I remember correctly, `rustc` may
create temporary files in a potentially read-only location even in
this case.

Also, should we do `-Dwarnings` here?

> +# If you are testing for unstable features, consider `rustc-min-version`
> +# instead, as features may have different completeness while available.

`rustc-min-version` is not mainline yet -- we don't have a user yet,
but I can send it if so.

Thanks!

[1] https://github.com/Rust-for-Linux/linux/pull/1087#issuecomment-2218445303

Cheers,
Miguel
Miguel Ojeda Aug. 14, 2024, 11:30 a.m. UTC | #2
On Wed, Aug 14, 2024 at 1:27 PM Miguel Ojeda
<miguel.ojeda.sandonis@gmail.com> wrote:
>
> I also had `out-dir` [1] since, if I remember correctly, `rustc` may
> create temporary files in a potentially read-only location even in
> this case.

Ah, wait, you are avoiding `try-run` -- is it because of that? I think
we should try to reuse it, even if we have to add the `TMPOUT`. Or
what is the reason for not reusing it?

Cheers,
Miguel
diff mbox series

Patch

diff --git a/scripts/Kconfig.include b/scripts/Kconfig.include
index 3500a3d62f0d..becad3d0b1fd 100644
--- a/scripts/Kconfig.include
+++ b/scripts/Kconfig.include
@@ -64,3 +64,11 @@  ld-version := $(shell,set -- $(ld-info) && echo $2)
 cc-option-bit = $(if-success,$(CC) -Werror $(1) -E -x c /dev/null -o /dev/null,$(1))
 m32-flag := $(cc-option-bit,-m32)
 m64-flag := $(cc-option-bit,-m64)
+
+# $(rustc-option,<flag>)
+# Return y if the Rust compiler supports <flag>, n otherwise
+# Calls to this should be guarded so that they are not evaluated if
+# CONFIG_HAVE_RUST is not set.
+# If you are testing for unstable features, consider `rustc-min-version`
+# instead, as features may have different completeness while available.
+rustc-option = $(success,trap "rm -rf .tmp_$$" EXIT; mkdir .tmp_$$; $(RUSTC) $(1) --crate-type=rlib /dev/null -o .tmp_$$/tmp.rlib)
diff --git a/scripts/Makefile.compiler b/scripts/Makefile.compiler
index 92be0c9a13ee..485d66768a32 100644
--- a/scripts/Makefile.compiler
+++ b/scripts/Makefile.compiler
@@ -72,3 +72,18 @@  clang-min-version = $(call test-ge, $(CONFIG_CLANG_VERSION), $1)
 # ld-option
 # Usage: KBUILD_LDFLAGS += $(call ld-option, -X, -Y)
 ld-option = $(call try-run, $(LD) $(KBUILD_LDFLAGS) $(1) -v,$(1),$(2),$(3))
+
+# __rustc-option
+# Usage: MY_RUSTFLAGS += $(call __rustc-option,$(RUSTC),$(MY_RUSTFLAGS),-Cinstrument-coverage,-Zinstrument-coverage)
+__rustc-option = $(call try-run,\
+	$(1) $(2) $(3) --crate-type=rlib /dev/null -o "$$TMP",$(3),$(4))
+
+# rustc-option
+# Usage: rustflags-y += $(call rustc-option,-Cinstrument-coverage,-Zinstrument-coverage)
+rustc-option = $(call __rustc-option, $(RUSTC),\
+	$(KBUILD_RUSTFLAGS),$(1),$(2))
+
+# rustc-option-yn
+# Usage: flag := $(call rustc-option-yn,-Cinstrument-coverage)
+rustc-option-yn = $(call try-run,\
+	$(RUSTC) $(KBUILD_RUSTFLAGS) $(1) --crate-type=rlib /dev/null -o "$$TMP",y,n)