clang-tidy-10使用compile_commands.json相对路径失效问题咨询
clang-tidy对compile_commands.json相对路径的支持规则
原生clang-tidy不支持directory字段填写相对路径,网络上的讨论分歧基本来自不同工具的额外处理逻辑:
- 声称相对路径可用的场景,基本是使用了ccls、CLion、VS Code C/C++插件这类工具,这类工具在加载compile_commands.json时会自行将相对路径解析为绝对路径再传给clang-tidy,或者自带独立的编译数据库解析逻辑,和clang-tidy本身的实现无关
- 直接调用官方编译的原生clang-tidy二进制时,
directory字段必须为绝对路径,这是LLVM内置CompilationDatabase模块的固定逻辑:clang-tidy匹配编译命令前会先把传入的源文件转为绝对路径,如果directory是相对值,它无法正确拼接出条目对应的源文件绝对路径,就会触发找不到编译命令的报错。
复现验证(无IDE原生命令行环境)
测试排除了所有IDE、封装脚本的干扰,直接调用原生clang-tidy:
- 正常工作的配置(绝对路径directory)
compile_commands.json内容:
[ { "arguments": [ "gcc", "test.cpp" ], "directory": "/home/user/development/sandbox/comp_commands", "file": "test.cpp" } ]
测试源码test.cpp:
bool is_it() { // no return value - give clang warning }
在两个文件所在目录执行clang-tidy test.cpp,可正常识别编译命令并输出预期警告:
[user] comp_commands$ clang-tidy test.cpp 1 warning generated. test.cpp:4:1: warning: non-void function does not return a value [clang-diagnostic-return-type] }
- 异常场景(directory改为相对路径
.)
仅修改directory字段值为相对路径.,其余配置不变,执行相同命令直接报错:
[user] comp_commands$ clang-tidy test.cpp Skipping /home/user/development/sandbox/comp_commands/test.cpp. Compile command not found.
相对路径业务需求的适配方案
如果业务场景需要工程目录可迁移、不想硬编码固定绝对路径,无需修改clang-tidy逻辑,只要调整compile_commands.json的生成规则即可:
脚本生成配置时,动态获取当前运行环境下对应目录的绝对路径写入directory字段即可。例如Python生成逻辑中用os.path.abspath()将相对目录转为绝对路径后写入json,生成的配置不会绑定固定的工程父目录,工程拷贝到其他位置后重新执行生成脚本就能正常使用,完全适配可迁移的需求。
内容的提问来源于stack exchange,提问作者code_fodder
相关产品推荐
相关产品推荐

