android - 如何在 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 定义我们想要打开和关闭。)
解决方案
一种可能性是使用其值被配置为更改编译器选项的项目属性。下面,您可以找到一个独立的示例构建(使用 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;
}
推荐阅读
- python - Tensorflow model.fit() 不适用于字符串作为标签
- verilog - 如何使用 X,Y 坐标复制对象
- html - css flex div高度问题-为什么空间很大?
- rxjs - 使用内部可观察谓词的管道过滤器
- javascript - 是否有无需按下按钮即可在页面加载时切换 div 的功能?
- javascript - 如何在边框半径内居中文本?
- javascript - 如何在谷歌地图中更改特定状态的颜色
- c# - IErrorInfo.GetDescription com E_FAIL(0x80004005) 导入 EXCEL 文件
- python - 使用 reed-solomon 编码器对图像进行编码
- mysql - 用于显示空值的 SQL