Clang 如何在基于libtooling的工具中获取编译命令

Clang 如何在基于libtooling的工具中获取编译命令,clang,llvm,libtooling,compilation-database,Clang,Llvm,Libtooling,Compilation Database,我已经构建了一个用于转换源代码的自定义工具(基于libtooling)。我使用了clang自己的教程,并设法运行了自己的自定义FrontendAction。现在,我需要解析提供给工具(在命令行上)的编译标志,以自定义转换。然而,无论我做什么,CompileDatabase似乎总是返回一个空的编译命令列表 这是示例代码: #包括“clang/Tooling/CommonOptionsParser.h” #包括“叮当声/工具/工具.h” 静态cl::OptionCategory MyToolCate

我已经构建了一个用于转换源代码的自定义工具(基于libtooling)。我使用了clang自己的教程,并设法运行了自己的自定义FrontendAction。现在,我需要解析提供给工具(在命令行上)的编译标志,以自定义转换。然而,无论我做什么,CompileDatabase似乎总是返回一个空的编译命令列表

这是示例代码:

#包括“clang/Tooling/CommonOptionsParser.h”
#包括“叮当声/工具/工具.h”
静态cl::OptionCategory MyToolCategory(“自定义工具”);
静态cl::extrahelp MoreHelp(“\n更多帮助文本…”);
int main(int argc,常量字符**argv)
{
CommonOptionParser op(argc、argv、MyToolCategory);//解析命令行参数
CompilationDatabase&Compilations=op.getCompilations();
for(const auto&cmd:Compilations.getAllCompileCommand()){//编译数据库
编译数据库(compile_commands.json)为空或不存在。从技术上讲,所有编译命令都是数据库中的所有命令,因此为空

然后,clang如何使用我提供的选项 Clang围绕
CompliationDatabase
对象创建一个特殊的包装器,该包装器将这些选项添加到询问此
CompliationDatabase
的任何文件中,即使此文件不在数据库中,也不存在

那么,我怎样才能获得这些信息呢 您可以迭代源代码列表并要求(aka
getCompileCommands
)数据库为该特定文件提供命令,而不是迭代编译命令

工作演示
#包括“clang/Tooling/CommonOptionsParser.h”
使用名称空间铿锵;
使用名称空间工具;
使用名称空间llvm;
静态cl::OptionCategory MyToolCategory(“自定义工具”);
静态cl::extrahelp MoreHelp(“\n更多帮助文本…”);
无效打印(常量标准::向量和命令){
if(Commands.empty()){
返回;
}
对于(自动选择:命令[0]。命令行){

这正是我想要的。谢谢!
> ./myTool test.cpp -- -I/some/include/path -std=gnu11
filename: test.cpp
opts:
    $PATH_TO_MYTOOL_EXEC/clang-tool
    -I/some/include/path
    -std=gnu11
    test.cpp
fake filename: baloney.c
    $PATH_TO_MYTOOL_EXEC/clang-tool
    -I/some/include/path
    -std=gnu11
    baloney.c