@@ -11,6 +11,7 @@ always-$(CONFIG_RUST) += exports_core_generated.h
1111obj-$(CONFIG_RUST) += helpers.o
1212CFLAGS_REMOVE_helpers.o = -Wmissing-prototypes -Wmissing-declarations
1313
14+ always-$(CONFIG_RUST) += libproc_macro2.rlib libquote.rlib libsyn.rlib
1415always-$(CONFIG_RUST) += libmacros.so
1516no-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+
74123quiet_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 \
137187quiet_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 $<
148199rusttestlib-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
152219rusttestlib-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
156223rusttestlib-bindings : $(src ) /bindings/lib.rs rusttest-prepare FORCE
@@ -256,9 +323,10 @@ quiet_cmd_rustsysroot = RUSTSYSROOT
256323rusttest-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
260328rusttest-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+
387483quiet_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
402499quiet_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
0 commit comments