几种C++新插件的简要介绍和运行结果演示

265 阅读6分钟

这篇文章介绍了我们一直在研究的一些新的C++插件。这些插件可以构建C++库和应用程序。它们可以在macOS、Linux和Windows上使用GCC、Clang和Visual C++/Visual Studio。

这些插件最终将取代软件模型插件,并利用Gradle核心中的许多新功能,如丰富的依赖管理引擎、构建缓存复合构建更细粒度的并行执行构建扫描等。关于背景,请看我们关于Gradle软件模型的状态和未来的文章。

我们欢迎你对这些插件有任何反馈。你可以在Gradle论坛上留下反馈,或在Gradle本地GitHub仓库中提出问题。

构建一个应用程序

你可以在Gradle本地样本GitHub仓库中找到本帖的所有样本。让我们来看看如何构建一个简单的应用程序

对于使用过Gradle的Java插件的人来说,这个构建脚本应该很熟悉:

plugins {
    id 'cpp-application'
}

这个应用程序没有任何依赖性,C++源文件和头文件都在默认位置:src/main/cpp 目录。由于这是Gradle,你可以很容易地配置源文件的位置,以符合你的项目的任何布局,包括把所有东西放在一个目录中的常见模式。

下面是在这个样本上运行./gradlew assemble 的结果:

./gradlew assemble

看一下这个构建的扫描,看看发生了什么更详细的事情:

image.png

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

IDE support

Xcode目前支持C++项目。你可以直接运行./gradlew xcode ,并打开生成的工作区。对生成Visual Studio解决方案的支持将在今年年初加入,对其他IDE的支持将在此后逐步加入。

下面是在样本上运行./gradlew xcode 的结果:

./gradlew xcode

这就是工作区在Xcode中的样子:

image.png

Dependencies

该插件使用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

构建扫描显示了更多细节,包括下载:

image.png

下面是这个项目在Xcode中的样子。

image.png

测试

基本的单元测试是支持开箱即用的。这是一个使用Google Test的样本,从Maven仓库中下载。我们用Google Test的这个分叉发布了二进制文件,它只是增加了一个Gradle构建。

构建脚本声明了对谷歌测试的依赖,以及一个可用于定位谷歌测试二进制文件的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测试库,编译了C++源代码和测试,然后运行测试:

./gradlew check

image.png

丰富的报告、构建扫描支持、并行执行和谷歌测试的过滤功能将在今年加入,之后将支持其他C++测试框架。

快速构建

插件可以使用Gradle新的变量感知依赖性管理来产生应用程序或库的调试和发布构建,因此调试构建是针对调试库二进制文件进行编译和链接,而发布构建是针对发布库二进制文件进行编译和链接。当你构建调试构建时(这是默认的),Gradle构建你需要的库的调试构建,而不是构建所有的库。

开发者和CI的构建都很快速。C++编译是一个可缓存的任务,所以在使用构建缓存时,你可以避免不必要的、漫长的编译时间。Gradle Enterprise自带了一个构建缓存后端。你不需要使用--parallel 选项,因为Gradle默认会进行增量和并行编译和链接。

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

./gradlew assemble with build cache

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

image.png

发布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中的结果。应用程序和它使用的库可以一起编辑、构建和测试:

image.png

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

image.png

希望得到您的反馈

这些插件是一项正在进行的工作,有一些局限性。例如,二进制发布还不了解操作系统或架构。 我们将继续改进这些插件,使其稳定,并最终将废弃软件模型插件。

请尝试这些插件,并让我们知道你的想法。最简单的方法是克隆本地样本库并按照说明进行操作。我们的样本使用Gradle的夜间构建,所以你会在那里看到最新和最伟大的发展。一些变化已经出现在4.5的候选版本中了。

我们很想听听你认为哪些地方运行良好,哪些地方令人困惑,以及哪些地方的缺失会阻碍你使用Gradle来构建C++软件。你也可以在Gradle论坛上留下反馈,或者在Gradle原生GitHub仓库中提出问题。