介绍新的 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 在此示例上的结果

./gradlew assemble

查看此构建的构建扫描,以更详细地了解发生了什么。

compile debug timeline

这些插件会自动查找编译器、链接器和其他工具来构建应用程序。最终结果将安装在 build/install 目录中,随时可以运行。

IDE 支持

目前支持 Xcode 用于 C++ 项目。您只需运行 ./gradlew xcode 并打开生成的 workspace。对生成 Visual Studio 解决方案的支持将在今年早些时候添加,对其他 IDE 的支持将在之后逐步添加。

以下是运行 ./gradlew xcode 在此示例上的结果

./gradlew xcode

这是 workspace 在 Xcode 中的外观

Xcode integration

依赖项

该插件使用 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 下载头文件和共享库二进制文件,并针对这些文件进行编译和链接

./gradlew assemble

构建扫描显示了更多详细信息,包括下载。

app assemble build scan network activity

以下是此项目在 Xcode 中的外观

Xcode integration

测试

基本单元测试开箱即用。这里有一个使用 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++ 源代码和测试,然后运行测试

./gradlew check

build scan for math check

更丰富的报告、构建扫描支持、并行执行和 Google Test 的过滤将在今年添加,之后将支持其他 C++ 测试框架。

快速构建

这些插件可以使用 Gradle 的新变体感知依赖管理生成应用程序或库的调试和发布版本,以便调试版本针对调试库二进制文件进行编译和链接,而发布版本针对发布库二进制文件进行编译和链接。当你构建调试版本时(默认情况下),Gradle 构建你需要的库的调试版本,而不是构建所有内容。

开发人员和 CI 构建速度很快。C++ 编译是一个可缓存的任务,因此在使用构建缓存时,你可以避免不必要的长时间编译。Gradle Enterprise 带有一个构建缓存后端。你不需要使用--parallel选项,因为 Gradle 默认情况下会进行增量和并行编译和链接。

让我们运行一些使用构建缓存的干净构建

./gradlew assemble with build cache

你可以看到第二次构建更快,因为结果是从构建缓存中获取的,而不是重新编译的。非缓存构建缓存构建的构建扫描。

cached vs non-cached assemble

发布 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的结果

./gradlew publish

复合构建

复合构建的工作方式与 Java 项目中的相同。这个使用复合构建的示例组合了构建,以便它们可以一起进行工作

rootProject.name = 'app'

includeBuild 'list-library'
includeBuild 'utilities-library'

以下是 Xcode 中的结果。应用程序及其使用的库可供一起编辑、构建和测试

Xcode integration

最后,为我们的应用程序设置 CI 构建很容易。我们已经添加了Travis CI 的配置

Native Samples Travis CI

我们需要您的反馈

这些插件仍在开发中,存在一些限制。例如,二进制发布目前还不支持操作系统或架构。我们将继续改进这些插件,使其稳定,并最终弃用软件模型插件。

请尝试使用这些插件并告诉我们您的想法。最简单的入门方法是克隆 原生示例 仓库并按照说明进行操作。我们的示例使用 Gradle nightly build,因此您将在其中看到最新和最棒的开发成果。一些更改已在 4.5 发布候选版本 中出现。

我们很乐意听取您对哪些功能有效、哪些功能令人困惑以及哪些功能缺失会阻碍您使用 Gradle 构建 C++ 软件的意见。您也可以在 Gradle 论坛 上留下反馈,或在 Gradle 原生 GitHub 仓库中提出问题。

讨论