mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH v1] tools build: Fix rust cross compilation
@ 2026-02-12 18:57 Dmitrii Dolgov
  2026-02-12 19:13 ` Miguel Ojeda
  0 siblings, 1 reply; 6+ messages in thread
From: Dmitrii Dolgov @ 2026-02-12 18:57 UTC (permalink / raw)
  To: linux-perf-users, Ian Rogers, Arnaldo Carvalho de Melo
  Cc: Namhyung Kim, Miguel Ojeda, Linux Kernel Mailing List, Dmitrii Dolgov

Currently no target is specified to compile rust code when needed, which
breaks cross compilation. Detect required target and pass it via
rust_flags to the compiler.

Note that CROSS_COMPILE might be different from what rust compiler
expects, since it may omit the target vendor value, e.g.
"aarch64-linux-gnu" instead of "aarch64-unknown-linux-gnu". Thus provide
an explicit RUST_TARGET_ARCH, and if not specified, try to match
the CROSS_COMPILE value.

Tested using arm64 cross-compilation example from [1].

[1]: https://perfwiki.github.io/main/arm64-cross-compilation-dockerfile/

Signed-off-by: Dmitrii Dolgov <9erthalion6@gmail.com>
---
 tools/build/Build.include  |  9 +++++++++
 tools/perf/Makefile.config | 18 ++++++++++++++++++
 tools/perf/Makefile.perf   |  4 +++-
 3 files changed, 30 insertions(+), 1 deletion(-)

diff --git a/tools/build/Build.include b/tools/build/Build.include
index e45b2eb0d24..cd0baa7a168 100644
--- a/tools/build/Build.include
+++ b/tools/build/Build.include
@@ -98,6 +98,15 @@ c_flags_2 = $(filter-out $(CFLAGS_REMOVE_$(basetarget).o), $(c_flags_1))
 c_flags   = $(filter-out $(CFLAGS_REMOVE_$(obj)), $(c_flags_2))
 cxx_flags = -Wp,-MD,$(depfile) -Wp,-MT,$@ $(CXXFLAGS) -D"BUILD_STR(s)=\#s" $(CXXFLAGS_$(basetarget).o) $(CXXFLAGS_$(obj))
 
+###
+# Rust flags to be used on rule definition, includes:
+# - global $(RUST_FLAGS)
+# - per target Rust flags
+# - per object Rust flags
+rust_flags_1 = $(RUST_FLAGS) $(RUST_FLAGS_$(basetarget).o) $(RUST_FLAGS_$(obj))
+rust_flags_2 = $(filter-out $(RUST_FLAGS_REMOVE_$(basetarget).o), $(rust_flags_1))
+rust_flags   = $(filter-out $(RUST_FLAGS_REMOVE_$(obj)), $(rust_flags_2))
+
 ###
 ## HOSTCC C flags
 
diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
index a8dc72cfe48..9b164b442da 100644
--- a/tools/perf/Makefile.config
+++ b/tools/perf/Makefile.config
@@ -1163,6 +1163,24 @@ ifndef NO_RUST
     CFLAGS += -DHAVE_RUST_SUPPORT
     $(call detected,CONFIG_RUST_SUPPORT)
   endif
+
+  ifneq ($(CROSS_COMPILE),)
+    ifneq ($(RUST_TARGET_ARCH),)
+      RUST_FLAGS += --target=$(RUST_TARGET_ARCH)
+    else
+      # CROSS_COMPILE specifies the target triple, which may not match what
+      # Rust expects, e.g. it can omit the target vendor if C toolchain is
+      # used. For example the value can be aarch64-linux-gnu, where Rust uses
+      # aarch64-unknown-linux-gnu. Try to match that and insert an "unknown"
+      # vendor if omitted.
+      TRIPLE := $(subst -, ,$(CROSS_COMPILE:%-=%))
+      ifeq ($(words $(TRIPLE)),3)
+        RUST_FLAGS += --target=$(word 1,$(TRIPLE))-unknown-$(word 2,$(TRIPLE))-$(word 3,$(TRIPLE))
+      else
+        RUST_FLAGS += --target=$(CROSS_COMPILE:%-=%)
+      endif
+    endif
+  endif
 endif
 
 # Among the variables below, these:
diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf
index a6d8ca3e923..621800e1716 100644
--- a/tools/perf/Makefile.perf
+++ b/tools/perf/Makefile.perf
@@ -17,6 +17,8 @@ include ../scripts/utilities.mak
 #
 # Define CROSS_COMPILE as prefix name of compiler if you want cross-builds.
 #
+# Define RUST_TARGET_ARCH as rust target arch if you want cross-builds.
+#
 # Define LIBPERL to enable perl script extension.
 #
 # Define NO_LIBPYTHON to disable python script extension.
@@ -271,7 +273,7 @@ ifeq ($(PYLINT),1)
   PYLINT := $(shell which pylint 2> /dev/null)
 endif
 
-export srctree OUTPUT RM CC CXX RUSTC LD AR CFLAGS CXXFLAGS V BISON FLEX AWK
+export srctree OUTPUT RM CC CXX RUSTC LD AR CFLAGS CXXFLAGS RUST_FLAGS V BISON FLEX AWK
 export HOSTCC HOSTLD HOSTAR HOSTCFLAGS SHELLCHECK MYPY PYLINT
 
 include $(srctree)/tools/build/Makefile.include

base-commit: 5d1ab659fb93eed85d6d8b2937013360157032f4
-- 
2.52.0


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v1] tools build: Fix rust cross compilation
  2026-02-12 18:57 [PATCH v1] tools build: Fix rust cross compilation Dmitrii Dolgov
@ 2026-02-12 19:13 ` Miguel Ojeda
  2026-02-12 19:18   ` Dmitry Dolgov
  0 siblings, 1 reply; 6+ messages in thread
From: Miguel Ojeda @ 2026-02-12 19:13 UTC (permalink / raw)
  To: Dmitrii Dolgov
  Cc: linux-perf-users, Ian Rogers, Arnaldo Carvalho de Melo,
	Namhyung Kim, Miguel Ojeda, Linux Kernel Mailing List,
	Linux Kbuild mailing list, Nathan Chancellor, Nicolas Schier,
	rust-for-linux

On Thu, Feb 12, 2026 at 7:58 PM Dmitrii Dolgov <9erthalion6@gmail.com> wrote:
>
> Note that CROSS_COMPILE might be different from what rust compiler
> expects, since it may omit the target vendor value, e.g.
> "aarch64-linux-gnu" instead of "aarch64-unknown-linux-gnu". Thus provide
> an explicit RUST_TARGET_ARCH, and if not specified, try to match
> the CROSS_COMPILE value.

I would suggest explicitly doing the mapping automatically, rather
than guessing or requesting users to provide one more variable, like
we do for the non-tools side.

Perhaps using a "table" like we do for LLVM and `bindgen` -- see for
instance `scripts/Makefile.clang`.

Cc'ing Kbuild and rust-for-linux.

Cheers,
Miguel

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v1] tools build: Fix rust cross compilation
  2026-02-12 19:13 ` Miguel Ojeda
@ 2026-02-12 19:18   ` Dmitry Dolgov
  0 siblings, 0 replies; 6+ messages in thread
From: Dmitry Dolgov @ 2026-02-12 19:18 UTC (permalink / raw)
  To: Miguel Ojeda
  Cc: linux-perf-users, Ian Rogers, Arnaldo Carvalho de Melo,
	Namhyung Kim, Miguel Ojeda, Linux Kernel Mailing List,
	Linux Kbuild mailing list, Nathan Chancellor, Nicolas Schier,
	rust-for-linux

> On Thu, Feb 12, 2026 at 08:13:25PM +0100, Miguel Ojeda wrote:
> On Thu, Feb 12, 2026 at 7:58 PM Dmitrii Dolgov <9erthalion6@gmail.com> wrote:
> >
> > Note that CROSS_COMPILE might be different from what rust compiler
> > expects, since it may omit the target vendor value, e.g.
> > "aarch64-linux-gnu" instead of "aarch64-unknown-linux-gnu". Thus provide
> > an explicit RUST_TARGET_ARCH, and if not specified, try to match
> > the CROSS_COMPILE value.
> 
> I would suggest explicitly doing the mapping automatically, rather
> than guessing or requesting users to provide one more variable, like
> we do for the non-tools side.
> 
> Perhaps using a "table" like we do for LLVM and `bindgen` -- see for
> instance `scripts/Makefile.clang`.

Thanks, will try this out.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v1] tools build: Fix rust cross compilation
  2026-02-16 20:41 ` Miguel Ojeda
@ 2026-02-17  8:22   ` Dmitry Dolgov
  0 siblings, 0 replies; 6+ messages in thread
From: Dmitry Dolgov @ 2026-02-17  8:22 UTC (permalink / raw)
  To: Miguel Ojeda
  Cc: linux-perf-users, Ian Rogers, Arnaldo Carvalho de Melo,
	Miguel Ojeda, Namhyung Kim, Linux Kernel Mailing List,
	Linux Kbuild mailing list, rust-for-linux, Nathan Chancellor,
	Nicolas Schier

> On Mon, Feb 16, 2026 at 09:41:34PM +0100, Miguel Ojeda wrote:
> I think this was meant to v2.

Yep, I forgot to change the version (it was a bad idea to send it out
Friday evenig).

> By the way, should this have a Fixes: tag? i.e. since it sounds like
> this fixes an issue. Perhaps to 6a32fa5ccd33 ("tools build: Add a
> feature test for rust compiler"), or something else? I also usually
> recommend showing the error message in the commit message.

Right, I can add an example what happens.

> (Also, you can use "Link: ... [1]" for the link.)

Got it, thanks!

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v1] tools build: Fix rust cross compilation
  2026-02-13 19:12 Dmitrii Dolgov
@ 2026-02-16 20:41 ` Miguel Ojeda
  2026-02-17  8:22   ` Dmitry Dolgov
  0 siblings, 1 reply; 6+ messages in thread
From: Miguel Ojeda @ 2026-02-16 20:41 UTC (permalink / raw)
  To: Dmitrii Dolgov
  Cc: linux-perf-users, Ian Rogers, Arnaldo Carvalho de Melo,
	Miguel Ojeda, Namhyung Kim, Linux Kernel Mailing List,
	Linux Kbuild mailing list, rust-for-linux, Nathan Chancellor,
	Nicolas Schier

On Fri, Feb 13, 2026 at 8:12 PM Dmitrii Dolgov <9erthalion6@gmail.com> wrote:
>
> Currently no target is specified to compile rust code when needed, which
> breaks cross compilation. Detect required target and pass it via
> rust_flags to the compiler.
>
> Note that CROSS_COMPILE might be different from what rust compiler
> expects, since it may omit the target vendor value, e.g.
> "aarch64-linux-gnu" instead of "aarch64-unknown-linux-gnu". Thus
> explicitly map supported CROSS_COMPILE values to corresponding Rust
> versions, as suggested by Miguel Ojeda.
>
> Tested using arm64 cross-compilation example from [1].
>
> [1]: https://perfwiki.github.io/main/arm64-cross-compilation-dockerfile/
>
> Signed-off-by: Dmitrii Dolgov <9erthalion6@gmail.com>

I think this was meant to v2.

By the way, should this have a Fixes: tag? i.e. since it sounds like
this fixes an issue. Perhaps to 6a32fa5ccd33 ("tools build: Add a
feature test for rust compiler"), or something else? I also usually
recommend showing the error message in the commit message.

(Also, you can use "Link: ... [1]" for the link.)

Cc'ing Kbuild maintainers too.

I hope that helps!

Cheers,
Miguel

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH v1] tools build: Fix rust cross compilation
@ 2026-02-13 19:12 Dmitrii Dolgov
  2026-02-16 20:41 ` Miguel Ojeda
  0 siblings, 1 reply; 6+ messages in thread
From: Dmitrii Dolgov @ 2026-02-13 19:12 UTC (permalink / raw)
  To: linux-perf-users, Ian Rogers, Arnaldo Carvalho de Melo, Miguel Ojeda
  Cc: Namhyung Kim, Linux Kernel Mailing List,
	Linux Kbuild mailing list, rust-for-linux, Dmitrii Dolgov

Currently no target is specified to compile rust code when needed, which
breaks cross compilation. Detect required target and pass it via
rust_flags to the compiler.

Note that CROSS_COMPILE might be different from what rust compiler
expects, since it may omit the target vendor value, e.g.
"aarch64-linux-gnu" instead of "aarch64-unknown-linux-gnu". Thus
explicitly map supported CROSS_COMPILE values to corresponding Rust
versions, as suggested by Miguel Ojeda.

Tested using arm64 cross-compilation example from [1].

[1]: https://perfwiki.github.io/main/arm64-cross-compilation-dockerfile/

Signed-off-by: Dmitrii Dolgov <9erthalion6@gmail.com>
---
 tools/build/Build.include  |  9 +++++++++
 tools/perf/Makefile.config | 14 ++++++++++++++
 tools/perf/Makefile.perf   |  2 +-
 3 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/tools/build/Build.include b/tools/build/Build.include
index e45b2eb0d24..cd0baa7a168 100644
--- a/tools/build/Build.include
+++ b/tools/build/Build.include
@@ -98,6 +98,15 @@ c_flags_2 = $(filter-out $(CFLAGS_REMOVE_$(basetarget).o), $(c_flags_1))
 c_flags   = $(filter-out $(CFLAGS_REMOVE_$(obj)), $(c_flags_2))
 cxx_flags = -Wp,-MD,$(depfile) -Wp,-MT,$@ $(CXXFLAGS) -D"BUILD_STR(s)=\#s" $(CXXFLAGS_$(basetarget).o) $(CXXFLAGS_$(obj))
 
+###
+# Rust flags to be used on rule definition, includes:
+# - global $(RUST_FLAGS)
+# - per target Rust flags
+# - per object Rust flags
+rust_flags_1 = $(RUST_FLAGS) $(RUST_FLAGS_$(basetarget).o) $(RUST_FLAGS_$(obj))
+rust_flags_2 = $(filter-out $(RUST_FLAGS_REMOVE_$(basetarget).o), $(rust_flags_1))
+rust_flags   = $(filter-out $(RUST_FLAGS_REMOVE_$(obj)), $(rust_flags_2))
+
 ###
 ## HOSTCC C flags
 
diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
index a8dc72cfe48..f40c5a70520 100644
--- a/tools/perf/Makefile.config
+++ b/tools/perf/Makefile.config
@@ -1163,6 +1163,20 @@ ifndef NO_RUST
     CFLAGS += -DHAVE_RUST_SUPPORT
     $(call detected,CONFIG_RUST_SUPPORT)
   endif
+
+  ifneq ($(CROSS_COMPILE),)
+    RUST_TARGET_FLAGS_arm	:= arm-unknown-linux-gnueabi
+    RUST_TARGET_FLAGS_arm64	:= aarch64-unknown-linux-gnu
+    RUST_TARGET_FLAGS_m68k	:= m68k-unknown-linux-gnu
+    RUST_TARGET_FLAGS_mips	:= mipsel-unknown-linux-gnu
+    RUST_TARGET_FLAGS_powerpc	:= powerpc64le-unknown-linux-gnu
+    RUST_TARGET_FLAGS_riscv	:= riscv64-unknown-linux-gnu
+    RUST_TARGET_FLAGS_s390	:= s390x-unknown-linux-gnu
+    RUST_TARGET_FLAGS_x86	:= x86_64-unknown-linux-gnu
+    RUST_TARGET_FLAGS_x86_64	:= x86_64-unknown-linux-gnu
+
+    RUST_FLAGS += --target=$(RUST_TARGET_FLAGS_$(ARCH))
+  endif
 endif
 
 # Among the variables below, these:
diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf
index a6d8ca3e923..f3919838243 100644
--- a/tools/perf/Makefile.perf
+++ b/tools/perf/Makefile.perf
@@ -271,7 +271,7 @@ ifeq ($(PYLINT),1)
   PYLINT := $(shell which pylint 2> /dev/null)
 endif
 
-export srctree OUTPUT RM CC CXX RUSTC LD AR CFLAGS CXXFLAGS V BISON FLEX AWK
+export srctree OUTPUT RM CC CXX RUSTC LD AR CFLAGS CXXFLAGS RUST_FLAGS V BISON FLEX AWK
 export HOSTCC HOSTLD HOSTAR HOSTCFLAGS SHELLCHECK MYPY PYLINT
 
 include $(srctree)/tools/build/Makefile.include

base-commit: 5d1ab659fb93eed85d6d8b2937013360157032f4
-- 
2.52.0


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2026-02-17  8:22 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-02-12 18:57 [PATCH v1] tools build: Fix rust cross compilation Dmitrii Dolgov
2026-02-12 19:13 ` Miguel Ojeda
2026-02-12 19:18   ` Dmitry Dolgov
2026-02-13 19:12 Dmitrii Dolgov
2026-02-16 20:41 ` Miguel Ojeda
2026-02-17  8:22   ` Dmitry Dolgov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®