Skip to content

Commit c44ec41

Browse files
ojedaBennoLossin
authored andcommitted
rust: Kbuild: enable proc-macro2, quote and syn
With all the new files in place from the new crates, this patch adds support for them in the build system so that the kernel's `macros` crate can use all their facilities. In particular, the `syn` crate is fully enabled, i.e. all its optional dependencies are enabled. Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
1 parent 5624bf1 commit c44ec41

3 files changed

Lines changed: 102 additions & 9 deletions

File tree

Makefile

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1734,8 +1734,14 @@ PHONY += rustfmt rustfmtcheck
17341734
rustfmt:
17351735
$(Q)find $(abs_srctree) -type f -name '*.rs' \
17361736
-o -path $(abs_srctree)/rust/alloc -prune \
1737+
-o -path $(abs_srctree)/rust/proc-macro2 -prune \
1738+
-o -path $(abs_srctree)/rust/quote -prune \
1739+
-o -path $(abs_srctree)/rust/syn -prune \
17371740
-o -path $(abs_objtree)/rust/test -prune \
17381741
| grep -Fv $(abs_srctree)/rust/alloc \
1742+
| grep -Fv $(abs_srctree)/rust/proc-macro2 \
1743+
| grep -Fv $(abs_srctree)/rust/quote \
1744+
| grep -Fv $(abs_srctree)/rust/syn \
17391745
| grep -Fv $(abs_objtree)/rust/test \
17401746
| grep -Fv generated \
17411747
| xargs $(RUSTFMT) $(rustfmt_flags)

rust/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# SPDX-License-Identifier: GPL-2.0
22

3+
*.rlib
34
bindings_generated.rs
45
bindings_helpers_generated.rs
56
doctests_kernel_generated.rs

rust/Makefile

Lines changed: 95 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ always-$(CONFIG_RUST) += exports_core_generated.h
1111
obj-$(CONFIG_RUST) += helpers.o
1212
CFLAGS_REMOVE_helpers.o = -Wmissing-prototypes -Wmissing-declarations
1313

14+
always-$(CONFIG_RUST) += libproc_macro2.rlib libquote.rlib libsyn.rlib
1415
always-$(CONFIG_RUST) += libmacros.so
1516
no-clean-files += libmacros.so
1617

@@ -71,11 +72,51 @@ alloc-cfgs = \
7172
--cfg no_sync \
7273
--cfg no_thin
7374

75+
proc_macro2-skip_flags := \
76+
-Drust_2018_idioms \
77+
-Dunreachable_pub
78+
79+
proc_macro2-flags := \
80+
-Amissing_docs \
81+
--cfg 'feature="proc-macro"' \
82+
--cfg wrap_proc_macro
83+
84+
quote-skip_flags := \
85+
--edition=2021 \
86+
-Drust_2018_idioms
87+
88+
quote-flags := \
89+
--edition=2018 \
90+
-Amissing_docs \
91+
--extern proc_macro2 \
92+
--cfg 'feature="proc-macro"'
93+
94+
syn-skip_flags := \
95+
-Drust_2018_idioms \
96+
-Dunreachable_pub
97+
98+
syn-flags := \
99+
-Amissing_docs \
100+
--extern proc_macro2 \
101+
--extern quote \
102+
--cfg 'feature="clone-impls"' \
103+
--cfg 'feature="derive"' \
104+
--cfg 'feature="extra-traits"' \
105+
--cfg 'feature="fold"' \
106+
--cfg 'feature="full"' \
107+
--cfg 'feature="parsing"' \
108+
--cfg 'feature="printing"' \
109+
--cfg 'feature="proc-macro"' \
110+
--cfg 'feature="quote"' \
111+
--cfg 'feature="visit"' \
112+
--cfg 'feature="visit-mut"'
113+
74114
quiet_cmd_rustdoc = RUSTDOC $(if $(rustdoc_host),H, ) $<
75115
cmd_rustdoc = \
76116
OBJTREE=$(abspath $(objtree)) \
77117
$(RUSTDOC) $(if $(rustdoc_host),$(rust_common_flags),$(rust_flags)) \
78118
$(rustc_target_flags) -L$(objtree)/$(obj) \
119+
--extern proc_macro2 --extern quote --extern syn \
79120
--output $(rustdoc_output) \
80121
--crate-name $(subst rustdoc-,,$@) \
81122
$(if $(rustdoc_host),,--sysroot=/dev/null) \
@@ -137,8 +178,9 @@ rustdoc-kernel: $(src)/kernel/lib.rs rustdoc-core rustdoc-macros \
137178
quiet_cmd_rustc_test_library = RUSTC TL $<
138179
cmd_rustc_test_library = \
139180
OBJTREE=$(abspath $(objtree)) \
140-
$(RUSTC) $(rust_common_flags) \
141-
@$(objtree)/include/generated/rustc_cfg $(rustc_target_flags) \
181+
$(RUSTC) \
182+
$(filter-out $(skip_flags),$(rust_common_flags) $(rustc_target_flags)) \
183+
@$(objtree)/include/generated/rustc_cfg \
142184
--crate-type $(if $(rustc_test_library_proc),proc-macro,rlib) \
143185
--out-dir $(objtree)/$(obj)/test --cfg testlib \
144186
--sysroot $(objtree)/$(obj)/test/sysroot \
@@ -148,9 +190,25 @@ quiet_cmd_rustc_test_library = RUSTC TL $<
148190
rusttestlib-build_error: $(src)/build_error.rs rusttest-prepare FORCE
149191
+$(call if_changed,rustc_test_library)
150192

151-
rusttestlib-macros: private rustc_target_flags = --extern proc_macro
193+
rusttestlib-proc_macro2: private skip_flags = $(proc_macro2-skip_flags)
194+
rusttestlib-proc_macro2: private rustc_target_flags = $(proc_macro2-flags)
195+
rusttestlib-proc_macro2: $(src)/proc-macro2/lib.rs rusttest-prepare FORCE
196+
+$(call if_changed,rustc_test_library)
197+
198+
rusttestlib-quote: private skip_flags = $(quote-skip_flags)
199+
rusttestlib-quote: private rustc_target_flags = $(quote-flags)
200+
rusttestlib-quote: $(src)/quote/lib.rs rusttestlib-proc_macro2 FORCE
201+
+$(call if_changed,rustc_test_library)
202+
203+
rusttestlib-syn: private skip_flags = $(syn-skip_flags)
204+
rusttestlib-syn: private rustc_target_flags = $(syn-flags)
205+
rusttestlib-syn: $(src)/syn/lib.rs rusttestlib-quote FORCE
206+
+$(call if_changed,rustc_test_library)
207+
208+
rusttestlib-macros: private rustc_target_flags = --extern proc_macro \
209+
--extern quote --extern syn
152210
rusttestlib-macros: private rustc_test_library_proc = yes
153-
rusttestlib-macros: $(src)/macros/lib.rs rusttest-prepare FORCE
211+
rusttestlib-macros: $(src)/macros/lib.rs rusttestlib-syn FORCE
154212
+$(call if_changed,rustc_test_library)
155213

156214
rusttestlib-bindings: $(src)/bindings/lib.rs rusttest-prepare FORCE
@@ -256,9 +314,10 @@ quiet_cmd_rustsysroot = RUSTSYSROOT
256314
rusttest-prepare: FORCE
257315
+$(call if_changed,rustsysroot)
258316

259-
rusttest-macros: private rustc_target_flags = --extern proc_macro
317+
rusttest-macros: private rustc_target_flags = --extern proc_macro \
318+
--extern quote --extern syn
260319
rusttest-macros: private rustdoc_test_target_flags = --crate-type proc-macro
261-
rusttest-macros: $(src)/macros/lib.rs rusttest-prepare FORCE
320+
rusttest-macros: $(src)/macros/lib.rs rusttestlib-syn FORCE
262321
+$(call if_changed,rustc_test)
263322
+$(call if_changed,rustdoc_test)
264323

@@ -384,19 +443,46 @@ $(obj)/exports_bindings_generated.h: $(obj)/bindings.o FORCE
384443
$(obj)/exports_kernel_generated.h: $(obj)/kernel.o FORCE
385444
$(call if_changed,exports)
386445

446+
quiet_cmd_rustc_hostlibrary = $(RUSTC_OR_CLIPPY_QUIET) H $@
447+
cmd_rustc_hostlibrary = \
448+
$(if $(skip_clippy),$(RUSTC),$(RUSTC_OR_CLIPPY)) \
449+
$(filter-out $(skip_flags),$(rust_common_flags) $(rustc_target_flags)) \
450+
--emit=dep-info=$(depfile) --emit=link=$@ --crate-type rlib -O \
451+
--out-dir $(objtree)/$(obj) -L$(objtree)/$(obj) \
452+
--crate-name $(patsubst lib%.rlib,%,$(notdir $@)) $<
453+
454+
$(obj)/libproc_macro2.rlib: private skip_clippy = 1
455+
$(obj)/libproc_macro2.rlib: private skip_flags = $(proc_macro2-skip_flags)
456+
$(obj)/libproc_macro2.rlib: private rustc_target_flags = $(proc_macro2-flags)
457+
$(obj)/libproc_macro2.rlib: $(src)/proc-macro2/lib.rs FORCE
458+
+$(call if_changed_dep,rustc_hostlibrary)
459+
460+
$(obj)/libquote.rlib: private skip_clippy = 1
461+
$(obj)/libquote.rlib: private skip_flags = $(quote-skip_flags)
462+
$(obj)/libquote.rlib: private rustc_target_flags = $(quote-flags)
463+
$(obj)/libquote.rlib: $(src)/quote/lib.rs $(obj)/libproc_macro2.rlib FORCE
464+
+$(call if_changed_dep,rustc_hostlibrary)
465+
466+
$(obj)/libsyn.rlib: private skip_clippy = 1
467+
$(obj)/libsyn.rlib: private skip_flags = $(syn-skip_flags)
468+
$(obj)/libsyn.rlib: private rustc_target_flags = $(syn-flags)
469+
$(obj)/libsyn.rlib: $(src)/syn/lib.rs $(obj)/libquote.rlib FORCE
470+
+$(call if_changed_dep,rustc_hostlibrary)
471+
387472
quiet_cmd_rustc_procmacro = $(RUSTC_OR_CLIPPY_QUIET) P $@
388473
cmd_rustc_procmacro = \
389474
$(RUSTC_OR_CLIPPY) $(rust_common_flags) \
390475
-Clinker-flavor=gcc -Clinker=$(HOSTCC) \
391476
-Clink-args='$(call escsq,$(KBUILD_HOSTLDFLAGS))' \
392-
--emit=dep-info=$(depfile) --emit=link=$@ --extern proc_macro \
477+
--emit=dep-info=$(depfile) --emit=link=$@ \
478+
--extern quote --extern syn --extern proc_macro --extern proc_macro2 \
393479
--crate-type proc-macro \
394-
--crate-name $(patsubst lib%.so,%,$(notdir $@)) $<
480+
-L$(objtree)/$(obj) --crate-name $(patsubst lib%.so,%,$(notdir $@)) $<
395481

396482
# Procedural macros can only be used with the `rustc` that compiled it.
397483
# Therefore, to get `libmacros.so` automatically recompiled when the compiler
398484
# version changes, we add `core.o` as a dependency (even if it is not needed).
399-
$(obj)/libmacros.so: $(src)/macros/lib.rs $(obj)/core.o FORCE
485+
$(obj)/libmacros.so: $(src)/macros/lib.rs $(obj)/libsyn.rlib $(obj)/core.o FORCE
400486
+$(call if_changed_dep,rustc_procmacro)
401487

402488
quiet_cmd_rustc_library = $(if $(skip_clippy),RUSTC,$(RUSTC_OR_CLIPPY_QUIET)) L $@

0 commit comments

Comments
 (0)