All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Onur Özkan" <work@onurozkan.dev>
To: rust-for-linux@vger.kernel.org
Cc: ojeda@kernel.org, nathan@kernel.org, nicolas.schier@linux.dev,
	masahiroy@kernel.org, aliceryhl@google.com,
	thomas.weissschuh@linutronix.de, tamird@gmail.com,
	linux-kbuild@vger.kernel.org, linux-kernel@vger.kernel.org,
	alex.gaynor@gmail.com, boqun.feng@gmail.com, gary@garyguo.net,
	bjorn3_gh@protonmail.com, lossin@kernel.org,
	a.hindborg@kernel.org, tmgross@umich.edu, dakr@kernel.org,
	"Onur Özkan" <work@onurozkan.dev>
Subject: [PATCH] rust: add `rustcheck` make target for check-only builds
Date: Sat, 13 Sep 2025 13:08:47 +0300	[thread overview]
Message-ID: <20250913100847.9234-1-work@onurozkan.dev> (raw)

Adds a new `rustcheck` make target to run a check-only build
similar to `cargo check`. This allows us to verify that the Rust
sources can build without building/linking final artifacts,
which speeds up the iteration (a lot) during development.

The target supports the same flags as other Rust build rules, so
it can also be used with `CLIPPY=1` (e.g., `make LLVM=1 rustcheck
CLIPPY=1) to run Clippy in a faster way.

Also, unlike `make LLVM=1`, it doesn't compile large amounts of C
code (on a fresh checkout) when the goal is only to check that
Rust builds are not broken after some changes.

Suggested-by: Benno Losin <lossin@kernel.org>
Link: https://rust-for-linux.zulipchat.com/#narrow/channel/288089/topic/x/near/539103602
Signed-off-by: Onur Özkan <work@onurozkan.dev>
---
 Makefile      |  7 +++++
 rust/Makefile | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 80 insertions(+)

diff --git a/Makefile b/Makefile
index cf37b9407821..7812cdc72938 100644
--- a/Makefile
+++ b/Makefile
@@ -1716,6 +1716,8 @@ help:
 	@echo  '		    is formatted, printing a diff otherwise.'
 	@echo  '  rustdoc	  - Generate Rust documentation'
 	@echo  '		    (requires kernel .config)'
+	@echo  '  rustcheck       - Check that the Rust code builds'
+	@echo  '                    (requires kernel .config)'
 	@echo  '  rusttest        - Runs the Rust tests'
 	@echo  '                    (requires kernel .config; downloads external repos)'
 	@echo  '  rust-analyzer	  - Generate rust-project.json rust-analyzer support file'
@@ -1821,6 +1823,11 @@ PHONY += rustdoc
 rustdoc: prepare
 	$(Q)$(MAKE) $(build)=rust $@
 
+# Checking Rust sources.
+PHONY += rustcheck
+rustcheck: prepare0
+	$(Q)$(MAKE) $(build)=rust $@
+
 # Testing target
 PHONY += rusttest
 rusttest: prepare
diff --git a/rust/Makefile b/rust/Makefile
index bfa915b0e588..c148ef4a8c08 100644
--- a/rust/Makefile
+++ b/rust/Makefile
@@ -265,6 +265,79 @@ rusttest-kernel: $(src)/kernel/lib.rs rusttestlib-ffi rusttestlib-kernel \
     rusttestlib-uapi rusttestlib-pin_init FORCE
 	+$(call if_changed,rustc_test)
 
+## Check-only compilation (similar to `cargo check`)
+quiet_cmd_rustc_check_library = $(RUSTC_OR_CLIPPY_QUIET) CHECK $<
+      cmd_rustc_check_library = \
+        OBJTREE=$(abspath $(objtree)) \
+        $(RUSTC_OR_CLIPPY) $(rust_common_flags) \
+                @$(objtree)/include/generated/rustc_cfg $(rustc_target_flags) \
+                --crate-type $(if $(rustc_check_library_proc),proc-macro,rlib) \
+                $(if $(rustc_check_library_proc),,--emit=metadata) \
+                --out-dir $(objtree)/$(obj)/check -L$(objtree)/$(obj)/check \
+                --crate-name $(if $(rustc_check_crate_name),$(rustc_check_crate_name), \
+				$(subst rustcheck-,,$(subst rustchecklib-,,$@))) $<
+
+rustcheck: rustchecklib-build_error rustchecklib-ffi rustchecklib-macros \
+	rustchecklib-compiler_builtins rustchecklib-pin_init_internal \
+	rustchecklib-pin_init rustchecklib-bindings rustchecklib-uapi \
+	rustchecklib-kernel
+
+rustchecklib-build_error: $(src)/build_error.rs FORCE
+	+$(call if_changed,rustc_check_library)
+
+rustchecklib-ffi: $(src)/ffi.rs FORCE
+	+$(call if_changed,rustc_check_library)
+
+rustchecklib-macros: private rustc_target_flags = --extern proc_macro
+rustchecklib-macros: private rustc_check_library_proc = yes
+rustchecklib-macros: $(src)/macros/lib.rs FORCE
+	+$(call if_changed,rustc_check_library)
+
+rustchecklib-compiler_builtins: private rustc_check_crate_name = compiler_builtins_kernel
+rustchecklib-compiler_builtins: $(src)/compiler_builtins.rs FORCE
+	+$(call if_changed,rustc_check_library)
+
+rustchecklib-pin_init_internal: private rustc_target_flags = --cfg kernel \
+	--extern proc_macro
+rustchecklib-pin_init_internal: private rustc_check_library_proc = yes
+rustchecklib-pin_init_internal: $(src)/pin-init/internal/src/lib.rs FORCE
+	+$(call if_changed,rustc_check_library)
+
+rustchecklib-pin_init: private rustc_target_flags = --extern pin_init_internal \
+	--extern macros --cfg kernel
+rustchecklib-pin_init: $(src)/pin-init/src/lib.rs rustchecklib-macros \
+	rustchecklib-pin_init_internal FORCE
+	+$(call if_changed,rustc_check_library)
+
+rustchecklib-bindings: private rustc_target_flags = --extern ffi
+rustchecklib-bindings: $(src)/bindings/lib.rs \
+    $(obj)/bindings/bindings_generated.rs \
+    $(obj)/bindings/bindings_helpers_generated.rs \
+    rustchecklib-ffi FORCE
+	+$(call if_changed,rustc_check_library)
+
+rustchecklib-uapi: private rustc_target_flags = --extern ffi
+rustchecklib-uapi: $(src)/uapi/lib.rs $(obj)/uapi/uapi_generated.rs \
+    rustchecklib-ffi FORCE
+	+$(call if_changed,rustc_check_library)
+
+ifdef CONFIG_JUMP_LABEL
+rustchecklib-kernel: $(obj)/kernel/generated_arch_static_branch_asm.rs FORCE
+endif
+ifndef CONFIG_UML
+ifdef CONFIG_BUG
+rustchecklib-kernel: $(obj)/kernel/generated_arch_warn_asm.rs \
+	$(obj)/kernel/generated_arch_reachable_asm.rs FORCE
+endif
+endif
+
+rustchecklib-kernel: private rustc_target_flags = --extern ffi --extern pin_init \
+	--extern build_error --extern macros --extern bindings --extern uapi
+rustchecklib-kernel: $(src)/kernel/lib.rs rustchecklib-ffi rustchecklib-pin_init \
+	rustchecklib-build_error rustchecklib-macros rustchecklib-bindings \
+	rustchecklib-uapi FORCE
+	+$(call if_changed,rustc_check_library)
+
 ifdef CONFIG_CC_IS_CLANG
 bindgen_c_flags = $(c_flags)
 else
-- 
2.51.0


             reply	other threads:[~2025-09-13 10:15 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <-ebVaoKp9tTjZGmdSRi8rrH1o7SgmGyyzk-g2ALSCBKPJP44z7dSPCplhwKt-sibwLwqP7IPEml6qCkSpJhd8g==@protonmail.internalid>
2025-09-13 10:08 ` Onur Özkan [this message]
2025-09-13 10:21   ` [PATCH] rust: add `rustcheck` make target for check-only builds Onur
2025-09-13 17:46   ` Andreas Hindborg
2025-09-13 19:03     ` Miguel Ojeda
2025-09-14 11:48       ` Andreas Hindborg
2025-09-15  7:32     ` Onur

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250913100847.9234-1-work@onurozkan.dev \
    --to=work@onurozkan.dev \
    --cc=a.hindborg@kernel.org \
    --cc=alex.gaynor@gmail.com \
    --cc=aliceryhl@google.com \
    --cc=bjorn3_gh@protonmail.com \
    --cc=boqun.feng@gmail.com \
    --cc=dakr@kernel.org \
    --cc=gary@garyguo.net \
    --cc=linux-kbuild@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lossin@kernel.org \
    --cc=masahiroy@kernel.org \
    --cc=nathan@kernel.org \
    --cc=nicolas.schier@linux.dev \
    --cc=ojeda@kernel.org \
    --cc=rust-for-linux@vger.kernel.org \
    --cc=tamird@gmail.com \
    --cc=thomas.weissschuh@linutronix.de \
    --cc=tmgross@umich.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.