有没有办法阻止CMake在使用CMAKE_ANDROID_STANDALONE_TOOLCHAIN时强制执行工具链布局?

时间:2018-02-26 13:25:02

标签: android cmake

  • 我使用的是CMake 3.8或更新版
  • 我正在使用自定义工具链文件来配置Android
  • 使用NDK不是一个选项

正如标题所示,我有一个我想使用的自定义Android工具链,而不是NDK。问题是,在将CMAKE_SYSTEM_NAME设置为Android并指定CMAKE_ANDROID_STANDALONE_TOOLCHAIN=<path-to-my-toolchain>时,CMake似乎会强制执行所述工具链的布局。这就像用户不信任完全配置他们自己的Android工具链一样?

目前,我被迫在我的工具链文件中将CMAKE_SYSTEM_NAME设置为GenericLinux以超越配置阶段,我真的不喜欢这个解决方案。

如果没有CMake强制执行布局(当然不修改CMake Android模块),是否真的不可能使用独立的Android工具链?

CMake错误输出

它抱怨的第一件事是没有sysroot:

CMake Error at /usr/local/share/cmake-3.8/Modules/Platform/Android-Determine.cmake:74 (message):
  Android: The standalone toolchain directory specified by CMAKE_ANDROID_STANDALONE_TOOLCHAIN:
    /home/<path-to-toolchain>
  does not contain a sysroot with a known layout.  The file:
    /home/<path-to-toolchain>/sysroot/usr/include/android/api-level.h
  does not exist.

如果我修正了上面的错误,那么下一行是:

CMake Error at /usr/local/share/cmake-3.8/Modules/Platform/Android/Determine-Compiler-Standalone.cmake:16 (message):
  Android: No '*-gcc' compiler found in CMAKE_ANDROID_STANDALONE_TOOLCHAIN:

这个错误是由于CMake希望在主工具链文件夹中有一个带有gcc工具链的bin - 文件夹这一事实。

1 个答案:

答案 0 :(得分:1)

查看CMake implementation,它似乎确实对工具链布局做出了假设。除了CMake docs中所述的要求之外,在指定的sysroot目录下必须有CMAKE_ANDROID_STANDALONE_TOOLCHAIN子目录,该实现假定将存在${CMAKE_ANDROID_STANDALONE_TOOLCHAIN}/bin/*-gcc${_ANDROID_HOST_EXT}的匹配项,其中_ANDROID_HOST_EXT 1}}在Windows上为.exe,否则为空。然后继续使用更多的逻辑,但如果工具链是基于gcc的,它应该没问题。

更深入地看一下实现,如果设置ANDROID_STANDALONE_TOOLCHAIN环境变量而不是CMAKE_ANDROID_STANDALONE_TOOLCHAIN CMake变量,它会绕过sysroot检查(更准确地说,检查{{1在sysroot下的路径下的文件)。如果你这样做,那么之后,CMake仍然会尝试确定API级别,首先查找api-level.h并在找到时查询它,或者再次查找<sysroot>/bin/clang文件。如果您的工具链没有api-level.h,那么您可以将未记录的内部 CMake变量<sysroot>/bin/clang设置为API,以防止CMake查看为了要求_ANDROID_STANDALONE_TOOLCHAIN_API。你通常不会依赖这样的内部事物,因为它可能随着任何未来的CMake版本而改变,但这将是你想要做的事情的代价。

如果您不想依赖内部细节,那么将api-level.h设置为CMAKE_SYSTEM_NAME并手动设置工具链详细信息就像任何其他非Android版本一样,可能是您的最佳选择。然后,您将需要设置所有相关的编译器和链接器标志等,就像任何其他交叉编译情况一样,因为它不会触发任何CMake对Android的自动处理。