generate_clangd/
generate_clangd.rs

1use std::{env, fs};
2
3use openvm_scripts::{find_cuda_include_dirs, get_cuda_dep_common_include_dirs};
4use serde::Serialize;
5
6#[derive(Serialize)]
7struct CompileFlags {
8    #[serde(rename = "Add")]
9    add: Vec<String>,
10}
11
12#[derive(Serialize)]
13struct Diagnostics {
14    #[serde(rename = "UnusedIncludes")]
15    unused_includes: String,
16    #[serde(rename = "MissingIncludes")]
17    missing_includes: String,
18}
19
20#[derive(Serialize)]
21struct ClangdConfig {
22    #[serde(rename = "CompileFlags")]
23    compile_flags: CompileFlags,
24    #[serde(rename = "Diagnostics")]
25    diagnostics: Diagnostics,
26}
27
28fn main() -> eyre::Result<()> {
29    let workspace_root = env::current_dir()?;
30    println!(
31        "Generating .clangd for workspace: {}",
32        workspace_root.display()
33    );
34
35    let include_dirs = find_cuda_include_dirs(&workspace_root);
36    let common_include_dirs = get_cuda_dep_common_include_dirs();
37
38    println!("Found {} include directories:", include_dirs.len());
39    for dir in &include_dirs {
40        match dir.strip_prefix(&workspace_root) {
41            Ok(rel) => println!("  - {}", rel.display()),
42            Err(_) => println!("  - {}", dir.display()),
43        }
44    }
45
46    let compile_flags: Vec<String> = include_dirs
47        .iter()
48        .chain(common_include_dirs.iter())
49        .map(|p| format!("-I{}", p.display()))
50        .chain([
51            "-x".into(),
52            "cuda".into(),
53            "-std=c++17".into(),
54            "--cuda-gpu-arch=sm_70".into(),
55            "-D__CUDA_ARCH__=700".into(),
56        ])
57        .collect();
58
59    let config = ClangdConfig {
60        compile_flags: CompileFlags { add: compile_flags },
61        diagnostics: Diagnostics {
62            unused_includes: "Strict".into(),
63            missing_includes: "Strict".into(),
64        },
65    };
66
67    let yaml = serde_yaml::to_string(&config)?;
68    let output_path = workspace_root.join(".clangd");
69    fs::write(&output_path, yaml)?;
70
71    println!(
72        "\n✅ .clangd file generated successfully at {}",
73        output_path.display()
74    );
75    println!("   Total include directories: {}", include_dirs.len());
76    println!("   Configuration will apply to all .cu and .cuh files in the repository");
77
78    Ok(())
79}