【问题标题】:Add cppflags from Flavor and BuildType then access them in my CmakeList从 Flavor 和 BuildType 添加 cppflags 然后在我的 CmakeList 中访问它们
【发布时间】:2019-07-31 07:38:23
【问题描述】:

我有这个 gradle:

android {
    ...
    buildTypes {
        debug {
            externalNativeBuild {
                cmake {
                    cppFlags "-DGENDEV"
                }
            }
        }
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

        }
    }
    ...
}

如果条件在我的 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()

第一次检查总是错误的,因此每个版本都是免费版本!我做错了什么?

【问题讨论】:

  • 我已将您的代码粘贴到我的(最小)NDK 项目中,它确实按预期工作。但是出现了几个问题。 首先,你如何选择构建的风味? ,Gradle、Android插件、Android Studio的版本是什么?因为,在 Canary 的最新版本中,我的 CMake 没有按我的意愿工作。当我使用稳定的classpath 'com.android.tools.build:gradle:3.4.2'gradle-5.5-all.zip 时,一切都很好。
  • 我希望更新能做到
  • 谢谢亚历克斯。请将此信息添加为答案,并将作为正确答案接受。

标签: android cmake android-gradle-plugin


【解决方案1】:

您的代码没问题,但 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 集成方法可能是指定参数

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)

【讨论】:

  • 我添加了一个补充答案,完成了问题的解决。
【解决方案2】:

我还想指出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”,这将不匹配。

【讨论】:

    猜你喜欢
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 2020-07-13
    相关资源
    最近更新 更多