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

依赖 #

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

./gradlew assemble

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

app assemble build scan network activity

这是此项目在 Xcode 中的样子

Xcode integration

测试 #

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

./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://127.0.0.1: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 存储库上提出问题。

讨论