Gradle + LLVM

对于那些想快速开始使用LLVM而不用担心下载源代码和构建框架的人来说,这篇简短的帖子可能会有用。 谁不想在晦涩的CMake脚本中四处探寻以达到预期的结果,最后,只是为了偷懒:)

我将告诉您如何优雅地做到这一点,在Gradle构建脚本中只需几行。

面对在LLVM下编写代码的需求,我意识到了这一点。 :)“命中”已经在项目构建的配置阶段。 我需要在Linux和Windows下统一构建该项目。 不用说,每次与项目一起我都根本不想构建整个LLVM。 而且,起初,我依靠其官方站点上的库的预构建版本,但事实证明,实际上,只有Linux二进制文件没有RTTI和异常。 在Windows下,有一个安装程序,但是尽管它仅在clang中被称为LLVM-xxx-win64.exe

好吧,在构建的附录中,有一个CMake系统,在其中,要在Linux发行版中进行构建,您需要在配置阶段进行设置:

cmake -DCMAKE_BUILD_TYPE=Release 

在Windows下,由于某种原因,这还不够,您仍然必须在build命令本身中另外更改配置:

 cmake --build . --config Release 

总的来说,我决定将目光投向Gradle并编写一个优秀的插件,该插件会为我配置构建麻烦,并使我免于不必要的例行工作,而只剩下最必要和最高级的内容。

实际上,下面的讨论将只关于他: cpp-llvm
这是与LLVM集成所需的最低配置:

 plugins { id 'org.bitbucket.akornilov.cpp-llvm' version '0.1' } llvm { version = '9.0.0' // Required version. } 

工作要求:

  • 已安装Java(8或更高版本)。
  • 已安装Gradle(在撰写本文时,我使用的是最新版本5.6.2,并且未在旧版本上测试该插件)
  • Linux上的Gcc / CLang(版本至少支持C ++ 11)。
  • Windows上的MSVC 2019(例如Community Edition)。
  • 该插件应与“ cpp-application”或“ cpp-library”一起使用。
  • 在首次构建时访问网络以下载LLVM二进制文件(或脱机模式,请参见下文)。

支持的LLVM版本:

  • 9.0.0
  • 8.0.0

在Windows(msvc 2019)和Linux(Debian 10.0 + CLang 10.0)上针对x86_64的非官方构建。 内置启用了RTTI的功能,并且有两个版本的Release和Debug例外。

  • 7.1.0
  • 7.0.1
  • 7.0.0
  • 6.0.1
  • 6.0.0
  • 5.0.2
  • 5.0.1
  • 5.0.0
  • 4.0.1
  • 4.0.0
  • 3.9.1
  • 3.9.0
  • 3.8.1
  • 3.8.0
  • 3.7.1
  • 3.7.0
  • 3.6.2
  • 3.6.1
  • 3.6.0
  • 3.5.2
  • 3.5.1
  • 3.5.0
  • 3.4.2
  • 3.4.1
  • 3.4
  • 3.3
  • 3.2
  • 3.1
  • 3.0

官方构建自LLVM服务器,在Linux下只有x86_64(RTTI已关闭)和例外。

要查看当前平台支持的版本列表,可以使用以下命令:

 gradle llvmVersions 

 > Task :llvm-app:llvmVersions 9.0.0 8.0.0 BUILD SUCCESSFUL in 2s 1 actionable task: 1 executed 

构建所需的所有LLVM二进制文件都将加载到本地缓存中(在用户目录的gradle文件夹中),并重新用于其他构建。

刚开始时,准备工作可能会花费大量时间,因为 将从网络上下载大约300MB(用于调试版本)或30MB(用于发布版本)(官方版本的重量也约为300MB)。

仅使用静态链接。 由于某些未知原因,生成LLVM绑定无法在MSVC下创建动态库。

其他插件配置


您可以指定一个特定的地址,以使用二进制文件(.tar.xz或.tar.gz)下载档案。


 llvm { version = '7.0.1' serverUrl = 'http://releases.llvm.org/7.0.1/clang%2bllvm-7.0.1-x86_64-linux-gnu-ubuntu-18.04.tar.xz' } 

最主要的是,指定的版本(版本= xxx)与选择下载的归档文件中的真实版本一致,否则构建配置可能不正确。

您可以自主使用现成的LLVM二进制文件(自己下载或构建)


 llvm { version = '7.0.1' localPath = '<path to unpacked LLVM build>' } 

localPath应该指向本地文件系统上的现有文件夹,该插件希望在该文件夹中看到子目录``include''和``lib'',即 官方版本中使用的目录结构。 如果自调整后您具有不同的文件夹结构,则需要对其进行“梳理”。 :)

如前所述,这些版本也应匹配。
在这种情况下,不会从网络加载与LLVM相关的任何内容。

使用单个组件:


 llvm { version = '9.0.0' components = ['Engine', 'OrcJIT'] } 

如果仅使用LLVM的特定部分,那么您当然需要注意此参数。 例如,如果仅需要OrcJIT,为什么要链接所有一百四十五个静态库? 特定组件的选择将大大延长链接器的使用寿命,并节省时间。

可以找到所有可用组件的列表,如下所示:

 gradle llvmComponents 

在Linux上,如果使用此选项,则可以大大减少调试版本中的链接时间。


 llvm { version = '9.0.0' forceReleaseLinux = true } 

在这种情况下,LLVM的强制版本用于构建的调试版本。 在大多数情况下,除非您需要调试LLVM本身,否则我建议使用它。 此参数不会影响Windows上的程序集,因为不幸的是,MSVC 2019不允许在一个内部版本中混合发行版本和发行库。

好吧,总之,当然,我建议将此插件与其他插件一起使用:),可以在本文中阅读。

cpp-build-tuner将帮助优化编译时间和生成的二进制文件的大小。

cpp-ide-generator可以使您轻松与多个IDE集成,在这些IDE的配置中,将已经有LLVM标头的路径,并且IDE将能够正确地对其进行索引。



使用cpp-ide-generator时可能出现的问题:

 FAILURE: Build failed with an exception. * What went wrong: A problem occurred configuring project ':llvm-app'. > Cannot change dependencies of configuration ':llvm-app:cppCompileDebug' after it has been resolved. 

如果您看到了这一点,则仅意味着应该在cpp-llvm之后添加cpp-ide-generator,如下所示:

 plugins { id 'cpp-application' id 'org.bitbucket.akornilov.cpp-build-tuner' version '0.7' id 'org.bitbucket.akornilov.cpp-llvm' version '0.1' id 'org.bitbucket.akornilov.cpp-ide-generator' version '0.5' } 

可以在此处找到使用插件的完整示例。

UPD:
发布了新版本的cpp-llvm v0.3插件:

  1. llvmCleanCache任务,以清除用户本地缓存中的所有LLVM下载。
  2. 添加了对动态链接的支持。 当前仅支持Windows / Linux,GCC / MinGW-W64 / CLang和MSVC版本9.0.0

 llvm { version = '9.0.0' linkage = Linkage.SHARED } 


UPD

与托管插件的更改有关,该组已更改:
 plugins { id 'loggersoft.cpp-llvm' version '0.5' } 

新项目地址: gradle-cpp.sourceforge.io
文档: sourceforge.net/p/gradle-cpp/wiki/cpp-llvm

Source: https://habr.com/ru/post/zh-CN469855/


All Articles