介绍新的 C++ 插件
引言
本文介绍了一些我们一直在开发的新的 C++ 插件。这些插件可以构建 C++ 库和应用程序。它们可以在 macOS、Linux 和 Windows 上使用 GCC、Clang 和 Visual C++/Visual Studio 进行开发。
这些插件最终将取代软件模型插件,并利用 Gradle 核心的许多新功能,例如丰富的依赖管理引擎、构建缓存、复合构建、更细粒度的并行执行、构建扫描等等。有关背景信息,请参阅我们关于Gradle 软件模型的现状和未来的文章。
我们欢迎您对这些插件提出的任何反馈。您可以在 Gradle 论坛上留下反馈,或在 Gradle native GitHub 仓库上提出问题。
构建应用程序 #
您可以在 Gradle native samples GitHub 仓库中找到本文中的所有示例。让我们看看如何构建一个简单的应用程序。
对于使用过 Gradle Java 插件的任何人来说,此构建脚本看起来应该很熟悉
plugins {
id 'cpp-application'
}
此应用程序没有任何依赖项,C++ 源文件和头文件位于默认位置:src/main/cpp
目录。由于这是 Gradle,您可以轻松地配置源位置以匹配您项目的任何布局,包括将所有内容放在一个目录中的常见模式。
这是运行此示例的 ./gradlew assemble
的结果
请查看此构建的构建扫描以更详细地了解发生了什么。
这些插件会自动找到编译器、链接器和其他工具来构建应用程序。最终结果安装在 build/install
目录中,准备好运行。
IDE 支持 #
目前支持 Xcode 进行 C++ 项目开发。只需运行 ./gradlew xcode
并打开生成的工程文件即可。今年早些时候将添加对生成 Visual Studio 解决方案的支持,之后将逐步添加对其他 IDE 的支持。
这是在示例上运行 ./gradlew xcode
的结果
这就是 Xcode 中的工程文件样子
依赖项 #
该插件像 Java 或 Android 插件一样,使用 Gradle 的依赖管理功能。这意味着,例如,传递性依赖项也能正常工作。
让我们向应用程序添加一个库依赖项。在此示例中,C++ 库是从 Maven 存储库下载的。您无需手动将库安装到任何地方,并且运行构建的每个人都将使用构建脚本中指定的版本,而不是他们机器上安装的任何版本。
构建脚本定义了一个 Maven 存储库,并声明了对另一个示例 C++ 库的依赖项
repositories {
maven {
// In this sample, we used a local Maven repository,
// but Maven Central or Artifactory server can be used.
url 'https://:8000/'
}
}
dependencies {
implementation 'org.gradle.cpp-samples:math:1.5'
}
这是运行 ./gradlew assemble
的结果。Gradle 下载了头文件和共享库二进制文件,并与之进行编译和链接。
构建扫描显示了更多详细信息,包括下载内容。
项目在 Xcode 中的样子
测试 #
开箱即用即可支持基本的单元测试。这里有一个使用 Google Test 的示例,它从 Maven 存储库下载。我们使用此fork 的 Google Test 发布了二进制文件,它只是添加了一个 Gradle 构建。
构建脚本声明了对 Google Test 的依赖项以及可用于定位 Google Test 二进制文件的 Maven 存储库
plugins {
id 'cpp-unit-test'
}
repositories {
maven {
url 'https://repo.gradle.org/gradle/libs-snapshots-local/'
}
}
dependencies {
// Currently we have to encode the operating system and architecture in
// the dependency name. This will disappear in later releases
testImplementation 'org.gradle.cpp-samples:googletest_macosx_x86-64_4.5:1.9.0-SNAPSHOT'
}
这是运行 ./gradlew check
的结果。Gradle 下载 Google Test 库,编译 C++ 源文件和测试,然后运行测试。
今年晚些时候将为 Google Test 添加更丰富的报告、构建扫描支持、并行执行和过滤功能,之后将添加对其他 C++ 测试框架的支持。
快速构建 #
这些插件可以使用 Gradle 的新变体感知依赖管理来生产应用程序或库的调试和发布版本,以便调试版本与调试库二进制文件进行编译和链接,发布版本与发布库二进制文件进行编译和链接。当您构建调试版本(默认)时,Gradle 只构建您需要的库的调试版本,而不是构建所有内容。
开发人员和 CI 构建速度很快。C++ 编译是可缓存的任务,因此在使用构建缓存时,您可以避免不必要的长时间编译。 Gradle Enterprise 配备了构建缓存后端。您无需使用--parallel
选项,因为 Gradle 默认执行增量和并行编译和链接。
让我们运行一些使用构建缓存的干净构建
您可以看到第二次构建速度更快,因为结果是从构建缓存中获取的,而不是重新编译。构建扫描展示了非缓存构建和缓存构建。
发布 C++ 库 #
新的插件可以发布 C++ 库到 Maven 或 Ivy 存储库。稍后将添加对其他类型存储库的支持。这是我们之前看到的库的构建。
构建脚本添加了一个 Maven 存储库来发布二进制文件
plugins {
id 'cpp-library'
id 'maven-publish'
}
group = 'org.gradle.cpp-samples'
version = '1.5'
publishing {
repositories {
maven {
// In this sample, we used a local maven repository,
// but Maven Central or Artifactory server can be used.
url 'https://:8000/'
}
}
}
这是运行 ./gradlew publish
的结果
复合构建 #
复合构建在 Java 项目中的工作方式相同。这个使用复合构建的示例将构建组合在一起,以便它们可以协同工作。
rootProject.name = 'app'
includeBuild 'list-library'
includeBuild 'utilities-library'
Xcode 中的结果。应用程序及其使用的库可以一起编辑、构建和测试
最后,为我们的应用程序设置 CI 构建非常容易。我们已经添加了Travis CI 的配置。
您的反馈意见 #
这些插件仍在开发中,并且存在一些限制。例如,二进制发布还不支持操作系统或架构。我们将继续改进这些插件,使其稳定,并最终弃用软件模型插件。
请试用这些插件并告诉我们您的想法。开始使用的最简单方法是克隆native samples 仓库并按照说明进行操作。我们的示例使用Gradle nightly build,因此您可以在其中看到最新的开发成果。一些更改已经出现在4.5 候选版本中。
我们很想听听您认为哪些方面效果很好,哪些方面令人困惑,以及缺少哪些内容会阻止您使用 Gradle 构建 C++ 软件。您也可以在Gradle 论坛上留下反馈,或在 Gradle native GitHub 仓库上提出问题。