我想生成一个
compile_commands.json
文件以与 clangd 语言服务器一起使用。然而,EXPORT_COMPILE_COMMANDS
仅适用于 make 和 ninja 构建系统。当构建使用不同构建系统的项目时,还可以很方便地生成 compile_commands.json
文件,就像我使用 make 或 ninja 一样,而无需实际生成任何干扰我正在使用的构建系统的构建文件。执行构建。
使用 cmake 执行此操作最方便的方法是什么?
我认为你唯一的选择是使用 Ninja 或 Makefile 建立一个不同的构建文件夹来生成
compile_commands.json
并为你的“实际”构建建立一个不同的构建文件夹。
问题是,CMake 是一个生成器,它不支持混合构建;事实上,不应该。如果他们这样做,您最终将在构建文件夹内获得来自不同构建系统的随机工件,这些工件最终可能会相互冲突。
话虽如此,您知道您在基于 Ninja 的
compile_commands.json
中获得的内容不会与您想要使用的“实际”构建系统完全相关。我可以看到它很有用,但肯定不一样。
我的用例是生成
compile_commands.json
,以便在 Windows 上与 clang-tidy 一起使用,既没有安装任何类似 GNU 的工具链,也没有安装任何 make 程序。
受到https://stackoverflow.com/a/30642130/1945549的启发,我设法使用以下命令来做到这一点:
cmake.exe .. -G"MinGW Makefiles" -DCMAKE_MAKE_PROGRAM=echo -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_C_COMPILER=echo -DCMAKE_CXX_COMPILER=echo -DCMAKE_C_COMPILER_FORCED=ON -DCMAKE_CXX_COMPILER_FORCED=ON
请注意,
echo
可以替换为您选择的任何内容(它将在创建的compile_commands.json
中用作编译器),但它需要可调用(因此我选择echo
)。
供您参考使用简单的
CMakeLists.txt
生成的内容:
cmake_minimum_required(VERSION 3.23)
project(test)
add_executable(test main.cpp)
以及由此产生的
compile_commands.json
:
[
{
"directory": "C:/test/build",
"command": "C:\\Users\\rolands\\AppData\\Local\\Programs\\Git\\usr\\bin\\echo.exe -o CMakeFiles\\test.dir\\main.cpp.obj -c C:\\test\\main.cpp",
"file": "C:/test/main.cpp",
"output": "CMakeFiles/test.dir/main.cpp.obj"
}
]