在Gradle中,是否可以针对ABI设置CMake参数?

9
我有一个跨平台库,带有基于CMake的构建脚本。由于现在CMake支持Android(https://developer.android.com/studio/projects/add-native-code.html),因此我计划将ndk-build makefiles删除。
我已经测试过find_package(ZLIB REQUIRED)并且它很好用,因为zlib头文件和库可用于NDK sysroot中的所有ABI。 所以,我可以根据口味或构建类型向CMake命令行添加任何自定义参数:
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)。
感谢大家花费时间!
2个回答

5

我们目前不支持这个功能。但我认为应该是可以实现的。我已经打开了b.android.com/225884以进行跟踪。


问题跟踪器提到了一个粗略的解决方法。但是这个解决方法是什么? - Vinayak Garg
我认为这是为每个ABI创建不同的配置,例如,debugx86 { ndk { abiFilters "x86" } } 等等,每个ABI一个。 - Jomo Fisher
1
这个 bug 似乎不能再被访问了。也许应该用已实现的解决方案来代替这个答案。 - plaisthos

4

如果你只是需要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()

给定的链接似乎已经失效了,今天可以尝试使用链接 - loloof64
1
更正了链接。 - plaisthos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接