aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/generate_rust_analyzer.py
blob: 946e250c1b2a6f9b243d8836ea47ad067970530b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#!/usr/bin/env python3
# SPDX-License-Identifier: GPL-2.0
"""generate_rust_analyzer - Generates the `rust-project.json` file for `rust-analyzer`.
"""

import argparse
import json
import logging
import pathlib
import sys

def generate_crates(srctree, objtree, sysroot_src):
    # Generate the configuration list.
    cfg = []
    with open(objtree / "include" / "generated" / "rustc_cfg") as fd:
        for line in fd:
            line = line.replace("--cfg=", "")
            line = line.replace("\n", "")
            cfg.append(line)

    # Now fill the crates list -- dependencies need to come first.
    #
    # Avoid O(n^2) iterations by keeping a map of indexes.
    crates = []
    crates_indexes = {}

    def append_crate(display_name, root_module, deps, cfg=[], is_workspace_member=True, is_proc_macro=False):
        crates_indexes[display_name] = len(crates)
        crates.append({
            "display_name": display_name,
            "root_module": str(root_module),
            "is_workspace_member": is_workspace_member,
            "is_proc_macro": is_proc_macro,
            "deps": [{"crate": crates_indexes[dep], "name": dep} for dep in deps],
            "cfg": cfg,
            "edition": "2021",
            "env": {
                "RUST_MODFILE": "This is only for rust-analyzer"
            }
        })

    # First, the ones in `rust/` since they are a bit special.
    append_crate(
        "core",
        sysroot_src / "core" / "src" / "lib.rs",
        [],
        is_workspace_member=False,
    )

    append_crate(
        "compiler_builtins",
        srctree / "rust" / "compiler_builtins.rs",
        [],
    )

    append_crate(
        "alloc",
        srctree / "rust" / "alloc" / "lib.rs",
        ["core", "compiler_builtins"],
    )

    append_crate(
        "macros",
        srctree / "rust" / "macros" / "lib.rs",
        [],
        is_proc_macro=True,
    )
    crates[-1]["proc_macro_dylib_path"] = "rust/libmacros.so"

    append_crate(
        "build_error",
        srctree / "rust" / "build_error.rs",
        ["core", "compiler_builtins"],
    )

    append_crate(
        "bindings",
        srctree / "rust"/ "bindings" / "lib.rs",
        ["core"],
        cfg=cfg,
    )
    crates[-1]["env"]["OBJTREE"] = str(objtree.resolve(True))

    append_crate(
        "kernel",
        srctree / "rust" / "kernel" / "lib.rs",
        ["core", "alloc", "macros", "build_error", "bindings"],
        cfg=cfg,
    )
    crates[-1]["source"] = {
        "include_dirs": [
            str(srctree / "rust" / "kernel"),
            str(objtree / "rust")
        ],
        "exclude_dirs": [],
    }

    # 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"):
            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:
                continue

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

    return crates

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--verbose', '-v', action='store_true')
    parser.add_argument("srctree", type=pathlib.Path)
    parser.add_argument("objtree", type=pathlib.Path)
    parser.add_argument("sysroot_src", type=pathlib.Path)
    args = parser.parse_args()

    logging.basicConfig(
        format="[%(asctime)s] [%(levelname)s] %(message)s",
        level=logging.INFO if args.verbose else logging.WARNING
    )

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

    json.dump(rust_project, sys.stdout, sort_keys=True, indent=4)

if __name__ == "__main__":
    main()
>2004-11-09[ARM] Add static partitioning information to flash_platform_data.Russell King1-2/+17 2004-11-09[ARM] rtctime tweaksRussell King1-47/+66 2004-11-09[ARM PATCH] 2219/2: Ignore IRQ_NONE for edge triggered interruptsIan Campbell1-4/+1 2004-11-09NTFS: Disable the file size changing code fromAnton Altaparmakov2-5/+6 2004-11-09NTFS: - Fix creation of buffers in fs/ntfs/mft.c::ntfs_sync_mft_mirror().Anton Altaparmakov3-9/+21 2004-11-09Cset exclude: herbert@gondor.apana.org.au|ChangeSet|20041110052404|08839David S. Miller1-5/+1 2004-11-09[PKT_SCHED]: Unline inner qdiscs immediately in qdisc_destroy()Patrick McHardy2-2/+28 2004-11-09[NETFILTER]: Fix find_appropriate_src() to actually work.Rusty Russell1-25/+25 2004-11-09[AX25]: Fix cb lookupRalf Bächle1-10/+2 2004-11-09[NET]: Mark __{lock,release}_sock() static.Arjan van de Ven2-6/+2 2004-11-09[PKT_SCHED]: Fix scheduler/classifier module unload race.Patrick McHardy2-10/+8 2004-11-09[PKT_SCHED]: Mark some functions static in tc actions/act_apiPatrick McHardy5-33/+35 2004-11-09[IPV6]: Close small race in ip6_del_rtHerbert Xu1-1/+1 2004-11-09[IPV6]: Fix dst leak in ipv6_add_addrHerbert Xu1-1/+5 2004-11-09[PATCH] fix "extern inline"Yoshinori Sato1-2/+2 2004-11-09[PATCH] H8/300 vmlinux.lds updateYoshinori Sato10-172/+58 2004-11-09[PATCH] H8/300 build error fixYoshinori Sato1-4/+4 2004-11-09[PATCH] H8/300 inline cleanupYoshinori Sato2-6/+4