Clang Tooling
提供了编写需要有关程序的语法和语义信息的工具的基础设施。这个术语还涉及使用这个基础设施的一组特定工具(例如clang-check
)。本文档提供了关于如何为LLVM源代码设置和使用Clang Tooling
的信息。
Clang Tooling
需要一个编译数据库(compilation database)来确定每个文件的特定构建选项。目前,它可以从compile_commands.json
文件创建一个编译数据库,由 CMake 生成。在调用 clang 工具时,可以使用命令行参数-p
指定构建目录的路径,或者让Clang Tooling
在源文件树中找到这个文件。在这两种情况下,您都需要使用 CMake 配置您的构建,以使用 clang 工具。
如果您打算使用 make 来构建 LLVM,您应该安装了 CMake 2.8.6 或更高版本(可以在这里找到)。
首先,需要使用 CMake 为 LLVM 生成 Makefiles。您需要新建一个build目录,并在此目录下运行 CMake:
$ mkdir your/build/directory
$ cd your/build/directory
$ cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON path/to/llvm/sources
如果您希望使用 clang 而不是 GCC,可以添加-DCMAKE_C_COMPILER=/path/to/clang -DCMAKE_CXX_COMPILER=/path/to/clang++
。您还可以使用ccmake
,它提供了一个curses接口
来为懒惰的人配置 CMake 变量。
因此,新的compile_commands.json
文件应该出现在当前目录中。你应该把它链接到LLVM源代码树
,这样Clang Tooling
就可以使用它:
$ ln -s $PWD/compile_commands.json path/to/llvm/source/
现在您可以使用 make 来构建和测试 LLVM 了:
$ make check-all
完成前面的步骤之后,就可以运行 clang 工具了。如果您最近安装了 clang,您应该在$PATH
中有clang-check
。试着在LLVM源代码树
中的任何.cpp
文件上运行它:
$ clang-check tools/clang/lib/Tooling/CompilationDatabase.cpp
如果您正在使用 vim,那么可以方便地集成clang-check
。把下面的代码放进你的.vimrc
:
function! ClangCheckImpl(cmd)if &autowrite | wall | endifecho "Running " . a:cmd . " ..."let l:output = system(a:cmd)cexpr l:outputcwindowlet w:quickfix_title = a:cmdif v:shell_error != 0ccendiflet g:clang_check_last_cmd = a:cmd
endfunctionfunction! ClangCheck()let l:filename = expand('%')if l:filename =~ '.(cpp|cxx|cc|c)$'call ClangCheckImpl("clang-check " . l:filename)elseif exists("g:clang_check_last_cmd")call ClangCheckImpl(g:clang_check_last_cmd)elseecho "Can't detect file's compilation arguments and no previous clang-check invocation!"endif
endfunctionnmap <silent> <F5> :call ClangCheck()<CR><CR>
当编辑一个.cpp/.cxx//.c
文件时,按F5
重新解析该文件。如果当前文件具有不同的扩展名(例如.h
), F5
将重新运行这个vim 实例(如果有的话)执行的最后一次clang-check
调用。输出将进入错误窗口,当clang-check
发现错误时自动打开,可以用:cope
重新打开。
其他clang-check
选项,当与 clang AST 一起工作时可能是有用的:
-ast-print
—— 构建 ASTs,然后形式地打印(pretty-print)它们。-ast-dump
—— 构建 ASTs,然后调试转储它们。-ast-dump-filter=<string>
—— 与-ast-dump
或-ast-print
一起使用,以转储/打印(dump/print) AST 声明节点,这些节点的限定名(qualified name)具有特定子字符串。使用-ast-list
列出所有可筛选的声明节点名。-ast-list
—— 构建 ASTs 并打印声明节点限定名的列表。例子:
$ clang-check tools/clang/tools/clang-check/ClangCheck.cpp -ast-dump -ast-dump-filter ActionFactory::newASTConsumer
Processing: tools/clang/tools/clang-check/ClangCheck.cpp.
Dumping ::ActionFactory::newASTConsumer:
clang::ASTConsumer *newASTConsumer() (CompoundStmt 0x44da290 </home/alexfh/local/llvm/tools/clang/tools/clang-check/ClangCheck.cpp:64:40, line:72:3>(IfStmt 0x44d97c8 <line:65:5, line:66:45><<<NULL>>>(ImplicitCastExpr 0x44d96d0 <line:65:9> '_Bool':'_Bool' <UserDefinedConversion>
...
$ clang-check tools/clang/tools/clang-check/ClangCheck.cpp -ast-print -ast-dump-filter ActionFactory::newASTConsumer
Processing: tools/clang/tools/clang-check/ClangCheck.cpp.
Printing <anonymous namespace>::ActionFactory::newASTConsumer:
clang::ASTConsumer *newASTConsumer() {if (this->ASTList.operator _Bool())return clang::CreateASTDeclNodeLister();if (this->ASTDump.operator _Bool())return clang::CreateASTDumper(nullptr /*Dump to stdout.*/,this->ASTDumpFilter);if (this->ASTPrint.operator _Bool())return clang::CreateASTPrinter(&llvm::outs(), this->ASTDumpFilter);return new clang::ASTConsumer();
}
您还可以选择使用 Ninja 构建系统而不是 make。它的目标是使您的构建更快。目前,这一步将需要从源代码构建Ninja
。
要利用Clang Tools
和Ninja
构建,您至少需要 CMake 2.8.9。
克隆 Ninja git 仓库,从源代码构建Ninja
:
$ git clone git://github/martine/ninja.git
$ cd ninja/
$ ./bootstrap.py
这将在当前目录中生成一个二进制文件ninja
。它不需要安装,可以复制到$PATH
中的任何位置,比如/usr/local/bin/
:
$ sudo cp ninja /usr/local/bin/
$ sudo chmod a+rx /usr/local/bin/ninja
完成所有这些之后,您将需要使用 CMake 为 LLVM 生成Ninja
构建文件。你需要新建一个build
目录,并在此目录下运行CMake
:
$ mkdir your/build/directory
$ cd your/build/directory
$ cmake -G Ninja -DCMAKE_EXPORT_COMPILE_COMMANDS=ON path/to/llvm/sources
如果您希望使用 clang 而不是 GCC,可以添加-DCMAKE_C_COMPILER=/path/to/clang -DCMAKE_CXX_COMPILER=/path/to/clang++
。您还可以使用ccmake
,它以互动的方式提供了一个curses接口
来配置 CMake 变量。
因此,新的compile_commands.json
文件应该出现在当前目录中。你应该把它链接到LLVM源代码树
,这样Clang Tooling
就可以使用它:
$ ln -s $PWD/compile_commands.json path/to/llvm/source/
现在你可以使用Ninja
来构建和测试LLVM了:
$ ninja check-all
其他目标名称可以使用与 make 相同的方法。
本文发布于:2024-02-02 06:24:02,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170682624341959.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |