从 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”,这将不匹配。