Skip to content

Commit c142db7

Browse files
committed
add rust-analyzer make target
This target creates ${objtree}/rust-project.json which can be read by rust-analyzer to help with autocompletion for the kernel crate. The raw bindings do not work yet, as rust-analyzer seems to have a problem with the include macro. Signed-off-by: Finn Behrens <[email protected]>
1 parent 2222bec commit c142db7

File tree

5 files changed

+104
-40
lines changed

5 files changed

+104
-40
lines changed

Documentation/rust/quick-start.rst

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -155,11 +155,8 @@ definition, and other features.
155155
``rust-analyzer`` will need to be
156156
`configured <https://rust-analyzer.github.io/manual.html#non-cargo-based-projects>`_
157157
to work with the kernel by adding a ``rust-project.json`` file in the root folder.
158-
The example ``Documentation/rust/rust-project.json`` can
159-
be used after updating ``sysroot_src`` and including the relevant modules.
160-
The path to ``sysroot_src`` is given by::
161-
162-
$(rustc --print sysroot)/lib/rustlib/src/rust/library
158+
A ``rust-project.json`` can be generated by building the Make target ``rust-analyzer``,
159+
which will create a ``rust-project.json`` in the root of the output directory.
163160

164161

165162
Configuration

Documentation/rust/rust-project.json

Lines changed: 0 additions & 35 deletions
This file was deleted.

Makefile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1830,6 +1830,10 @@ rustfmt:
18301830
rustfmtcheck:
18311831
find -name '*.rs' | xargs $(RUSTFMT) --check
18321832

1833+
# Rust-Analyzer target
1834+
PHONY += rust-analyzer
1835+
rust-analyzer: prepare0
1836+
$(Q)$(MAKE) $(build)=rust $@
18331837

18341838
# Misc
18351839
# ---------------------------------------------------------------------------

rust/Makefile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,3 +150,7 @@ $(objtree)/rust/kernel.o: private rustc_target_flags = --extern alloc \
150150
$(objtree)/rust/kernel.o: $(srctree)/rust/kernel/lib.rs $(objtree)/rust/alloc.o \
151151
$(objtree)/rust/libmodule.so $(objtree)/rust/bindings_generated.rs FORCE
152152
$(call if_changed_dep,rustc_library)
153+
154+
GENERATE_RUST_ANALYZER = $(srctree)/scripts/generate_rust_analyzer.sh
155+
rust-analyzer:
156+
$(Q)$(GENERATE_RUST_ANALYZER) $(srctree) $(objtree) $(RUST_LIB_SRC) $(abspath $(objtree)/rust/bindings_generated.rs) > $(objtree)/rust-project.json

scripts/generate_rust_analyzer.sh

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
#!/usr/bin/env bash
2+
3+
srctree=$1
4+
objtree=$2
5+
lib_src=$3
6+
bindgen_file=$4
7+
8+
dylib_and_extra=',"proc_macro_dylib_path":"./rust/libmodule.so","env":{"RUST_BINDINGS_FILE":"'$bindgen_file'"},
9+
"source": { "include_dirs": ["'${objtree}'/rust/"], "exclude_dirs": []}'
10+
11+
# TODO: create issue at RA to accept @arg file
12+
function generate_cfgs() {
13+
echo '['
14+
cfgs=$(cat $objtree/include/generated/rustc_cfg | sed 's/--cfg=//' | sed 's/"/\\"/g' | sed 's/$/",/' | sed 's/^/"/')
15+
echo ${cfgs::-1}
16+
echo ']'
17+
}
18+
19+
function generate_crate() {
20+
name=$1
21+
module=$2
22+
member=${3:-"true"}
23+
cfg=${4:-$(generate_cfgs)}
24+
deps=${5:-'[{"crate":0,"name":"core"},{"crate":2,"name":"alloc"},{"crate":4,"name":"kernel"}]'}
25+
extra=${CRATE_EXTRA:-""}
26+
27+
echo "{
28+
\"display_name\":\"$name\",
29+
\"root_module\":\"$module\",
30+
\"edition\":\"2018\",
31+
\"deps\":$deps,
32+
\"is_workspace_member\": $member,
33+
\"cfg\": $cfg
34+
$extra
35+
}"
36+
}
37+
38+
function generate_kernel() {
39+
generate_crate "core" "${lib_src}/core/src/lib.rs" "false" "[]" "[]"
40+
echo ","
41+
generate_crate "compiler_builtins" "${srctree}/rust/compiler_builtins.rs" "true" "[]" "[]"
42+
echo ","
43+
generate_crate "alloc" "${lib_src}/alloc/src/lib.rs" "false" "[]" \
44+
'[{"crate":0,"name":"core"},{"crate":1,"name":"compiler_builtins"}]'
45+
echo ","
46+
echo '{
47+
"display_name":"module",
48+
"root_module":"'${srctree}'/rust/module.rs",
49+
"edition":"2018",
50+
"is_workspace_member":true,
51+
"deps": [],
52+
"cfg": []
53+
},'
54+
CRATE_EXTRA=$dylib_and_extra generate_crate "kernel" "${srctree}/rust/kernel/lib.rs" "true" "$(generate_cfgs)" \
55+
'[{"crate":0,"name":"core"},{"crate":2,"name":"alloc"},{"crate":3,"name":"module"}]'
56+
echo ","
57+
}
58+
59+
function check_and_generate() {
60+
filepath=$1
61+
file=$(basename $filepath)
62+
makefile=$(dirname $filepath)/Makefile
63+
name=${file%.rs}
64+
objname=${name}.o
65+
echo "checking $filepath" >&2
66+
if grep -q $objname $makefile; then
67+
echo "building crate $name" >&2
68+
echo $(CRATE_EXTRA=$dylib_and_extra generate_crate "$name" "$filepath")
69+
echo ","
70+
fi
71+
}
72+
73+
function generate_drivers() {
74+
drivers=$(find ../drivers -name '*.rs')
75+
for x in $drivers; do
76+
check_and_generate $x
77+
done
78+
echo ""
79+
}
80+
81+
function generate_samples() {
82+
samples=$(find ../samples/rust)
83+
for x in $samples; do
84+
check_and_generate $x
85+
done
86+
}
87+
88+
echo '{"crates":['
89+
generate_kernel
90+
generate_drivers
91+
samples=$(generate_samples)
92+
echo ${samples::-1}
93+
echo '],
94+
"sysroot_src": "'${lib_src}'"}'

0 commit comments

Comments
 (0)