@@ -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,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+
74114quiet_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 \
137178quiet_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 $<
148190rusttestlib-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
152210rusttestlib-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
156214rusttestlib-bindings : $(src ) /bindings/lib.rs rusttest-prepare FORCE
@@ -256,9 +314,10 @@ quiet_cmd_rustsysroot = RUSTSYSROOT
256314rusttest-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
260319rusttest-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+
387472quiet_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
402488quiet_cmd_rustc_library = $(if $(skip_clippy ) ,RUSTC,$(RUSTC_OR_CLIPPY_QUIET ) ) L $@
0 commit comments