diff --git a/doc/platforms-android.dox b/doc/platforms-android.dox index b48b24227..e6dba144c 100644 --- a/doc/platforms-android.dox +++ b/doc/platforms-android.dox @@ -55,16 +55,18 @@ for a cleaner setup. - [android-ndk](https://aur.archlinux.org/packages/android-ndk/) - [android-sdk-build-tools](https://aur.archlinux.org/packages/android-sdk-build-tools/) - [android-sdk-platform-tools](https://aur.archlinux.org/packages/android-sdk-platform-tools/) - - [android-platform-24](https://aur.archlinux.org/packages/android-platform-24/) + - [android-platform-29](https://aur.archlinux.org/packages/android-platform-29/) - [android-sdk-cmake](https://aur.archlinux.org/packages/android-sdk-cmake/) Gradle requires Android SDK version of CMake, which is currently at version 3.10. See below for an experimental way to @ref platforms-android-system-cmake "use the system CMake" instead. On the other hand, while it's possible to use the CMake from Android -SDK to build Magnum itself, the following guide is written with CMake 3.16 and -newer in mind, which has Android NDK r19+ support built-in. In older versions -you'd need to supply a toolchain file instead and the configuration values are -different. +SDK to build Magnum itself, the following guide is written with CMake 3.20 and +newer in mind, which has Android NDK r22+ support built-in. CMake 3.16 to 3.19 +supports only NDK until r21, in even older versions you'd need to supply a +toolchain file instead and the configuration values are different, see the +@ref platforms-android-cmake-too-old "related troubleshooting section" for more +information. @section platforms-android-console Building and running console applications @@ -73,31 +75,15 @@ you have Magnum installed in the NDK path as described in @ref building-cross-an build your project as below. Adapt paths to your system, Android ABI and version and NDK location as needed. - - -@m_class{m-note m-warning} - -@par - Unfortunately, CMake before version 3.20 needs extra help with - `CMAKE_FIND_ROOT_PATH` and `CMAKE_FIND_LIBRARY_CUSTOM_LIB_SUFFIX` to - correctly find Android libraries, as shown below. Otherwise it falls back - to looking in native system locations. Again, adapt them to your system, - Android ABI and version and NDK location as needed. -@par - CMake 3.20 and newer [is now able to detect everything on its own](https://gitlab.kitware.com/cmake/cmake/-/merge_requests/5357) - and you don't need to supply these anymore. - @m_class{m-console-wrap} @code{.sh} mkdir build-android-arm64 && cd build-android-arm64 cmake .. \ -DCMAKE_SYSTEM_NAME=Android \ - -DCMAKE_SYSTEM_VERSION=24 \ + -DCMAKE_SYSTEM_VERSION=29 \ -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \ -DCMAKE_ANDROID_STL_TYPE=c++_static \ - -DCMAKE_FIND_ROOT_PATH=/opt/android-ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot \ - -DCMAKE_FIND_LIBRARY_CUSTOM_LIB_SUFFIX=/aarch64-linux-android/24 \ -DCMAKE_BUILD_TYPE=Release cmake --build . @endcode @@ -421,11 +407,8 @@ x86_64 | <nk>/platforms/android-<version>/arch-x86_64/usr After that, you can add the additional ABIs to the `abiFilters` list in your `build.gradle`. -For example, building Magnum for 32-bit and 64-bit ARM with SDK version 24 -could look like this. The same note regarding CMake 3.20 applies here --- on -versions before, you need the `CMAKE_FIND_ROOT_PATH` and -`CMAKE_FIND_LIBRARY_CUSTOM_LIB_SUFFIX` variables as well (and have them in sync -with the ABI and API version level), on 3.20 and newer you can omit them. +For example, building Magnum for 32-bit and 64-bit ARM with SDK version 29 +could look like this, assuming CMake 3.20+ being used. @m_class{m-console-wrap} @@ -433,13 +416,11 @@ with the ABI and API version level), on 3.20 and newer you can omit them. mkdir build-android-arm && cd build-android-arm cmake .. \ -DCMAKE_SYSTEM_NAME=Android \ - -DCMAKE_SYSTEM_VERSION=24 \ + -DCMAKE_SYSTEM_VERSION=29 \ -DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a \ -DCMAKE_ANDROID_STL_TYPE=c++_static \ -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_INSTALL_PREFIX=/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr \ - -DCMAKE_FIND_ROOT_PATH=/toolchains/llvm/prebuilt/linux-x86_64/sysroot \ - -DCMAKE_FIND_LIBRARY_CUSTOM_LIB_SUFFIX=/arm-linux-androideabi/24 + -DCMAKE_INSTALL_PREFIX=/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr cmake --build . --target install cd .. @@ -447,13 +428,11 @@ cd .. mkdir build-android-arm64 && cd build-android-arm64 cmake .. \ -DCMAKE_SYSTEM_NAME=Android \ - -DCMAKE_SYSTEM_VERSION=24 \ + -DCMAKE_SYSTEM_VERSION=29 \ -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \ -DCMAKE_ANDROID_STL_TYPE=c++_static \ -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_INSTALL_PREFIX=/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr \ - -DCMAKE_FIND_ROOT_PATH=/toolchains/llvm/prebuilt/linux-x86_64/sysroot \ - -DCMAKE_FIND_LIBRARY_CUSTOM_LIB_SUFFIX=/aarch64-linux-android/24 + -DCMAKE_INSTALL_PREFIX=/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr cmake --build . --target install @endcode @@ -769,9 +748,47 @@ gradle build @subsection platforms-android-cmake-too-old CMake or NDK is too old While the minimal CMake version that's required for building Magnum for Android -is 3.7, NDK r19 and newer need at least CMake 3.16 to work. For older NDKs you -might want to grab at least CMake 3.9.2, as it [fixes an issue with the Clang toolchain](https://gitlab.kitware.com/cmake/cmake/issues/17253). +is 3.7, NDK r22 and newer need at least CMake 3.20, and attempting to use CMake +3.19 or older with NDK r22+ will greet you with an error similar to the +following, as NDK r22 removed certain deprecated internal paths: + +@m_class{m-console-wrap} + +@code{.shell-session} +CMake Error at /usr/share/cmake-3.17/Modules/Platform/Android-Determine.cmake:176 (message): + Android: The API specified by CMAKE_SYSTEM_VERSION='29' does not exist in + the NDK. The directory: + + /opt/android/sdk/ndk/22.1.7171670/platforms/android-29 + + does not exist. +Call Stack (most recent call first): + /usr/share/cmake-3.17/Modules/CMakeDetermineSystem.cmake:129 (include) + CMakeLists.txt:70 (project) +@endcode + +NDK r19 to r21 need at least CMake 3.16 to work, and CMake before version 3.20 +needs extra help with `CMAKE_FIND_ROOT_PATH` and +`CMAKE_FIND_LIBRARY_CUSTOM_LIB_SUFFIX` to correctly find Android libraries, +otherwise it falls back to looking in native system locations. An example is +shown below, adapt them to your system, Android ABI and version NDK location +as needed. + +@m_class{m-console-wrap} + +@code{.sh} +cmake .. \ + -DCMAKE_SYSTEM_NAME=Android \ + -DCMAKE_SYSTEM_VERSION=29 \ + -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \ + -DCMAKE_ANDROID_STL_TYPE=c++_static \ + -DCMAKE_FIND_ROOT_PATH=/opt/android-ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot \ + -DCMAKE_FIND_LIBRARY_CUSTOM_LIB_SUFFIX=/aarch64-linux-android/29 \ + -DCMAKE_BUILD_TYPE=Release +@endcode +For NDKs before r19 you might want to grab at least CMake 3.9.2, as it +[fixes an issue with the Clang toolchain](https://gitlab.kitware.com/cmake/cmake/issues/17253). With NDK r18 and older you'll need to additionally supply `-DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang`, on the other hand the `-DCMAKE_FIND_ROOT_PATH` isn't needed --- CMake is able to figure out the paths