Skip to content

Commit a59391f

Browse files
committed
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 <[email protected]>
1 parent 82e9a4f commit a59391f

File tree

4 files changed

+137
-9
lines changed

4 files changed

+137
-9
lines changed

Makefile

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1737,8 +1737,14 @@ PHONY += rustfmt rustfmtcheck
17371737
rustfmt:
17381738
$(Q)find $(abs_srctree) -type f -name '*.rs' \
17391739
-o -path $(abs_srctree)/rust/alloc -prune \
1740+
-o -path $(abs_srctree)/rust/proc-macro2 -prune \
1741+
-o -path $(abs_srctree)/rust/quote -prune \
1742+
-o -path $(abs_srctree)/rust/syn -prune \
17401743
-o -path $(abs_objtree)/rust/test -prune \
17411744
| grep -Fv $(abs_srctree)/rust/alloc \
1745+
| grep -Fv $(abs_srctree)/rust/proc-macro2 \
1746+
| grep -Fv $(abs_srctree)/rust/quote \
1747+
| grep -Fv $(abs_srctree)/rust/syn \
17421748
| grep -Fv $(abs_objtree)/rust/test \
17431749
| grep -Fv generated \
17441750
| 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: 108 additions & 8 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,60 @@ alloc-cfgs = \
7172
--cfg no_sync \
7273
--cfg no_thin
7374

75+
proc_macro2-cfgs := \
76+
--cfg 'feature="proc-macro"' \
77+
--cfg wrap_proc_macro
78+
79+
proc_macro2-skip_flags := \
80+
-Drust_2018_idioms \
81+
-Dunreachable_pub
82+
83+
proc_macro2-flags := \
84+
-Amissing_docs \
85+
$(proc_macro2-cfgs)
86+
87+
quote-cfgs := \
88+
--cfg 'feature="proc-macro"'
89+
90+
quote-skip_flags := \
91+
--edition=2021 \
92+
-Drust_2018_idioms
93+
94+
quote-flags := \
95+
--edition=2018 \
96+
-Amissing_docs \
97+
--extern proc_macro2 \
98+
$(quote-cfgs)
99+
100+
syn-cfgs := \
101+
--cfg 'feature="clone-impls"' \
102+
--cfg 'feature="derive"' \
103+
--cfg 'feature="extra-traits"' \
104+
--cfg 'feature="fold"' \
105+
--cfg 'feature="full"' \
106+
--cfg 'feature="parsing"' \
107+
--cfg 'feature="printing"' \
108+
--cfg 'feature="proc-macro"' \
109+
--cfg 'feature="quote"' \
110+
--cfg 'feature="visit"' \
111+
--cfg 'feature="visit-mut"'
112+
113+
syn-skip_flags := \
114+
-Drust_2018_idioms \
115+
-Dunreachable_pub
116+
117+
syn-flags := \
118+
-Amissing_docs \
119+
--extern proc_macro2 \
120+
--extern quote \
121+
$(syn-cfgs)
122+
74123
quiet_cmd_rustdoc = RUSTDOC $(if $(rustdoc_host),H, ) $<
75124
cmd_rustdoc = \
76125
OBJTREE=$(abspath $(objtree)) \
77126
$(RUSTDOC) $(if $(rustdoc_host),$(rust_common_flags),$(rust_flags)) \
78127
$(rustc_target_flags) -L$(objtree)/$(obj) \
128+
--extern proc_macro2 --extern quote --extern syn \
79129
--output $(rustdoc_output) \
80130
--crate-name $(subst rustdoc-,,$@) \
81131
$(if $(rustdoc_host),,--sysroot=/dev/null) \
@@ -137,8 +187,9 @@ rustdoc-kernel: $(src)/kernel/lib.rs rustdoc-core rustdoc-macros \
137187
quiet_cmd_rustc_test_library = RUSTC TL $<
138188
cmd_rustc_test_library = \
139189
OBJTREE=$(abspath $(objtree)) \
140-
$(RUSTC) $(rust_common_flags) \
141-
@$(objtree)/include/generated/rustc_cfg $(rustc_target_flags) \
190+
$(RUSTC) \
191+
$(filter-out $(skip_flags),$(rust_common_flags) $(rustc_target_flags)) \
192+
@$(objtree)/include/generated/rustc_cfg \
142193
--crate-type $(if $(rustc_test_library_proc),proc-macro,rlib) \
143194
--out-dir $(objtree)/$(obj)/test --cfg testlib \
144195
--sysroot $(objtree)/$(obj)/test/sysroot \
@@ -148,9 +199,25 @@ quiet_cmd_rustc_test_library = RUSTC TL $<
148199
rusttestlib-build_error: $(src)/build_error.rs rusttest-prepare FORCE
149200
+$(call if_changed,rustc_test_library)
150201

151-
rusttestlib-macros: private rustc_target_flags = --extern proc_macro
202+
rusttestlib-proc_macro2: private skip_flags = $(proc_macro2-skip_flags)
203+
rusttestlib-proc_macro2: private rustc_target_flags = $(proc_macro2-flags)
204+
rusttestlib-proc_macro2: $(src)/proc-macro2/lib.rs rusttest-prepare FORCE
205+
+$(call if_changed,rustc_test_library)
206+
207+
rusttestlib-quote: private skip_flags = $(quote-skip_flags)
208+
rusttestlib-quote: private rustc_target_flags = $(quote-flags)
209+
rusttestlib-quote: $(src)/quote/lib.rs rusttestlib-proc_macro2 FORCE
210+
+$(call if_changed,rustc_test_library)
211+
212+
rusttestlib-syn: private skip_flags = $(syn-skip_flags)
213+
rusttestlib-syn: private rustc_target_flags = $(syn-flags)
214+
rusttestlib-syn: $(src)/syn/lib.rs rusttestlib-quote FORCE
215+
+$(call if_changed,rustc_test_library)
216+
217+
rusttestlib-macros: private rustc_target_flags = --extern proc_macro \
218+
--extern proc_macro2 --extern quote --extern syn
152219
rusttestlib-macros: private rustc_test_library_proc = yes
153-
rusttestlib-macros: $(src)/macros/lib.rs rusttest-prepare FORCE
220+
rusttestlib-macros: $(src)/macros/lib.rs rusttestlib-syn FORCE
154221
+$(call if_changed,rustc_test_library)
155222

156223
rusttestlib-bindings: $(src)/bindings/lib.rs rusttest-prepare FORCE
@@ -256,9 +323,10 @@ quiet_cmd_rustsysroot = RUSTSYSROOT
256323
rusttest-prepare: FORCE
257324
+$(call if_changed,rustsysroot)
258325

259-
rusttest-macros: private rustc_target_flags = --extern proc_macro
326+
rusttest-macros: private rustc_target_flags = --extern proc_macro \
327+
--extern proc_macro2 --extern quote --extern syn
260328
rusttest-macros: private rustdoc_test_target_flags = --crate-type proc-macro
261-
rusttest-macros: $(src)/macros/lib.rs rusttest-prepare FORCE
329+
rusttest-macros: $(src)/macros/lib.rs rusttestlib-syn FORCE
262330
+$(call if_changed,rustc_test)
263331
+$(call if_changed,rustdoc_test)
264332

@@ -384,19 +452,48 @@ $(obj)/exports_bindings_generated.h: $(obj)/bindings.o FORCE
384452
$(obj)/exports_kernel_generated.h: $(obj)/kernel.o FORCE
385453
$(call if_changed,exports)
386454

455+
quiet_cmd_rustc_hostlibrary = $(RUSTC_OR_CLIPPY_QUIET) H $@
456+
cmd_rustc_hostlibrary = \
457+
$(if $(skip_clippy),$(RUSTC),$(RUSTC_OR_CLIPPY)) \
458+
$(filter-out $(skip_flags),$(KBUILD_HOSTRUSTFLAGS) $(rustc_target_flags)) \
459+
-Clinker-flavor=gcc -Clinker=$(HOSTCC) \
460+
-Clink-args='$(call escsq,$(KBUILD_HOSTLDFLAGS))' \
461+
--emit=dep-info=$(depfile) --emit=link=$@ --crate-type rlib \
462+
--out-dir $(objtree)/$(obj) -L$(objtree)/$(obj) \
463+
--crate-name $(patsubst lib%.rlib,%,$(notdir $@)) $<
464+
465+
$(obj)/libproc_macro2.rlib: private skip_clippy = 1
466+
$(obj)/libproc_macro2.rlib: private skip_flags = $(proc_macro2-skip_flags)
467+
$(obj)/libproc_macro2.rlib: private rustc_target_flags = $(proc_macro2-flags)
468+
$(obj)/libproc_macro2.rlib: $(src)/proc-macro2/lib.rs FORCE
469+
+$(call if_changed_dep,rustc_hostlibrary)
470+
471+
$(obj)/libquote.rlib: private skip_clippy = 1
472+
$(obj)/libquote.rlib: private skip_flags = $(quote-skip_flags)
473+
$(obj)/libquote.rlib: private rustc_target_flags = $(quote-flags)
474+
$(obj)/libquote.rlib: $(src)/quote/lib.rs $(obj)/libproc_macro2.rlib FORCE
475+
+$(call if_changed_dep,rustc_hostlibrary)
476+
477+
$(obj)/libsyn.rlib: private skip_clippy = 1
478+
$(obj)/libsyn.rlib: private skip_flags = $(syn-skip_flags)
479+
$(obj)/libsyn.rlib: private rustc_target_flags = $(syn-flags)
480+
$(obj)/libsyn.rlib: $(src)/syn/lib.rs $(obj)/libquote.rlib FORCE
481+
+$(call if_changed_dep,rustc_hostlibrary)
482+
387483
quiet_cmd_rustc_procmacro = $(RUSTC_OR_CLIPPY_QUIET) P $@
388484
cmd_rustc_procmacro = \
389485
$(RUSTC_OR_CLIPPY) $(KBUILD_HOSTRUSTFLAGS) \
390486
-Clinker-flavor=gcc -Clinker=$(HOSTCC) \
391487
-Clink-args='$(call escsq,$(KBUILD_HOSTLDFLAGS))' \
392488
--emit=dep-info=$(depfile) --emit=link=$@ --extern proc_macro \
489+
--extern proc_macro2 --extern quote --extern syn \
393490
--crate-type proc-macro \
394-
--crate-name $(patsubst lib%.so,%,$(notdir $@)) $<
491+
-L$(objtree)/$(obj) --crate-name $(patsubst lib%.so,%,$(notdir $@)) $<
395492

396493
# Procedural macros can only be used with the `rustc` that compiled it.
397494
# Therefore, to get `libmacros.so` automatically recompiled when the compiler
398495
# 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
496+
$(obj)/libmacros.so: $(src)/macros/lib.rs $(obj)/libsyn.rlib $(obj)/core.o FORCE
400497
+$(call if_changed_dep,rustc_procmacro)
401498

402499
quiet_cmd_rustc_library = $(if $(skip_clippy),RUSTC,$(RUSTC_OR_CLIPPY_QUIET)) L $@
@@ -415,6 +512,9 @@ rust-analyzer:
415512
$(Q)$(srctree)/scripts/generate_rust_analyzer.py \
416513
--cfgs='core=$(call escsq,$(core-cfgs))' \
417514
--cfgs='alloc=$(call escsq,$(alloc-cfgs))' \
515+
--cfgs='proc_macro2=$(call escsq,$(proc_macro2-cfgs))' \
516+
--cfgs='quote=$(call escsq,$(quote-cfgs))' \
517+
--cfgs='syn=$(call escsq,$(syn-cfgs))' \
418518
$(realpath $(srctree)) $(realpath $(objtree)) \
419519
$(RUST_LIB_SRC) $(KBUILD_EXTMOD) > \
420520
$(if $(KBUILD_EXTMOD),$(extmod_prefix),$(objtree))/rust-project.json

scripts/generate_rust_analyzer.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,31 @@ def append_crate(display_name, root_module, deps, cfg=[], is_workspace_member=Tr
7272
cfg=crates_cfgs.get("alloc", []),
7373
)
7474

75+
append_crate(
76+
"proc_macro2",
77+
srctree / "rust" / "proc-macro2" / "lib.rs",
78+
[],
79+
cfg=crates_cfgs.get("proc_macro2", []),
80+
)
81+
82+
append_crate(
83+
"quote",
84+
srctree / "rust" / "quote" / "lib.rs",
85+
["proc_macro2"],
86+
cfg=crates_cfgs.get("quote", []),
87+
)
88+
89+
append_crate(
90+
"syn",
91+
srctree / "rust" / "syn" / "lib.rs",
92+
["proc_macro2", "quote"],
93+
cfg=crates_cfgs.get("syn", []),
94+
)
95+
7596
append_crate(
7697
"macros",
7798
srctree / "rust" / "macros" / "lib.rs",
78-
[],
99+
["proc_macro2", "quote", "syn"],
79100
is_proc_macro=True,
80101
)
81102
crates[-1]["proc_macro_dylib_path"] = f"{objtree}/rust/libmacros.so"

0 commit comments

Comments
 (0)