使用Clang作为库 —— 如何为 LLVM 设置 Clang Tooling

阅读: 评论:0

使用Clang作为库 —— 如何为 LLVM 设置 Clang Tooling

使用Clang作为库 —— 如何为 LLVM 设置 Clang Tooling

如何为 LLVM 设置 Clang Tooling

      • 1. 介绍
      • 2. 使用 CMake 和 Make 设置 Clang Tooling
      • 3. 使用 Clang 工具
      • 4. (实验)使用 Ninja 构建系统

本文为译文,点击 此处查看原文。

Clang Tooling提供了编写需要有关程序的语法和语义信息的工具的基础设施。这个术语还涉及使用这个基础设施的一组特定工具(例如clang-check)。本文档提供了关于如何为LLVM源代码设置和使用Clang Tooling的信息。

1. 介绍

Clang Tooling需要一个编译数据库(compilation database)来确定每个文件的特定构建选项。目前,它可以从compile_commands.json文件创建一个编译数据库,由 CMake 生成。在调用 clang 工具时,可以使用命令行参数-p指定构建目录的路径,或者让Clang Tooling在源文件树中找到这个文件。在这两种情况下,您都需要使用 CMake 配置您的构建,以使用 clang 工具。

2. 使用 CMake 和 Make 设置 Clang Tooling

如果您打算使用 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

3. 使用 Clang 工具

完成前面的步骤之后,就可以运行 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();
}

4. (实验)使用 Ninja 构建系统

您还可以选择使用 Ninja 构建系统而不是 make。它的目标是使您的构建更快。目前,这一步将需要从源代码构建Ninja

要利用Clang ToolsNinja构建,您至少需要 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小时内删除。

标签:何为   Clang   Tooling   LLVM
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23