I’m working on switching over to NixOS on my desktop and one of the last things I haven’t got fully working is my neovim config. My LSP’s are able to start, and all of them work fine except for clangd. For some reason, it can’t find C/C++ header files for any installed libraries. I have all of the LSPs themselves installed through Mason in Neovim, and I have programs.nix-ld.enable = true enabled so they can be run correctly.

screenshot showing 'file not found' error on '#include <fcntl.h>'

screenshot showing 'file not found' error on '#include <SDL2/SDL2.h>'

Here is the shell.nix file I’m using for this project:

{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell.override { stdenv = pkgs.gccStdenv; } {
  nativeBuildInputs = with pkgs.buildPackages; [
    glibc libgcc
    clang-tools libclang
    SDL2 SDL2_image SDL2_sound
  ]; 
  CPATH = pkgs.lib.makeSearchPathOutput "dev" "include" pkgs.glibc pkgs.SDL2 pkgs.SDL2_Image pkgs.SDL2_sound;
}

Is there something extra I need to do to get clangd to find the C headers being used by the project? when I actually run gcc it compiles fine, it just can’t seem to find them correctly in Neovim

Edit: Forgot to mention that I’m using this shell with direnv and launching nvim directly from the same shell that I’m compiling from

  • Euphoma@lemmy.ml
    link
    fedilink
    English
    arrow-up
    3
    ·
    16 days ago

    i have a .clangd file with

    CompileFlags:
        Add: [
        CompilationDatabase: /src/
    -Wall,
    -I/nix/store/vm10zh43xgfxvgrqs8brz6v6xyrq9qin-glibc-2.40-66-dev/include,
    -I/nix/store/64819v2lcdbdqqb52gyqpic3khn4hvyf-libcxx-19.1.7-dev/include,
    -I/nix/store/f4x7z33ymmqn0m0pvi5ydxifsfmic1jw-raylib-5.5/include,
    -I/nix/store/wakcjb523m43qbm4xblyqm7rgg9l9s32-glu-9.0.3-dev/include,
    -I/nix/store/8xbbdx4ckcdj76ldb0cbym965whipq72-libglvnd-1.7.0-dev/include,
    -I/nix/store/b5i8r0l5bnaj8khjz4lsmsdph8dkha3s-libX11-1.8.12-dev/include,
    -I/nix/store/l1qkka1svxk8s0myynmb6kgl0ni19mjk-xorgproto-2024.1/include,
    -I/nix/store/y91x77rjip3i5zdza2ikf2lj80qc0286-libxcb-1.17.0-dev/include,
    -I/nix/store/95hqc5scvz3vxhs0p1crx9rr5r1sfs1i-compiler-rt-libc-19.1.7-dev/include,
    -I/nix/store/64819v2lcdbdqqb52gyqpic3khn4hvyf-libcxx-19.1.7-dev/include,
    -I/nix/store/f4x7z33ymmqn0m0pvi5ydxifsfmic1jw-raylib-5.5/include,
    -I/nix/store/wakcjb523m43qbm4xblyqm7rgg9l9s32-glu-9.0.3-dev/include,
    -I/nix/store/8xbbdx4ckcdj76ldb0cbym965whipq72-libglvnd-1.7.0-dev/include,
    -I/nix/store/b5i8r0l5bnaj8khjz4lsmsdph8dkha3s-libX11-1.8.12-dev/include,
    ]
    

    and a create-clangd.py

       3 includes = []
       4 with open("./src/compile_commands.json", 'r') as f:
       5     lines = f.readlines()
       6     for line in lines:
       7         if "include" in line:
       8             includes += [line[1:-2].strip()]
       9
      10 s = """
      11 CompileFlags:
      12     Add: [
      13     CompilationDatabase: /src/
      14 -Wall,
      15 """
      16
      17 for include in includes:
      18     s += "-I" + include[1:-1] + ",\n"
      19
      20 s += "]"
      21 print(s)
      22
      23 with open(".clangd", 'w') as file:
      24     file.write(s)
    

    I forgot how I made the compile-commands.json file. I think I used a program called bear.

    I also don’t code cpp normally, I just did this for one small project, so it might be a bad solution