Skip to content

Commit 9121b11

Browse files
committed
rust: Kbuild: enable proc-macro2, quote, syn, serde and serde_derive
With all the new files in place from the new crates, this patch adds support for them in the build system. Note that, if we decide to add third-party crates support to upstream, we would probably want to do it in a different way. But this is useful for playing around with these crates, experimenting, etc. Signed-off-by: Miguel Ojeda <[email protected]>
1 parent 16bebcf commit 9121b11

File tree

4 files changed

+185
-24
lines changed

4 files changed

+185
-24
lines changed

Makefile

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1606,7 +1606,7 @@ MRPROPER_FILES += include/config include/generated \
16061606
certs/x509.genkey \
16071607
vmlinux-gdb.py \
16081608
*.spec rpmbuild \
1609-
rust/libmacros.so
1609+
rust/libmacros.so rust/libserde_derive.so
16101610

16111611
# clean - Delete most, but leave enough to build external modules
16121612
#
@@ -1848,8 +1848,18 @@ PHONY += rustfmt rustfmtcheck
18481848
rustfmt:
18491849
$(Q)find $(abs_srctree) -type f -name '*.rs' \
18501850
-o -path $(abs_srctree)/rust/alloc -prune \
1851+
-o -path $(abs_srctree)/rust/proc-macro2 -prune \
1852+
-o -path $(abs_srctree)/rust/quote -prune \
1853+
-o -path $(abs_srctree)/rust/syn -prune \
1854+
-o -path $(abs_srctree)/rust/serde -prune \
1855+
-o -path $(abs_srctree)/rust/serde_derive -prune \
18511856
-o -path $(abs_objtree)/rust/test -prune \
18521857
| grep -Fv $(abs_srctree)/rust/alloc \
1858+
| grep -Fv $(abs_srctree)/rust/proc-macro2 \
1859+
| grep -Fv $(abs_srctree)/rust/quote \
1860+
| grep -Fv $(abs_srctree)/rust/syn \
1861+
| grep -Fv $(abs_srctree)/rust/serde \
1862+
| grep -Fv $(abs_srctree)/rust/serde_derive \
18531863
| grep -Fv $(abs_objtree)/rust/test \
18541864
| grep -Fv generated \
18551865
| 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
uapi_generated.rs

rust/Makefile

Lines changed: 172 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@ always-$(CONFIG_RUST) += exports_core_generated.h
88
obj-$(CONFIG_RUST) += helpers.o
99
CFLAGS_REMOVE_helpers.o = -Wmissing-prototypes -Wmissing-declarations
1010

11-
always-$(CONFIG_RUST) += libmacros.so
12-
no-clean-files += libmacros.so
11+
always-$(CONFIG_RUST) += libproc_macro2.rlib libquote.rlib libsyn.rlib
12+
always-$(CONFIG_RUST) += libserde_derive.so libmacros.so
13+
no-clean-files += libserde_derive.so libmacros.so
1314

1415
always-$(CONFIG_RUST) += bindings/bindings_generated.rs bindings/bindings_helpers_generated.rs
15-
obj-$(CONFIG_RUST) += alloc.o bindings.o kernel.o
16+
obj-$(CONFIG_RUST) += alloc.o bindings.o serde.o kernel.o
1617
always-$(CONFIG_RUST) += exports_alloc_generated.h exports_bindings_generated.h \
1718
exports_kernel_generated.h
1819

@@ -60,11 +61,73 @@ alloc-cfgs = \
6061
--cfg no_sync \
6162
--cfg no_thin
6263

64+
proc_macro2-skip_flags := \
65+
--edition=2021 \
66+
-Drust_2018_idioms \
67+
-Dunreachable_pub \
68+
-Dunsafe_op_in_unsafe_fn
69+
70+
proc_macro2-flags := \
71+
--edition=2018 \
72+
-Amissing_docs \
73+
--cfg 'feature="proc-macro"' \
74+
--cfg use_proc_macro \
75+
--cfg wrap_proc_macro
76+
77+
quote-skip_flags := \
78+
--edition=2021 \
79+
-Drust_2018_idioms
80+
81+
quote-flags := \
82+
--edition=2018 \
83+
-Amissing_docs \
84+
--extern proc_macro2 \
85+
--cfg 'feature="proc-macro"'
86+
87+
syn-skip_flags := \
88+
--edition=2021 \
89+
-Drust_2018_idioms \
90+
-Dunreachable_pub \
91+
-Dunsafe_op_in_unsafe_fn
92+
93+
syn-flags := \
94+
--edition=2018 \
95+
-Amissing_docs \
96+
--cfg 'feature="clone-impls"' \
97+
--cfg 'feature="derive"' \
98+
--cfg 'feature="extra-traits"' \
99+
--cfg 'feature="fold"' \
100+
--cfg 'feature="full"' \
101+
--cfg 'feature="parsing"' \
102+
--cfg 'feature="printing"' \
103+
--cfg 'feature="proc-macro"' \
104+
--cfg 'feature="quote"' \
105+
--cfg 'feature="visit"' \
106+
--cfg 'feature="visit-mut"'
107+
108+
serde_derive-skip_flags := \
109+
--edition=2021 \
110+
-Drust_2018_idioms \
111+
-Dunreachable_pub
112+
113+
serde_derive-flags := \
114+
-Amissing_docs
115+
116+
serde-skip_flags := \
117+
--edition=2021 \
118+
-Drust_2018_idioms \
119+
-Dunreachable_pub
120+
121+
serde-flags := \
122+
-Amissing_docs \
123+
--cfg no_fp_fmt_parse
124+
63125
quiet_cmd_rustdoc = RUSTDOC $(if $(rustdoc_host),H, ) $<
64126
cmd_rustdoc = \
65127
OBJTREE=$(abspath $(objtree)) \
66-
$(RUSTDOC) $(if $(rustdoc_host),$(rust_common_flags),$(rust_flags)) \
128+
$(RUSTDOC) $(filter-out $(skip_flags),$(if $(rustdoc_host),$(rust_common_flags),$(rust_flags))) \
67129
$(rustc_target_flags) -L$(objtree)/$(obj) \
130+
--extern quote --extern syn \
68131
--output $(objtree)/$(obj)/doc \
69132
--crate-name $(subst rustdoc-,,$@) \
70133
@$(objtree)/include/generated/rustc_cfg $<
@@ -81,7 +144,7 @@ quiet_cmd_rustdoc = RUSTDOC $(if $(rustdoc_host),H, ) $<
81144
# command-like flags to solve the issue. Meanwhile, we use the non-custom case
82145
# and then retouch the generated files.
83146
rustdoc: rustdoc-core rustdoc-macros rustdoc-compiler_builtins \
84-
rustdoc-alloc rustdoc-kernel
147+
rustdoc-alloc rustdoc-kernel rustdoc-serde rustdoc-serde_derive
85148
$(Q)cp $(srctree)/Documentation/images/logo.svg $(objtree)/$(obj)/doc
86149
$(Q)cp $(srctree)/Documentation/images/COPYING-logo $(objtree)/$(obj)/doc
87150
$(Q)find $(objtree)/$(obj)/doc -name '*.html' -type f -print0 | xargs -0 sed -Ei \
@@ -116,17 +179,31 @@ rustdoc-alloc: $(src)/alloc/lib.rs rustdoc-core rustdoc-compiler_builtins FORCE
116179

117180
rustdoc-kernel: private rustc_target_flags = --extern alloc \
118181
--extern build_error --extern macros=$(objtree)/$(obj)/libmacros.so \
119-
--extern bindings --extern uapi
182+
--extern bindings --extern uapi --extern serde --extern serde_derive
120183
rustdoc-kernel: $(src)/kernel/lib.rs rustdoc-core rustdoc-macros \
121-
rustdoc-compiler_builtins rustdoc-alloc $(obj)/libmacros.so \
122-
$(obj)/bindings.o FORCE
184+
rustdoc-compiler_builtins rustdoc-alloc rustdoc-serde $(obj)/libmacros.so \
185+
$(obj)/bindings.o $(obj)/libserde_derive.so FORCE
186+
$(call if_changed,rustdoc)
187+
188+
rustdoc-serde_derive: private rustdoc_host = yes
189+
rustdoc-serde_derive: private skip_flags = $(serde_derive-skip_flags)
190+
rustdoc-serde_derive: private rustc_target_flags = --crate-type proc-macro \
191+
--extern proc_macro -Amissing_docs
192+
rustdoc-serde_derive: $(src)/serde_derive/lib.rs FORCE
193+
$(call if_changed,rustdoc)
194+
195+
rustdoc-serde: private skip_flags = $(serde-skip_flags)
196+
rustdoc-serde: private rustc_target_flags = --extern alloc --extern serde \
197+
-Arustdoc::broken_intra_doc_links
198+
rustdoc-serde: $(src)/serde/lib.rs rustdoc-core FORCE
123199
$(call if_changed,rustdoc)
124200

125201
quiet_cmd_rustc_test_library = RUSTC TL $<
126202
cmd_rustc_test_library = \
127203
OBJTREE=$(abspath $(objtree)) \
128-
$(RUSTC) $(rust_common_flags) \
129-
@$(objtree)/include/generated/rustc_cfg $(rustc_target_flags) \
204+
$(RUSTC) \
205+
$(filter-out $(skip_flags),$(rust_common_flags) $(rustc_target_flags)) \
206+
@$(objtree)/include/generated/rustc_cfg \
130207
--crate-type $(if $(rustc_test_library_proc),proc-macro,rlib) \
131208
--out-dir $(objtree)/$(obj)/test --cfg testlib \
132209
--sysroot $(objtree)/$(obj)/test/sysroot \
@@ -136,9 +213,25 @@ quiet_cmd_rustc_test_library = RUSTC TL $<
136213
rusttestlib-build_error: $(src)/build_error.rs rusttest-prepare FORCE
137214
$(call if_changed,rustc_test_library)
138215

139-
rusttestlib-macros: private rustc_target_flags = --extern proc_macro
216+
rusttestlib-proc_macro2: private skip_flags = $(proc_macro2-skip_flags)
217+
rusttestlib-proc_macro2: private rustc_target_flags = $(proc_macro2-flags)
218+
rusttestlib-proc_macro2: $(src)/proc-macro2/lib.rs rusttest-prepare FORCE
219+
$(call if_changed,rustc_test_library)
220+
221+
rusttestlib-quote: private skip_flags = $(quote-skip_flags)
222+
rusttestlib-quote: private rustc_target_flags = $(quote-flags)
223+
rusttestlib-quote: $(src)/quote/lib.rs rusttestlib-proc_macro2 FORCE
224+
$(call if_changed,rustc_test_library)
225+
226+
rusttestlib-syn: private skip_flags = $(syn-skip_flags)
227+
rusttestlib-syn: private rustc_target_flags = $(syn-flags)
228+
rusttestlib-syn: $(src)/syn/lib.rs rusttestlib-quote FORCE
229+
$(call if_changed,rustc_test_library)
230+
231+
rusttestlib-macros: private rustc_target_flags = --extern proc_macro \
232+
--extern quote --extern syn
140233
rusttestlib-macros: private rustc_test_library_proc = yes
141-
rusttestlib-macros: $(src)/macros/lib.rs rusttest-prepare FORCE
234+
rusttestlib-macros: $(src)/macros/lib.rs rusttestlib-syn FORCE
142235
$(call if_changed,rustc_test_library)
143236

144237
rusttestlib-bindings: $(src)/bindings/lib.rs rusttest-prepare FORCE
@@ -147,6 +240,18 @@ rusttestlib-bindings: $(src)/bindings/lib.rs rusttest-prepare FORCE
147240
rusttestlib-uapi: $(src)/uapi/lib.rs rusttest-prepare FORCE
148241
$(call if_changed,rustc_test_library)
149242

243+
rusttestlib-serde_derive: private skip_flags = $(serde_derive-skip_flags)
244+
rusttestlib-serde_derive: private rustc_target_flags = --extern proc_macro \
245+
--extern quote --extern syn $(serde_derive-flags)
246+
rusttestlib-serde_derive: private rustc_test_library_proc = yes
247+
rusttestlib-serde_derive: $(src)/serde_derive/lib.rs rusttestlib-syn FORCE
248+
$(call if_changed,rustc_test_library)
249+
250+
rusttestlib-serde: private skip_flags = $(serde-skip_flags)
251+
rusttestlib-serde: private rustc_target_flags = $(serde-flags)
252+
rusttestlib-serde: $(src)/serde/lib.rs rusttest-prepare FORCE
253+
$(call if_changed,rustc_test_library)
254+
150255
quiet_cmd_rustdoc_test = RUSTDOC T $<
151256
cmd_rustdoc_test = \
152257
OBJTREE=$(abspath $(objtree)) \
@@ -222,17 +327,19 @@ quiet_cmd_rustsysroot = RUSTSYSROOT
222327
rusttest-prepare: FORCE
223328
$(call if_changed,rustsysroot)
224329

225-
rusttest-macros: private rustc_target_flags = --extern proc_macro
330+
rusttest-macros: private rustc_target_flags = --extern proc_macro \
331+
--extern quote --extern syn
226332
rusttest-macros: private rustdoc_test_target_flags = --crate-type proc-macro
227-
rusttest-macros: $(src)/macros/lib.rs rusttest-prepare FORCE
333+
rusttest-macros: $(src)/macros/lib.rs rusttestlib-syn FORCE
228334
$(call if_changed,rustc_test)
229335
$(call if_changed,rustdoc_test)
230336

231337
rusttest-kernel: private rustc_target_flags = --extern alloc \
232-
--extern build_error --extern macros --extern bindings --extern uapi
338+
--extern build_error --extern macros --extern bindings --extern uapi \
339+
--extern serde --extern serde_derive
233340
rusttest-kernel: $(src)/kernel/lib.rs rusttest-prepare \
234341
rusttestlib-build_error rusttestlib-macros rusttestlib-bindings \
235-
rusttestlib-uapi FORCE
342+
rusttestlib-uapi rusttestlib-serde rusttestlib-serde_derive FORCE
236343
$(call if_changed,rustc_test)
237344
$(call if_changed,rustc_test_library)
238345

@@ -348,17 +455,52 @@ $(obj)/exports_bindings_generated.h: $(obj)/bindings.o FORCE
348455
$(obj)/exports_kernel_generated.h: $(obj)/kernel.o FORCE
349456
$(call if_changed,exports)
350457

458+
quiet_cmd_rustc_hostlibrary = $(RUSTC_OR_CLIPPY_QUIET) H $@
459+
cmd_rustc_hostlibrary = \
460+
$(if $(skip_clippy),$(RUSTC),$(RUSTC_OR_CLIPPY)) \
461+
$(filter-out $(skip_flags),$(rust_common_flags) $(rustc_target_flags)) \
462+
--emit=dep-info,link --crate-type rlib -O \
463+
--out-dir $(objtree)/$(obj) -L$(objtree)/$(obj) \
464+
--crate-name $(patsubst lib%.rlib,%,$(notdir $@)) $<; \
465+
mv $(objtree)/$(obj)/$(patsubst lib%.rlib,%,$(notdir $@)).d $(depfile); \
466+
sed -i '/^\#/d' $(depfile)
467+
468+
$(obj)/libproc_macro2.rlib: private skip_clippy = 1
469+
$(obj)/libproc_macro2.rlib: private skip_flags = $(proc_macro2-skip_flags)
470+
$(obj)/libproc_macro2.rlib: private rustc_target_flags = $(proc_macro2-flags)
471+
$(obj)/libproc_macro2.rlib: $(src)/proc-macro2/lib.rs FORCE
472+
$(call if_changed_dep,rustc_hostlibrary)
473+
474+
$(obj)/libquote.rlib: private skip_clippy = 1
475+
$(obj)/libquote.rlib: private skip_flags = $(quote-skip_flags)
476+
$(obj)/libquote.rlib: private rustc_target_flags = $(quote-flags)
477+
$(obj)/libquote.rlib: $(src)/quote/lib.rs $(obj)/libproc_macro2.rlib FORCE
478+
$(call if_changed_dep,rustc_hostlibrary)
479+
480+
$(obj)/libsyn.rlib: private skip_clippy = 1
481+
$(obj)/libsyn.rlib: private skip_flags = $(syn-skip_flags)
482+
$(obj)/libsyn.rlib: private rustc_target_flags = $(syn-flags)
483+
$(obj)/libsyn.rlib: $(src)/syn/lib.rs $(obj)/libquote.rlib FORCE
484+
$(call if_changed_dep,rustc_hostlibrary)
485+
351486
quiet_cmd_rustc_procmacro = $(RUSTC_OR_CLIPPY_QUIET) P $@
352487
cmd_rustc_procmacro = \
353-
$(RUSTC_OR_CLIPPY) $(rust_common_flags) \
488+
$(if $(skip_clippy),$(RUSTC),$(RUSTC_OR_CLIPPY)) \
489+
$(filter-out $(skip_flags),$(rust_common_flags) $(rustc_target_flags)) \
354490
--emit=dep-info=$(depfile) --emit=link=$@ --extern proc_macro \
355-
--crate-type proc-macro \
356-
--crate-name $(patsubst lib%.so,%,$(notdir $@)) $<
491+
--extern quote --extern syn --crate-type proc-macro \
492+
-L$(objtree)/$(obj) --crate-name $(patsubst lib%.so,%,$(notdir $@)) $<
357493

358494
# Procedural macros can only be used with the `rustc` that compiled it.
359495
# Therefore, to get `libmacros.so` automatically recompiled when the compiler
360496
# version changes, we add `core.o` as a dependency (even if it is not needed).
361-
$(obj)/libmacros.so: $(src)/macros/lib.rs $(obj)/core.o FORCE
497+
$(obj)/libserde_derive.so: private skip_clippy = 1
498+
$(obj)/libserde_derive.so: private skip_flags = $(serde_derive-skip_flags)
499+
$(obj)/libserde_derive.so: private rustc_target_flags = $(serde_derive-flags)
500+
$(obj)/libserde_derive.so: $(src)/serde_derive/lib.rs $(obj)/libsyn.rlib $(obj)/core.o FORCE
501+
$(call if_changed_dep,rustc_procmacro)
502+
503+
$(obj)/libmacros.so: $(src)/macros/lib.rs $(obj)/libsyn.rlib $(obj)/core.o FORCE
362504
$(call if_changed_dep,rustc_procmacro)
363505

364506
quiet_cmd_rustc_library = $(if $(skip_clippy),RUSTC,$(RUSTC_OR_CLIPPY_QUIET)) L $@
@@ -420,10 +562,18 @@ $(obj)/uapi.o: $(src)/uapi/lib.rs \
420562
$(obj)/uapi/uapi_generated.rs FORCE
421563
$(call if_changed_dep,rustc_library)
422564

565+
$(obj)/serde.o: private skip_clippy = 1
566+
$(obj)/serde.o: private skip_flags = $(serde-skip_flags)
567+
$(obj)/serde.o: private rustc_target_flags = $(serde-flags)
568+
$(obj)/serde.o: $(src)/serde/lib.rs $(obj)/compiler_builtins.o FORCE
569+
$(call if_changed_dep,rustc_library)
570+
423571
$(obj)/kernel.o: private rustc_target_flags = --extern alloc \
424-
--extern build_error --extern macros --extern bindings --extern uapi
572+
--extern build_error --extern macros --extern bindings --extern uapi \
573+
--extern serde --extern serde_derive
425574
$(obj)/kernel.o: $(src)/kernel/lib.rs $(obj)/alloc.o $(obj)/build_error.o \
426-
$(obj)/libmacros.so $(obj)/bindings.o $(obj)/uapi.o FORCE
575+
$(obj)/libmacros.so $(obj)/bindings.o $(obj)/uapi.o \
576+
$(obj)/serde.o $(obj)/libserde_derive.so FORCE
427577
$(call if_changed_dep,rustc_library)
428578

429579
endif # CONFIG_RUST

scripts/Makefile.build

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ rust_common_cmd = \
284284
-Zallow-features=$(rust_allowed_features) \
285285
-Zcrate-attr=no_std \
286286
-Zcrate-attr='feature($(rust_allowed_features))' \
287-
--extern alloc --extern kernel \
287+
--extern alloc --extern kernel --extern serde --extern serde_derive \
288288
--crate-type rlib -L $(objtree)/rust/ \
289289
--crate-name $(basename $(notdir $@)) \
290290
--emit=dep-info=$(depfile)

0 commit comments

Comments
 (0)