【问题标题】:It is possible to set cmake arguments per ABI in gradle?可以在 gradle 中为每个 ABI 设置 cmake 参数吗?
【发布时间】:2017-03-02 09:29:48
【问题描述】:

我有一个基于 cmake 的构建脚本的跨平台库。由于现在可以使用对 android 的 cmake 支持 (https://developer.android.com/studio/projects/add-native-code.html),我计划将 ndk-build makefile 移到垃圾箱。
我已经测试过find_package(ZLIB REQUIRED) 它运行良好,因为 zlib 头文件和库本身可用于 NDK sysroot 中的所有 ABI。 因此,我可以根据风格或构建类型向 cmake cmdline 添加任何自定义参数:

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        externalNativeBuild {
            cmake {
                arguments "-DMYLIB_ENABLE_PROGUARD=ON"
            }
        }
    }
    debug {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        externalNativeBuild {
            cmake {
                arguments "-DMYLIB_ENABLE_PROGUARD=OFF"
            }
        }
    }
}

我的问题是能够为每个 ABI 设置 CMAKE_PREFIX_PATH 以通过 FindPackage 查找外部静态/共享库。

一般来说,我可以在cmake脚本本身中使用find_libraryinclude_directories${ANDROID_ABI}一起使用,但是我已经有支持多平台的工作脚本,我不想添加脏代码,因为有干净的方法(find_package + CMAKE_PREFIX_PATH)。

感谢大家的宝贵时间!

【问题讨论】:

    标签: android gradle android-ndk cmake


    【解决方案1】:

    这不是我们目前支持的。我认为这应该是可能的。我打开 b.android.com/225884 来跟踪它。

    【讨论】:

    • 问题跟踪器提到了一个严重的解决方法。但是解决方法是什么?
    • 我相信这是为每个 abi 进行不同的配置,例如 debugx86 { ndk { abiFilters "x86" } } 等等,每个 ABI 一个
    • 该错误似乎无法再访问。也许这个答案应该替换为已实施的解决方案
    【解决方案2】:

    如果你只是在 ABI 之后,你可以做类似的事情

    if(${ANDROID_ABI} STREQUAL "x86_64")
        # ABI xx
    endif()
    

    这很好用,感觉不像是 hack。我用它来构建 OpenSSL(这里的完整用法:https://github.com/schwabe/platform_external_openssl/blob/icsopenvpn/openssl.cmake

    如果你真的需要口味……我想出了这个超级丑陋的口味技巧:

    cmake
    # Super hacky way to determine if flavour is normal
    # cmake is called with the DCMAKE_LIBRARY_OUTPUT_DIRECTORY that includes the flavour (and archtecture)
    #-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/Users/arne/software/icsopenvpn/main/build/intermediates/cmake/normal/debug/obj/arm64-v8a
    if (${CMAKE_LIBRARY_OUTPUT_DIRECTORY} MATCHES "build/intermediates/cmake/.*normal.*/")
      # Flavour specific
    endif()
    

    【讨论】:

    • 给定的链接似乎已失效,从今天开始可以尝试link
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-27
    • 1970-01-01
    • 2014-06-28
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多