diff options
Diffstat (limited to 'scripts/generate_rust_analyzer.py')
| -rwxr-xr-x | scripts/generate_rust_analyzer.py | 39 | 
1 files changed, 30 insertions, 9 deletions
| diff --git a/scripts/generate_rust_analyzer.py b/scripts/generate_rust_analyzer.py index 946e250c1b2a..fc52bc41d3e7 100755 --- a/scripts/generate_rust_analyzer.py +++ b/scripts/generate_rust_analyzer.py @@ -6,10 +6,19 @@  import argparse  import json  import logging +import os  import pathlib  import sys -def generate_crates(srctree, objtree, sysroot_src): +def args_crates_cfgs(cfgs): +    crates_cfgs = {} +    for cfg in cfgs: +        crate, vals = cfg.split("=", 1) +        crates_cfgs[crate] = vals.replace("--cfg", "").split() + +    return crates_cfgs + +def generate_crates(srctree, objtree, sysroot_src, external_src, cfgs):      # Generate the configuration list.      cfg = []      with open(objtree / "include" / "generated" / "rustc_cfg") as fd: @@ -23,6 +32,7 @@ def generate_crates(srctree, objtree, sysroot_src):      # Avoid O(n^2) iterations by keeping a map of indexes.      crates = []      crates_indexes = {} +    crates_cfgs = args_crates_cfgs(cfgs)      def append_crate(display_name, root_module, deps, cfg=[], is_workspace_member=True, is_proc_macro=False):          crates_indexes[display_name] = len(crates) @@ -44,6 +54,7 @@ def generate_crates(srctree, objtree, sysroot_src):          "core",          sysroot_src / "core" / "src" / "lib.rs",          [], +        cfg=crates_cfgs.get("core", []),          is_workspace_member=False,      ) @@ -57,6 +68,7 @@ def generate_crates(srctree, objtree, sysroot_src):          "alloc",          srctree / "rust" / "alloc" / "lib.rs",          ["core", "compiler_builtins"], +        cfg=crates_cfgs.get("alloc", []),      )      append_crate( @@ -65,7 +77,7 @@ def generate_crates(srctree, objtree, sysroot_src):          [],          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", @@ -95,19 +107,26 @@ def generate_crates(srctree, objtree, sysroot_src):          "exclude_dirs": [],      } +    def is_root_crate(build_file, target): +        try: +            return f"{target}.o" in open(build_file).read() +        except FileNotFoundError: +            return False +      # Then, the rest outside of `rust/`.      #      # We explicitly mention the top-level folders we want to cover. -    for folder in ("samples", "drivers"): -        for path in (srctree / folder).rglob("*.rs"): +    extra_dirs = map(lambda dir: srctree / dir, ("samples", "drivers")) +    if external_src is not None: +        extra_dirs = [external_src] +    for folder in extra_dirs: +        for path in folder.rglob("*.rs"):              logging.info("Checking %s", path)              name = path.name.replace(".rs", "")              # Skip those that are not crate roots. -            try: -                if f"{name}.o" not in open(path.parent / "Makefile").read(): -                    continue -            except FileNotFoundError: +            if not is_root_crate(path.parent / "Makefile", name) and \ +               not is_root_crate(path.parent / "Kbuild", name):                  continue              logging.info("Adding %s", name) @@ -123,9 +142,11 @@ def generate_crates(srctree, objtree, sysroot_src):  def main():      parser = argparse.ArgumentParser()      parser.add_argument('--verbose', '-v', action='store_true') +    parser.add_argument('--cfgs', action='append', default=[])      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( @@ -134,7 +155,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, args.cfgs),          "sysroot_src": str(args.sysroot_src),      } | 
