介绍新的 C++ 插件
这篇文章介绍了一些我们一直在开发的用于 C++ 的新插件。这些插件可以构建 C++ 库和应用程序。它们在 macOS、Linux 和 Windows 上与 GCC、Clang 和 Visual C++/Visual Studio 兼容。
这些插件最终将取代软件模型插件,并利用 Gradle 核心中的许多新功能,例如丰富的依赖管理引擎、构建缓存、复合构建、更细粒度的并行执行、构建扫描 等等。有关背景信息,请参阅我们关于 Gradle 软件模型的状态和未来 的文章。
我们欢迎您对这些插件的任何反馈。您可以在 Gradle 论坛 上留下反馈,或在 Gradle native GitHub 存储库中提出问题。
构建应用程序
您可以在 Gradle 原生示例 GitHub 仓库中找到本文中的所有示例。让我们看看如何构建一个 简单的应用程序。
构建脚本对于任何使用过 Gradle 的 Java 插件的人来说应该很熟悉。
plugins {
id 'cpp-application'
}
此应用程序没有依赖项,C++ 源文件和头文件位于默认位置:src/main/cpp
目录。由于这是 Gradle,您可以轻松地配置源位置以匹配项目的任何布局,包括将所有内容放在一个目录中的常见模式。
以下是运行 ./gradlew assemble
在此示例上的结果
查看此构建的构建扫描,以更详细地了解发生了什么。
这些插件会自动查找编译器、链接器和其他工具来构建应用程序。最终结果将安装在 build/install
目录中,随时可以运行。
IDE 支持
目前支持 Xcode 用于 C++ 项目。您只需运行 ./gradlew xcode
并打开生成的 workspace。对生成 Visual Studio 解决方案的支持将在今年早些时候添加,对其他 IDE 的支持将在之后逐步添加。
以下是运行 ./gradlew xcode
在此示例上的结果
这是 workspace 在 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 'http://localhost:8000/'
}
}
dependencies {
implementation 'org.gradle.cpp-samples:math:1.5'
}
以下是运行 ./gradlew assemble
的结果。Gradle 下载头文件和共享库二进制文件,并针对这些文件进行编译和链接
构建扫描显示了更多详细信息,包括下载。
以下是此项目在 Xcode 中的外观
测试
基本单元测试开箱即用。这里有一个使用 Google Test 的示例,从 Maven 仓库下载。我们使用这个Google Test 的分支发布了二进制文件,它只是添加了一个 Gradle 构建。
构建脚本声明了对 Google Test 的依赖关系和一个 Maven 仓库,该仓库可用于定位 Google Test 二进制文件
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 'http://localhost:8000/'
}
}
}
以下是运行./gradlew publish
的结果
复合构建
复合构建的工作方式与 Java 项目中的相同。这个使用复合构建的示例组合了构建,以便它们可以一起进行工作
rootProject.name = 'app'
includeBuild 'list-library'
includeBuild 'utilities-library'
以下是 Xcode 中的结果。应用程序及其使用的库可供一起编辑、构建和测试
最后,为我们的应用程序设置 CI 构建很容易。我们已经添加了Travis CI 的配置。
我们需要您的反馈
这些插件仍在开发中,存在一些限制。例如,二进制发布目前还不支持操作系统或架构。我们将继续改进这些插件,使其稳定,并最终弃用软件模型插件。
请尝试使用这些插件并告诉我们您的想法。最简单的入门方法是克隆 原生示例 仓库并按照说明进行操作。我们的示例使用 Gradle nightly build,因此您将在其中看到最新和最棒的开发成果。一些更改已在 4.5 发布候选版本 中出现。
我们很乐意听取您对哪些功能有效、哪些功能令人困惑以及哪些功能缺失会阻碍您使用 Gradle 构建 C++ 软件的意见。您也可以在 Gradle 论坛 上留下反馈,或在 Gradle 原生 GitHub 仓库中提出问题。