Skip to content

Commit df115d7

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 3aa1b9a commit df115d7

File tree

4 files changed

+104
-1
lines changed

4 files changed

+104
-1
lines changed

Makefile

+4
Original file line numberDiff line numberDiff line change
@@ -1829,6 +1829,10 @@ rustfmt:
18291829
rustfmtcheck:
18301830
find -name '*.rs' | xargs $(RUSTFMT) --check
18311831

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

18331837
# Misc
18341838
# ---------------------------------------------------------------------------

rust/Makefile

+4
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)/rust/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

rust/generate_rust_analyzer.sh

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

rust/kernel/bindings.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
)]
1414
mod bindings_raw {
1515
use crate::c_types;
16-
include!(env!("RUST_BINDINGS_FILE"));
16+
core::include!(env!("RUST_BINDINGS_FILE"));
1717
}
1818
pub use bindings_raw::*;
1919

0 commit comments

Comments
 (0)