我正在使用CMAKE_EXPORT_COMPILE_COMMANDS
的{{1}}变量来获取一个json编译数据库,然后我可以解析该数据库以识别为每个源文件提供给编译器的选项。现在,我正在处理的项目有几个目标,并且在数据库中的不同目标中使用了几次源文件,如下例所示:
cmake
:
f.c
int main () { return MACRO; }
:
CMakeLists.txt
正在运行cmake_minimum_required (VERSION 2.6)
project (Test)
add_executable(test1 f.c)
add_executable(test2 f.c)
target_compile_options(test1 PUBLIC -DMACRO=1)
target_compile_options(test2 PUBLIC -DMACRO=2)
将生成以下cmake . -DCMAKE_EXPORT_COMPILE_COMMANDS=1
文件,其中包含compile-commands.json
的两个条目,并且没有简单的方法来区分它们。
f.c
我正在寻找一种方法来指明我只对例如目标[
{
"directory": "/home/virgile/tmp/cmakefile",
"command": "/usr/bin/cc -DMACRO=1 -o CMakeFiles/test1.dir/f.c.o -c /home/virgile/tmp/cmakefile/f.c",
"file": "/home/virgile/tmp/cmakefile/f.c"
},
{
"directory": "/home/virgile/tmp/cmakefile",
"command": "/usr/bin/cc -DMACRO=2 -o CMakeFiles/test2.dir/f.c.o -c /home/virgile/tmp/cmakefile/f.c",
"file": "/home/virgile/tmp/cmakefile/f.c"
}
]
,就像您在使用test1
的构建工具模式中所做的那样,最好不必修改--target
,但这不是一个主要问题。另一方面,我想避免的是阅读CMakeLists.txt
条目中-o
的参数,并区分"command"
和test1.dir
路径组件。
答案 0 :(得分:4)
显然,此功能已在大约 3 个月前的合并请求中实现:https://gitlab.kitware.com/cmake/cmake/-/merge_requests/5651
从那里我引用:
<块引用>新的目标属性 EXPORT_COMPILE_COMMANDS 与 现有的全局变量可用于选择性地配置目标 要导出的编译命令。
因此,您现在似乎可以在各个目标上设置一个属性,以控制它们是否包含在生成的数据库中。
此功能是 cmake 3.20 的一部分。官方文档:https://cmake.org/cmake/help/latest/prop_tgt/EXPORT_COMPILE_COMMANDS.html
答案 1 :(得分:1)
目前似乎不支持此功能。 CMake问题跟踪器中对此有一个要求:https://gitlab.kitware.com/cmake/cmake/issues/19462