gpt4 book ai didi

cmake - 使用cmake为单个目标生成编译数据库

转载 作者:行者123 更新时间:2023-12-03 21:27:48 24 4
gpt4 key购买 nike

我正在使用 CMAKE_EXPORT_COMPILE_COMMANDS cmake 的变量获取一个 json 编译数据库,然后我可以解析该数据库以识别为每个源文件提供给编译器的选项。现在,我正在处理的项目有多个目标,并且在数据库中的不同目标中使用了多次源文件,如下面的示例所示:
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.dirtest2.dir路径组件。

最佳答案

显然这个功能已经在大约 3 个月前的合并请求中实现了:https://gitlab.kitware.com/cmake/cmake/-/merge_requests/5651
从那里我引用:

The new target property EXPORT_COMPILE_COMMANDS associated with theexisting global variable can be used to optionally configure targets fortheir compile commands to be exported.


因此,您现在似乎可以在各个目标上设置一个属性,以控制它们是否包含在生成的数据库中。

此功能是 cmake 3.20 的一部分。官方文档: https://cmake.org/cmake/help/latest/prop_tgt/EXPORT_COMPILE_COMMANDS.html

关于cmake - 使用cmake为单个目标生成编译数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49016102/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com