在gradle中可以为每个ABI设置cmake参数



我有一个基于cmake构建脚本的跨平台库。由于cmake对android的支持现在可用(https://developer.android.com/studio/projects/add-native-code.html),我计划将ndk-build makefiles移到垃圾桶。
我已经测试了find_package(ZLIB REQUIRED)它工作得很好,因为zlib头和库本身对NDK系统根中的所有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"
            }
        }
    }
}

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

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

感谢大家的宝贵时间!

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

如果您只是在ABI之后,您可以这样做

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

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

如果你需要真正的味道…我想出了这个超级丑陋的味道hack:

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()

最新更新