首页 > 解决方案 > 如何在 Android/NDK 上将命令行参数从 gradlew.bat 传递到 Clang

问题描述

我正在使用一个调用 gradle 的 jenkins 脚本,如下所示:

./gradlew --info assembleRelease

我们的很多构建设置都存在于 gradle 文件中,这通常很好,因为我们通常知道我们想要通过发布或调试性质为特定类型的构建指定的所有内容。

然而,我们有一个例外,它是我们想要通过 Jenkins 中的切换来控制的标志。此标志将打开或关闭 C++ 宏定义“TEST_MACRO”。

在不创建新的构建类型的情况下,我希望只传递 -DTEST_MACRO 标志或类似标志。我可以用 gradlew 做到这一点吗?

./gradlew --info assembleRelease -DTEST_MACRO=1

这会让我们的 clang 编译器作为全局定义的 C++ 预处理器定义吗?有没有办法做到这一点而不需要构建更多的变体?(例如,我们实际的构建系统有“googleRelease”、“googleDebug”、“googleStage”、“amazonRelease”、“amazonDebug”、“amazonStage”,我想避免仅仅为了一个额外的配置就必须有 2 倍的现有配置变化cpp 定义我们想要打开和关闭。)

标签: androidc++gradleandroid-ndkpreprocessor

解决方案


一种可能性是使用其值被配置为更改编译器选项的项目属性。下面,您可以找到一个独立的示例构建(使用 Gradle 6.0.1 测试)。

如果你跑

./gradlew build -PTEST_MACRO=Foo
build/exe/main/debug/*

那么这将打印“Hello, Foo!”。

如果你跑

./gradlew build
build/exe/main/debug/*

那么这将打印“Hello, World!”。

独立的样本构建

build.gradle

plugins {
    id 'cpp-application'
}

tasks.withType(CppCompile).configureEach {
    if (project.hasProperty('TEST_MACRO')) {
        macros.put('TEST_MACRO', project.TEST_MACRO)
    }
}

src/main/cpp/hello.cpp

#include <iostream>
#define XSTR(x) STR(x)
#define STR(x) #x
int main()
{
#ifdef TEST_MACRO
    std::cout << "Hello, " << XSTR(TEST_MACRO) << "!\n";
#else
    std::cout << "Hello, World!\n";
#endif
    return 0;
}

推荐阅读