xmake-io / xmake

🔥 A cross-platform build utility based on Lua
https://xmake.io
Apache License 2.0
10.04k stars 785 forks source link

Use full compiler path in generated compile_commands.json #1721

Closed xq114 closed 3 years ago

xq114 commented 3 years ago

你在什么场景下需要该功能?

在windows上使用cuda时,xmake生成的compile_commands.json为

[{
  "directory": "C:\\Users\\xq114\\_tmp\\snippets\\testcuda",
  "arguments": ["C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v11.4\\bin\\nvcc", "-c", "-I", "C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v11.4\\include", "-m64", "-o", "build\\.objs\\main\\windows\\x64\\release\\main.cu.obj", "main.cu"],
  "file": "main.cu"
}]

但vscode不能识别这种写法,会报错找不到nvcc这个文件,必须加上后缀名.exe才能正常工作,即

[{
  "directory": "C:\\Users\\xq114\\_tmp\\snippets\\testcuda",
  "arguments": ["C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v11.4\\bin\\nvcc.exe", "-c", "-I", "C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v11.4\\include", "-m64", "-o", "build\\.objs\\main\\windows\\x64\\release\\main.cu.obj", "main.cu"],
  "file": "main.cu"
}]

描述可能的解决方案

在compile_commands.json中使用完整的编译器路径

waruqi commented 3 years ago

我这边兼容了下,但是我觉得这应该提到 vscode/c++ 那边让他们支持才是正解。。

xq114 commented 3 years ago

我这边兼容了下,但是我觉得这应该提到 vscode/c++ 那边让他们支持才是正解。。

不是扩展名的问题,是vscode要求表示编译器的那个文件存在,无论是什么文件名;比如理论上nvcc和nvcc.exe可以是两个不同的编译器

waruqi commented 3 years ago

理论上只需要给的路径能运行,CreateProcess 能带起来 intelligense 就能跑,只能说明 vscode 要求过于严了而已。。

非得要文件存在,那如果是加了 path 只有 cl.exe 名字呢,不是也不行了,像 mac 上有时候还是 xcrun -sdk iphoneos clang这种的

目前这边只能做到 patch .exe 的workaround 方案,其他就不改了