介绍新的 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 中的样子
依赖 #
该插件使用 Gradle 的 依赖管理 功能,就像其他插件(例如 Java 或 Android 插件)一样。 这意味着,例如,传递依赖关系可以正常工作。
让我们为应用程序添加对库的依赖。 在 此示例 中,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://127.0.0.1:8000/'
}
}
dependencies {
implementation 'org.gradle.cpp-samples:math:1.5'
}
这是运行 ./gradlew assemble
的结果。 Gradle 下载头文件和共享库二进制文件,并针对它们进行编译和链接
构建扫描显示了更多详细信息,包括下载。
这是此项目在 Xcode 中的样子
测试 #
开箱即用地支持基本单元测试。 这是一个使用 Google Test 的 示例,从 Maven 存储库下载。 我们使用 Google Test 的 这个 fork 发布了二进制文件,它只是添加了一个 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://127.0.0.1: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 存储库上提出问题。