介绍新的 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 的结果

./gradlew assemble

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

compile debug timeline

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

IDE 支持 #

目前支持 Xcode 进行 C++ 项目开发。只需运行 ./gradlew xcode 并打开生成的工程文件即可。今年早些时候将添加对生成 Visual Studio 解决方案的支持,之后将逐步添加对其他 IDE 的支持。

这是在示例上运行 ./gradlew xcode 的结果

./gradlew xcode

这就是 Xcode 中的工程文件样子

Xcode integration

依赖项 #

该插件像 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 下载了头文件和共享库二进制文件,并与之进行编译和链接。

./gradlew assemble

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

app assemble build scan network activity

项目在 Xcode 中的样子

Xcode integration

测试 #

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

./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 'https://: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

您的反馈意见 #

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

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

我们很想听听您认为哪些方面效果很好,哪些方面令人困惑,以及缺少哪些内容会阻止您使用 Gradle 构建 C++ 软件。您也可以在Gradle 论坛上留下反馈,或在 Gradle native GitHub 仓库上提出问题。

讨论