generate_clangd/
generate_clangd.rs1use 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}