From 4fa49dd464ec91188a333d5e184cac05f93dc75c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 12 Sep 2020 19:15:34 +0200 Subject: [PATCH] package/ci: add Android Vulkan build. It's not using Android's native Vulkan library because that's only since Android 24 and emulator for that version doesn't even start. So we use our own minimal driver instead. --- ...-android-arm.sh => travis-android-gles.sh} | 0 package/ci/travis-android-vulkan.sh | 112 ++++++++++++++++++ package/ci/travis.yml | 35 ++++-- 3 files changed, 140 insertions(+), 7 deletions(-) rename package/ci/{travis-android-arm.sh => travis-android-gles.sh} (100%) create mode 100755 package/ci/travis-android-vulkan.sh diff --git a/package/ci/travis-android-arm.sh b/package/ci/travis-android-gles.sh similarity index 100% rename from package/ci/travis-android-arm.sh rename to package/ci/travis-android-gles.sh diff --git a/package/ci/travis-android-vulkan.sh b/package/ci/travis-android-vulkan.sh new file mode 100755 index 000000000..22aeed55b --- /dev/null +++ b/package/ci/travis-android-vulkan.sh @@ -0,0 +1,112 @@ +#!/bin/bash +set -ev + +# Corrade +git clone --depth 1 git://github.com/mosra/corrade.git +cd corrade + +# Build native corrade-rc +mkdir build && cd build +cmake .. \ + -DCMAKE_INSTALL_PREFIX=$HOME/deps-native \ + -DCMAKE_BUILD_TYPE=Release \ + -DWITH_INTERCONNECT=OFF \ + -DWITH_PLUGINMANAGER=OFF \ + -DWITH_TESTSUITE=OFF \ + -DWITH_UTILITY=OFF \ + -G Ninja +ninja install +cd .. + +# Crosscompile Corrade +mkdir build-android-arm && cd build-android-arm +cmake .. \ + -DCMAKE_ANDROID_NDK=$TRAVIS_BUILD_DIR/android-ndk-r16b \ + -DCMAKE_SYSTEM_NAME=Android \ + -DCMAKE_SYSTEM_VERSION=22 \ + -DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a \ + -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang \ + -DCMAKE_ANDROID_STL_TYPE=c++_static \ + -DCMAKE_BUILD_TYPE=Release \ + -DCORRADE_RC_EXECUTABLE=$HOME/deps-native/bin/corrade-rc \ + -DCMAKE_INSTALL_PREFIX=$HOME/deps \ + -DWITH_INTERCONNECT=OFF \ + -G Ninja +ninja install +cd .. + +cd .. + +# Generate debug keystore for APK signing +keytool -genkeypair -keystore $HOME/.android/debug.keystore -storepass android -alias androiddebugkey -keypass android -keyalg RSA -validity 10000 -dname CN=,OU=,O=,L=,S=,C= + +# *Native* Vulkan requires Android 24, build-tools-25.0.2, android-24 and +# sys-img-armeabi-v7a-android-24 in android.components in the YML, but the +# fucking emulator never starts, which means we can't test shit: +# https://github.com/googlemaps/android-maps-utils/issues/371 +# So don't even bother there, use some ass-old version that works, and link to +# our own library, which is the fastest Vulkan implementation IN THE WORLD. +$TRAVIS_BUILD_DIR/android-ndk-r16b/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ --target=armv7-none-linux-androideabi --gcc-toolchain=$TRAVIS_BUILD_DIR/android-ndk-r16b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 --sysroot=$TRAVIS_BUILD_DIR/android-ndk-r16b/platforms/android-22/arch-arm -march=armv7-a -mthumb -mfpu=vfpv3-d16 -mfloat-abi=softfp -funwind-tables -no-canonical-prefixes -D__ANDROID_API__=22 -fexceptions -frtti -O3 -DNDEBUG -Wl,--fix-cortex-a8 -fPIE -pie -Wl,--gc-sections -Wl,-z,nocopyreloc package/ci/libvulkan.cpp -std=c++11 -c -o vulkan.o +$TRAVIS_BUILD_DIR/android-ndk-r16b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/arm-linux-androideabi/bin/ar rcs $HOME/libvulkan.a vulkan.o +$TRAVIS_BUILD_DIR/android-ndk-r16b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/arm-linux-androideabi/bin/ranlib $HOME/libvulkan.a + +# Crosscompile +mkdir build-android-arm && cd build-android-arm +cmake .. \ + -DANDROID_SDK=/usr/local/android-sdk \ + -DCMAKE_ANDROID_NDK=$TRAVIS_BUILD_DIR/android-ndk-r16b \ + -DCMAKE_SYSTEM_NAME=Android \ + -DCMAKE_SYSTEM_VERSION=22 \ + -DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a \ + -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang \ + -DCMAKE_ANDROID_STL_TYPE=c++_static \ + -DCORRADE_RC_EXECUTABLE=$HOME/deps-native/bin/corrade-rc \ + -DVulkan_LIBRARY=$HOME/libvulkan.a \ + -DCMAKE_INSTALL_PREFIX=$HOME/deps \ + -DCMAKE_PREFIX_PATH=$HOME/deps \ + -DCMAKE_FIND_ROOT_PATH=$HOME/deps \ + -DCMAKE_BUILD_TYPE=Release \ + -DWITH_AUDIO=OFF \ + -DWITH_DEBUGTOOLS=OFF \ + -DWITH_GL=OFF \ + -DWITH_MESHTOOLS=OFF \ + -DWITH_PRIMITIVES=OFF \ + -DWITH_SCENEGRAPH=OFF \ + -DWITH_SHADERS=OFF \ + -DWITH_TEXT=OFF \ + -DWITH_TEXTURETOOLS=OFF \ + -DWITH_TRADE=ON \ + -DWITH_VK=ON \ + -DWITH_AL_INFO=OFF \ + -DWITH_VK_INFO=ON \ + -DWITH_GL_INFO=OFF \ + -DWITH_ANYAUDIOIMPORTER=OFF \ + -DWITH_ANYIMAGECONVERTER=OFF \ + -DWITH_ANYIMAGEIMPORTER=OFF \ + -DWITH_ANYSCENECONVERTER=OFF \ + -DWITH_ANYSCENEIMPORTER=OFF \ + -DWITH_MAGNUMFONT=OFF \ + -DWITH_MAGNUMFONTCONVERTER=OFF \ + -DWITH_OBJIMPORTER=OFF \ + -DWITH_TGAIMAGECONVERTER=OFF \ + -DWITH_TGAIMPORTER=OFF \ + -DWITH_WAVAUDIOIMPORTER=OFF \ + -DWITH_DISTANCEFIELDCONVERTER=OFF \ + -DWITH_FONTCONVERTER=OFF \ + -DWITH_IMAGECONVERTER=OFF \ + -DWITH_SCENECONVERTER=OFF \ + -DWITH_ANDROIDAPPLICATION=ON \ + -DBUILD_TESTS=ON \ + -DBUILD_GL_TESTS=OFF \ + -DBUILD_VK_TESTS=ON \ + -G Ninja +ninja + +# Start simulator and run tests +echo no | android create avd --force -n test -t android-22 --abi armeabi-v7a +emulator -avd test -no-audio -no-window & +android-wait-for-emulator +CORRADE_TEST_COLOR=ON ctest -V -E VkTest + +# Test install, after running the tests as for them it shouldn't be needed +ninja install diff --git a/package/ci/travis.yml b/package/ci/travis.yml index 86f877ae3..10a0bf86a 100644 --- a/package/ci/travis.yml +++ b/package/ci/travis.yml @@ -208,7 +208,7 @@ matrix: dist: trusty env: - JOBID=android-gles2 - - TARGET=android + - TARGET=android-gles - TARGET_GLES2=ON addons: apt: @@ -226,7 +226,7 @@ matrix: dist: trusty env: - JOBID=android-gles3 - - TARGET=android + - TARGET=android-gles - TARGET_GLES2=OFF addons: apt: @@ -237,6 +237,26 @@ matrix: - build-tools-22.0.1 - android-22 - sys-img-armeabi-v7a-android-22 + - language: android + os: linux + # Setting xenial here will cause it to use 12.04, with GCC 4.6 and other + # prehistoric nightmares. So staying with 14.04 for the time being. + dist: trusty + env: + - JOBID=android-vulkan + - TARGET=android-vulkan + addons: + apt: + packages: + - ninja-build + android: + components: + # Android API level 24 is the first with Vulkan support, but the crap + # emulator doesn't even start, so it's useless. See + # travis-android-vulkan.sh for how it's done instead. + - build-tools-22.0.1 + - android-22 + - sys-img-armeabi-v7a-android-22 notifications: webhooks: @@ -251,20 +271,20 @@ cache: - $HOME/sdl2 install: -- if [ "$TRAVIS_OS_NAME" == "linux" ] && [ ! "$TARGET" == "desktop-sanitizers" ] && [ ! "$TARGET" == "android" ] && [ ! "$TARGET" == "desktop-vulkan" ]; then export CXX=g++-4.8; fi +- if [ "$TRAVIS_OS_NAME" == "linux" ] && [ ! "$TARGET" == "desktop-sanitizers" ] && [ ! "$TARGET" == "android-gles" ] && [ ! "$TARGET" == "android-vulkan" ] && [ ! "$TARGET" == "desktop-vulkan" ]; then export CXX=g++-4.8; fi - if [ "$TRAVIS_OS_NAME" == "linux" ] && [ "$TARGET" == "desktop-sanitizers" ]; then export CXX=clang++-3.8; fi - if [ "$BUILD_DEPRECATED" != "OFF" ]; then export BUILD_DEPRECATED=ON; fi - if [ "$BUILD_STATIC" != "ON" ]; then export BUILD_STATIC=OFF; fi - if [ "$TRAVIS_OS_NAME" == "linux" ] && ( [ "$TARGET" == "desktop" ] || [ "$TARGET" == "desktop-sanitizers" ] ); then export PLATFORM_GL_API=GLX; fi - if [ "$TRAVIS_OS_NAME" == "linux" ] && [ "$TARGET" == "desktop-gles" ]; then export PLATFORM_GL_API=EGL; fi -- if [ "$TRAVIS_OS_NAME" == "linux" ] && [ "$TARGET" == "android" ]; then wget -nc https://dl.google.com/android/repository/android-ndk-r16b-linux-x86_64.zip && unzip -q android-*.zip; fi +- if [ "$TRAVIS_OS_NAME" == "linux" ] && ( [ "$TARGET" == "android-gles" ] || [ "$TARGET" == "android-vulkan" ] ); then wget -nc https://dl.google.com/android/repository/android-ndk-r16b-linux-x86_64.zip && unzip -q android-*.zip; fi # Download CMake 3.4.3 to ensure we're still compatible with it (Travis has # 3.9 since December 2017). Also, the PATH setting can't be cached, so it's # separate (bit me two times already). Android needs CMake 3.7, but # https://gitlab.kitware.com/cmake/cmake/issues/17253 is fixed in 3.9.2, so # grab that. FindVulkan is since 3.7, in that case just use the system package. -- if [ "$TRAVIS_OS_NAME" == "linux" ] && [ ! "$TARGET" == "desktop-vulkan" ] && [ ! "$TARGET" == "android" ] && [ ! -e "$HOME/cmake/bin" ]; then cd $HOME ; wget -nc --no-check-certificate https://cmake.org/files/v3.4/cmake-3.4.3-Linux-x86_64.tar.gz && mkdir -p cmake && cd cmake && tar --strip-components=1 -xzf ../cmake-3.4.3-Linux-x86_64.tar.gz && cd $TRAVIS_BUILD_DIR ; fi -- if [ "$TRAVIS_OS_NAME" == "linux" ] && [ "$TARGET" == "android" ] && [ ! -e "$HOME/cmake/bin" ]; then cd $HOME ; wget -nc --no-check-certificate https://cmake.org/files/v3.9/cmake-3.9.2-Linux-x86_64.tar.gz && mkdir -p cmake && cd cmake && tar --strip-components=1 -xzf ../cmake-3.9.2-Linux-x86_64.tar.gz && cd $TRAVIS_BUILD_DIR ; fi +- if [ "$TRAVIS_OS_NAME" == "linux" ] && [ ! "$TARGET" == "desktop-vulkan" ] && [ ! "$TARGET" == "android-gles" ] && [ ! "$TARGET" == "android-vulkan" ] && [ ! -e "$HOME/cmake/bin" ]; then cd $HOME ; wget -nc --no-check-certificate https://cmake.org/files/v3.4/cmake-3.4.3-Linux-x86_64.tar.gz && mkdir -p cmake && cd cmake && tar --strip-components=1 -xzf ../cmake-3.4.3-Linux-x86_64.tar.gz && cd $TRAVIS_BUILD_DIR ; fi +- if [ "$TRAVIS_OS_NAME" == "linux" ] && ( [ "$TARGET" == "android-gles" ] || [ "$TARGET" == "android-vulkan" ] ) && [ ! -e "$HOME/cmake/bin" ]; then cd $HOME ; wget -nc --no-check-certificate https://cmake.org/files/v3.9/cmake-3.9.2-Linux-x86_64.tar.gz && mkdir -p cmake && cd cmake && tar --strip-components=1 -xzf ../cmake-3.9.2-Linux-x86_64.tar.gz && cd $TRAVIS_BUILD_DIR ; fi - if [ "$TRAVIS_OS_NAME" == "linux" ] && [ ! "$TARGET" == "desktop-vulkan" ]; then export PATH=$HOME/cmake/bin:$PATH && cmake --version; fi - if [ "$TRAVIS_OS_NAME" == "osx" ]; then HOMEBREW_NO_AUTO_UPDATE=1 brew install ninja; fi - if [ "$TRAVIS_OS_NAME" == "osx" ] && [[ "$CMAKE_CXX_FLAGS" == *"--coverage"* ]]; then HOMEBREW_NO_AUTO_UPDATE=1 brew install lcov; fi @@ -300,7 +320,8 @@ script: - if [ "$TRAVIS_OS_NAME" == "linux" ] && ( [ "$TARGET" == "desktop" ] || [ "$TARGET" == "desktop-sanitizers" ] ); then ./package/ci/travis-desktop.sh; fi - if [ "$TARGET" == "desktop-vulkan" ]; then ./package/ci/travis-desktop-vulkan.sh; fi - if [ "$TRAVIS_OS_NAME" == "linux" ] && [ "$TARGET" == "desktop-gles" ]; then ./package/ci/travis-desktop-gles.sh; fi -- if [ "$TRAVIS_OS_NAME" == "linux" ] && [ "$TARGET" == "android" ]; then ./package/ci/travis-android-arm.sh; fi +- if [ "$TRAVIS_OS_NAME" == "linux" ] && [ "$TARGET" == "android-gles" ]; then ./package/ci/travis-android-gles.sh; fi +- if [ "$TRAVIS_OS_NAME" == "linux" ] && [ "$TARGET" == "android-vulkan" ]; then ./package/ci/travis-android-vulkan.sh; fi - if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "desktop" ]; then ./package/ci/travis-desktop.sh; fi - if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "ios-simulator" ]; then ./package/ci/travis-ios-simulator.sh; fi - if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$TARGET" == "emscripten" ]; then ./package/ci/travis-emscripten.sh; fi