从 Flavor 和 BuildType 添加 cppflags,然后在我的 CmakeList 中访问它们
Add cppflags from Flavor and BuildType then access them in my CmakeList
我有这个 gradle:
android {
...
buildTypes {
debug {
externalNativeBuild {
cmake {
cppFlags "-DGENDEV"
}
}
}
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
...
}
这个 if 条件在我的 CMakeList 文件中工作正常:
if("${CMAKE_CXX_FLAGS}" MATCHES "GENDEV$")
// true
endif()
我最近在我的构建中添加了 flavors,如下所示:
flavorDimensions "version"
productFlavors {
free {
dimension "version"
externalNativeBuild.cmake {
cppFlags "-DFLAVOR_FREE"
}
}
full {
dimension "version"
externalNativeBuild.cmake {
cppFlags "-DFLAVOR_FULL"
}
}
}
现在,我的 CMakeList 文件中有这些检查:
if("${CMAKE_CXX_FLAGS}" MATCHES "FLAVOR_FULL$")
// full version
else()
// free version
endif()
if("${CMAKE_CXX_FLAGS}" MATCHES "GENDEV$")
// true
endif()
第一次检查总是错误的,因此每个版本都是免费版本!我做错了什么?
您的代码没问题,但是 Gradle 插件太旧,无法正确处理它。
对我来说,同样的代码适用于
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.4.2'
}
}
此插件需要 Gradle 5.5.
请注意,更简单的 CMake 集成方法可能是指定 arguments:
flavorDimensions "version"
productFlavors {
free {
dimension "version"
externalNativeBuild.cmake {
arguments "-DFLAVOR=FREE"
}
}
full {
dimension "version"
externalNativeBuild.cmake {
arguments "-DFLAVOR=FULL"
}
}
}
这样,您的 CMakeLists.txt
将更具可读性:
if(${FLAVOR} STREQUAL "FULL")
// full version
else()
// free version
endif()
或者,您可以选择使用 arguments "-DFLAVOR_FULL"
和 if(FLAVOR_FULL)
我还想指出 MATCHES
匹配正则表达式。因此,更改以下内容:
if("${CMAKE_CXX_FLAGS}" MATCHES "FLAVOR_FULL$")
至
if("${CMAKE_CXX_FLAGS}" MATCHES "FLAVOR_FULL") // without the $
帮助解决了问题。基本上,原始条件意味着匹配 "FLAVOR_FULL" 文本,如果它位于字符串的末尾,例如“-DGENDEV -DFLAVOR_FULL”。如果字符串是“-DFLAVOR_FULL -DGENDEV”,这将不匹配。
我有这个 gradle:
android {
...
buildTypes {
debug {
externalNativeBuild {
cmake {
cppFlags "-DGENDEV"
}
}
}
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
...
}
这个 if 条件在我的 CMakeList 文件中工作正常:
if("${CMAKE_CXX_FLAGS}" MATCHES "GENDEV$")
// true
endif()
我最近在我的构建中添加了 flavors,如下所示:
flavorDimensions "version"
productFlavors {
free {
dimension "version"
externalNativeBuild.cmake {
cppFlags "-DFLAVOR_FREE"
}
}
full {
dimension "version"
externalNativeBuild.cmake {
cppFlags "-DFLAVOR_FULL"
}
}
}
现在,我的 CMakeList 文件中有这些检查:
if("${CMAKE_CXX_FLAGS}" MATCHES "FLAVOR_FULL$")
// full version
else()
// free version
endif()
if("${CMAKE_CXX_FLAGS}" MATCHES "GENDEV$")
// true
endif()
第一次检查总是错误的,因此每个版本都是免费版本!我做错了什么?
您的代码没问题,但是 Gradle 插件太旧,无法正确处理它。
对我来说,同样的代码适用于
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.4.2'
}
}
此插件需要 Gradle 5.5.
请注意,更简单的 CMake 集成方法可能是指定 arguments:
flavorDimensions "version"
productFlavors {
free {
dimension "version"
externalNativeBuild.cmake {
arguments "-DFLAVOR=FREE"
}
}
full {
dimension "version"
externalNativeBuild.cmake {
arguments "-DFLAVOR=FULL"
}
}
}
这样,您的 CMakeLists.txt
将更具可读性:
if(${FLAVOR} STREQUAL "FULL")
// full version
else()
// free version
endif()
或者,您可以选择使用 arguments "-DFLAVOR_FULL"
和 if(FLAVOR_FULL)
我还想指出 MATCHES
匹配正则表达式。因此,更改以下内容:
if("${CMAKE_CXX_FLAGS}" MATCHES "FLAVOR_FULL$")
至
if("${CMAKE_CXX_FLAGS}" MATCHES "FLAVOR_FULL") // without the $
帮助解决了问题。基本上,原始条件意味着匹配 "FLAVOR_FULL" 文本,如果它位于字符串的末尾,例如“-DGENDEV -DFLAVOR_FULL”。如果字符串是“-DFLAVOR_FULL -DGENDEV”,这将不匹配。