Skip to content

rust-analyzer for out-of-tree modules #914

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: rust
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 7 additions & 5 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -1831,11 +1831,6 @@ rustfmt:
rustfmtcheck: rustfmt_flags = --check
rustfmtcheck: rustfmt

# IDE support targets
PHONY += rust-analyzer
rust-analyzer:
$(Q)$(MAKE) $(build)=rust $@

# Misc
# ---------------------------------------------------------------------------

Expand Down Expand Up @@ -1888,6 +1883,7 @@ help:
@echo ' modules - default target, build the module(s)'
@echo ' modules_install - install the module'
@echo ' clean - remove generated files in module directory only'
@echo ' rust-analyzer - generate rust-project.json rust-analyzer support file'
@echo ''

endif # KBUILD_EXTMOD
Expand Down Expand Up @@ -2022,6 +2018,12 @@ quiet_cmd_tags = GEN $@
tags TAGS cscope gtags: FORCE
$(call cmd,tags)

# IDE support targets
PHONY += rust-analyzer
rust-analyzer:
$(Q)$(MAKE) $(build)=rust $@


# Script to generate missing namespace dependencies
# ---------------------------------------------------------------------------

Expand Down
6 changes: 4 additions & 2 deletions rust/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -389,8 +389,10 @@ quiet_cmd_rustc_library = $(if $(skip_clippy),RUSTC,$(RUSTC_OR_CLIPPY_QUIET)) L
$(if $(rustc_objcopy),;$(OBJCOPY) $(rustc_objcopy) $@)

rust-analyzer:
$(Q)$(srctree)/scripts/generate_rust_analyzer.py $(srctree) $(objtree) \
$(RUST_LIB_SRC) > $(objtree)/rust-project.json
$(Q)$(srctree)/scripts/generate_rust_analyzer.py \
$(abs_srctree) $(abs_objtree) \
$(RUST_LIB_SRC) $(KBUILD_EXTMOD) > \
$(if $(KBUILD_EXTMOD),$(extmod_prefix),$(objtree))/rust-project.json

$(obj)/core.o: private skip_clippy = 1
$(obj)/core.o: private skip_flags = -Dunreachable_pub
Expand Down
31 changes: 18 additions & 13 deletions scripts/generate_rust_analyzer.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,11 @@
import argparse
import json
import logging
import os
import pathlib
import sys

def generate_crates(srctree, objtree, sysroot_src):
def generate_crates(srctree, objtree, sysroot_src, external_src):
# Generate the configuration list.
cfg = []
with open(objtree / "include" / "generated" / "rustc_cfg") as fd:
Expand Down Expand Up @@ -65,7 +66,7 @@ def append_crate(display_name, root_module, deps, cfg=[], is_workspace_member=Tr
[],
is_proc_macro=True,
)
crates[-1]["proc_macro_dylib_path"] = "rust/libmacros.so"
crates[-1]["proc_macro_dylib_path"] = f"{objtree}/rust/libmacros.so"

append_crate(
"build_error",
Expand Down Expand Up @@ -95,25 +96,28 @@ def append_crate(display_name, root_module, deps, cfg=[], is_workspace_member=Tr
"exclude_dirs": [],
}

def is_root_crate(build_file, target):
return os.path.exists(build_file) and target in open(build_file).read()

# Then, the rest outside of `rust/`.
#
# We explicitly mention the top-level folders we want to cover.
for folder in ("samples", "drivers"):
for folder in ("samples", "drivers") if external_src is None else [external_src]:
for path in (srctree / folder).rglob("*.rs"):
logging.info("Checking %s", path)
name = path.name.replace(".rs", "")

# Skip those that are not crate roots.
if f"{name}.o" not in open(path.parent / "Makefile").read():
continue
if is_root_crate(path.parent / "Makefile", f"{name}.o") or \
is_root_crate(path.parent / "Kbuild", f"{name}.o"):

logging.info("Adding %s", name)
append_crate(
name,
path,
["core", "alloc", "kernel"],
cfg=cfg,
)
logging.info("Adding %s", name)
append_crate(
name,
path,
["core", "alloc", "kernel"],
cfg=cfg,
)

return crates

Expand All @@ -123,6 +127,7 @@ def main():
parser.add_argument("srctree", type=pathlib.Path)
parser.add_argument("objtree", type=pathlib.Path)
parser.add_argument("sysroot_src", type=pathlib.Path)
parser.add_argument("exttree", type=pathlib.Path, nargs='?')
args = parser.parse_args()

logging.basicConfig(
Expand All @@ -131,7 +136,7 @@ def main():
)

rust_project = {
"crates": generate_crates(args.srctree, args.objtree, args.sysroot_src),
"crates": generate_crates(args.srctree, args.objtree, args.sysroot_src, args.exttree),
"sysroot_src": str(args.sysroot_src),
}

Expand Down