From 90a6c52e1c347d1c4283b0de9f860ed2fbc413bc Mon Sep 17 00:00:00 2001 From: Tom M Date: Sat, 8 May 2021 18:31:20 +0200 Subject: [PATCH] Rewrite Android CI Pipeline (#875) --- .azure/azure-pipelines-android.yml | 614 +++++++++++++++++++++++++++++ .azure/cmake-android.yml | 57 +++ .circleci/config.yml | 6 + README.md | 3 +- 4 files changed, 679 insertions(+), 1 deletion(-) create mode 100644 .azure/azure-pipelines-android.yml create mode 100644 .azure/cmake-android.yml diff --git a/.azure/azure-pipelines-android.yml b/.azure/azure-pipelines-android.yml new file mode 100644 index 00000000..fa02722e --- /dev/null +++ b/.azure/azure-pipelines-android.yml @@ -0,0 +1,614 @@ +parameters: +- name: UseCache + displayName: Use Dependency Cache + type: boolean + default: true + values: + - true + - false + +schedules: +- cron: "0 0 * * 1" + displayName: 'Weekly Monday Midnight build without caching' + branches: + include: + - master + always: true + +variables: + ICONV_VERSION: '1.16' + # Use recent master libffi, because 3.3 is broken: checking host system type... Invalid configuration `arm-none-linux-eabi': machine `arm-none-linux' not recognized + FFI_VERSION: 'dd5bd03075149d7cf8441875c1a344e8beb57dde' + GETTEXT_VERSION: '0.21' + #need to switch to meson build system to use a more recent version + GLIB_VERSION: '2.58' + GLIB_EXTRAVERSION: '3' + OBOE_VERSION: '1.5.0' + SNDFILE_VERSION: '1.0.31' + INSTPATCH_VERSION: '1.1.6' + VORBIS_VERSION: '1.3.7' + OGG_VERSION: '1.3.4' + # flac 1.3.3 is completely broken: pkgconfig is incorrectly installed, compilation failure, etc.; use recent master instead + FLAC_VERSION: '27c615706cedd252a206dd77e3910dfa395dcc49' + + # Android NDK sources and standalone toolchain is put here + DEV: '$(System.DefaultWorkingDirectory)/android-build-root' + + # This is a symlink pointing to the real Android NDK + # Must be the same as $ANDROID_NDK_HOME see: + # https://github.com/actions/virtual-environments/blob/main/images/linux/Ubuntu2004-README.md + NDK: '/usr/local/lib/android/sdk/ndk-bundle' + + # All the built binaries, libs and their headers will be installed here + PREFIX: '$(DEV)/opt/android' + + # The path of standalone NDK toolchain + # Refer to https://developer.android.com/ndk/guides/standalone_toolchain.html + NDK_TOOLCHAIN: '$(NDK)/toolchains/llvm/prebuilt/linux-x86_64/' + + # Don't mix up .pc files from your host and build target + PKG_CONFIG_PATH: '$(PREFIX)/lib/pkgconfig' + # setting PKG_CONFIG_PATH alone does not seem to be enough to avoid mixing up with the host, also set PKG_CONFIG_LIBDIR + PKG_CONFIG_LIBDIR: '$(PKG_CONFIG_PATH)' + + # Set Android target API level + # when compiling with clang use at least 28 as this makes sure that android provides the posix_spawn functions, so the compilation of gettext will (should) work out of the box + # it's probably a bug of gettext, if posix_spawn is not available it replaces it with its own implementation. Autotools of gettext set HAVE_POSIX_SPAWN==0 (which is correct) but for some reason REPLACE_POSIX_SPAWN==0 (which is wrong, as it should be 1). + # + # NOTE: API 24 is required because it provides fseeko() and ftello() required by libflac + ANDROID_API: '24' + + # Tell configure what flags Android requires. + # Turn Wimplicit-function-declaration into errors. Else autotools will be fooled when checking for available functions (that in fact are NOT available) and compilation will fail later on. + # Also disable clangs integrated assembler, as the hand written assembly of libffi is not recognized by it, cf. https://crbug.com/801303 + CFLAGS: "-fPIE -fPIC -I$(PREFIX)/include --sysroot=$(NDK_TOOLCHAIN)/sysroot -I$(NDK_TOOLCHAIN)/sysroot/usr/include -Werror=implicit-function-declaration -fno-integrated-as" + CXXFLAGS: $(CFLAGS) + CPPFLAGS: $(CXXFLAGS) + + ARTIFACT_NAME: 'fluidsynth-android$(ANDROID_API)' + +jobs: +- job: Android + strategy: + matrix: + ARM: + ARCH: 'arm' + ANDROID_ARCH: 'armv7a' + ANDROID_ABI_CMAKE: 'armeabi-v7a' + ANDROID_TARGET_ABI: "eabi" + # the --target to be used by autotools + #AUTOTOOLS_TARGET: "$(ARCH)-linux-android$(ANDROID_TARGET_ABI)" + AUTOTOOLS_TARGET: "$(ARCH)-none-linux-$(ANDROID_TARGET_ABI)" + AARCH64: + ARCH: 'aarch64' + ANDROID_ARCH: 'aarch64' + ANDROID_ABI_CMAKE: 'arm64-v8a' + ANDROID_TARGET_ABI: + #AUTOTOOLS_TARGET: "$(ARCH)-none-linux-android" + AUTOTOOLS_TARGET: "$(ARCH)-none-linux" + i686: + ARCH: 'i686' + ANDROID_ARCH: 'i686' + ANDROID_ABI_CMAKE: 'x86' + ANDROID_TARGET_ABI: + #AUTOTOOLS_TARGET: "$(ARCH)-pc-linux-android" + AUTOTOOLS_TARGET: "$(ARCH)-pc-linux" + x86_64: + ARCH: 'x86_64' + ANDROID_ARCH: 'x86_64' + ANDROID_ABI_CMAKE: 'x86_64' + ANDROID_TARGET_ABI: + #AUTOTOOLS_TARGET: "$(ARCH)-pc-linux-android" + AUTOTOOLS_TARGET: "$(ARCH)-pc-linux" + + pool: + vmImage: 'ubuntu-20.04' + + steps: + - script: | + set -ex + mkdir -p $(DEV) + displayName: 'mkdir $(DEV)' + + - script: | + set -ex + + wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-${ICONV_VERSION}.tar.gz + tar zxf libiconv-${ICONV_VERSION}.tar.gz + + wget -O libffi-${FFI_VERSION}.tar.gz https://github.com/libffi/libffi/archive/${FFI_VERSION}.tar.gz + tar zxf libffi-${FFI_VERSION}.tar.gz + + wget http://ftp.gnu.org/pub/gnu/gettext/gettext-${GETTEXT_VERSION}.tar.gz + tar zxf gettext-${GETTEXT_VERSION}.tar.gz + + wget http://ftp.gnome.org/pub/gnome/sources/glib/${GLIB_VERSION}/glib-${GLIB_VERSION}.${GLIB_EXTRAVERSION}.tar.xz + tar xf glib-${GLIB_VERSION}.${GLIB_EXTRAVERSION}.tar.xz + + wget -O oboe-${OBOE_VERSION}.tar.gz https://github.com/google/oboe/archive/${OBOE_VERSION}.tar.gz + tar zxf oboe-${OBOE_VERSION}.tar.gz + + wget https://github.com/libsndfile/libsndfile/releases/download/${SNDFILE_VERSION}/libsndfile-${SNDFILE_VERSION}.tar.bz2 + tar jxf libsndfile-${SNDFILE_VERSION}.tar.bz2 + + wget -O libinstpatch-${INSTPATCH_VERSION}.tar.gz https://github.com/swami/libinstpatch/archive/refs/tags/v${INSTPATCH_VERSION}.tar.gz + tar zxf libinstpatch-${INSTPATCH_VERSION}.tar.gz + + wget https://github.com/xiph/vorbis/releases/download/v${VORBIS_VERSION}/libvorbis-${VORBIS_VERSION}.tar.gz + tar zxf libvorbis-${VORBIS_VERSION}.tar.gz + + wget https://github.com/xiph/ogg/releases/download/v${OGG_VERSION}/libogg-${OGG_VERSION}.tar.gz + tar zxf libogg-${OGG_VERSION}.tar.gz + + wget -O flac-${FLAC_VERSION}.tar.gz https://github.com/xiph/flac/archive/${FLAC_VERSION}.tar.gz + tar xf flac-${FLAC_VERSION}.tar.gz + + displayName: 'Download Dependencies' + workingDirectory: $(DEV) + + - task: Cache@2 + inputs: + key: '$(ARCH) | $(DEV)/*.tar.gz | cacheVersion1' + path: '$(PREFIX)' + cacheHitVar: 'CACHE_RESTORED' + displayName: 'Cache fluidsynth dependency libraries' + condition: and(not(in(variables['Build.Reason'], 'Schedule')), ${{ parameters.useCache }}) + + - script: | + set -ex + + sudo apt remove --purge --auto-remove cmake + wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - | sudo tee /etc/apt/trusted.gpg.d/kitware.gpg >/dev/null + sudo apt-add-repository 'deb https://apt.kitware.com/ubuntu/ focal main' + displayName: 'Use recent CMake Version' + condition: ne(variables.CACHE_RESTORED, 'true') + enabled: 'false' + + - script: | + sudo apt-get update -y + displayName: 'Update apt' + condition: ne(variables.CACHE_RESTORED, 'true') + + - script: | + set -ex + sudo -E apt-get -yq --no-install-suggests --no-install-recommends install gettext cmake zlib1g-dev autogen automake autoconf libtool pkg-config autotools-dev build-essential meson ninja-build + displayName: 'apt-get install' + condition: ne(variables.CACHE_RESTORED, 'true') + + - script: | + set -e + + # The cross-compile toolchain we use + export ANDROID_TARGET=${ARCH}-linux-android${ANDROID_TARGET_ABI} + echo "##vso[task.setvariable variable=ANDROID_TARGET]$ANDROID_TARGET" + + export ANDROID_TARGET_API=${ANDROID_ARCH}-linux-android${ANDROID_TARGET_ABI}${ANDROID_API} + echo "##vso[task.setvariable variable=ANDROID_TARGET_API]$ANDROID_TARGET_API" + + # Add the standalone toolchain to the search path. + export PATH=$PATH:${PREFIX}/bin:${PREFIX}/lib:${PREFIX}/include:${NDK_TOOLCHAIN}/bin + echo "##vso[task.setvariable variable=PATH]$PATH" + + LIBPATH0=$(PREFIX)/lib + LIBPATH1=$(NDK_TOOLCHAIN)/sysroot/usr/lib + LIBPATH2=$(NDK_TOOLCHAIN)/sysroot/usr/lib/$(ARCH)-linux-android$(ANDROID_TARGET_ABI)/$(ANDROID_API) + LIBPATH3=$(NDK_TOOLCHAIN)/sysroot/usr/lib/$(ARCH)-linux-android$(ANDROID_TARGET_ABI) + + export LDFLAGS="-pie -Wl,-rpath-link=${LIBPATH1} -L${LIBPATH1} -Wl,-rpath-link=${LIBPATH2} -L${LIBPATH2} -Wl,-rpath-link=${LIBPATH3} -L${LIBPATH3} -Wl,-rpath-link=${LIBPATH0} -L${LIBPATH0}" + echo "##vso[task.setvariable variable=LDFLAGS]$LDFLAGS" + + # Tell configure what tools to use. + export AR=${ANDROID_TARGET}-ar + echo "##vso[task.setvariable variable=AR]$AR" + export AS=${ANDROID_TARGET_API}-clang + echo "##vso[task.setvariable variable=AS]$AS" + export CC=${ANDROID_TARGET_API}-clang + echo "##vso[task.setvariable variable=CC]$CC" + export CXX=${ANDROID_TARGET_API}-clang++ + echo "##vso[task.setvariable variable=CXX]$CXX" + export LD=ld.lld + echo "##vso[task.setvariable variable=LD]$LD" + export STRIP=${ANDROID_TARGET}-strip + echo "##vso[task.setvariable variable=STRIP]$STRIP" + export RANLIB=${ANDROID_TARGET}-ranlib + echo "##vso[task.setvariable variable=RANLIB]$RANLIB" + + displayName: 'Set environment variables' + + - script: | + set -ex + + pushd libiconv-${ICONV_VERSION} + ./configure \ + --host=${AUTOTOOLS_TARGET} \ + --prefix=${PREFIX} \ + --disable-rpath \ + --disable-static \ + --enable-shared \ + --with-pic \ + --disable-maintainer-mode \ + --disable-silent-rules \ + --disable-gtk-doc \ + --disable-introspection \ + --disable-nls + make -j$((`nproc`+1)) + make install + popd + + displayName: 'Compile libiconv' + workingDirectory: $(DEV) + condition: ne(variables.CACHE_RESTORED, 'true') + + - script: | + set -ex + + pushd libffi-${FFI_VERSION} + NOCONFIGURE=true autoreconf -v -i + # install headers into the conventional ${PREFIX}/include rather than ${PREFIX}/lib/libffi-3.2.1/include. + #sed -e '/^includesdir/ s/$(libdir).*$/$(includedir)/' -i include/Makefile.in + #sed -e '/^includedir/ s/=.*$/=@includedir@/' -e 's/^Cflags: -I${includedir}/Cflags:/' -i libffi.pc.in + ./configure --host=${AUTOTOOLS_TARGET} --prefix=${PREFIX} --enable-shared --disable-static + make -j$((`nproc`+1)) + make install + popd + displayName: 'Compile libffi' + workingDirectory: $(DEV) + condition: ne(variables.CACHE_RESTORED, 'true') + + - script: | + set -ex + export PKGCFG=`which pkg-config` + pushd glib-${GLIB_VERSION}.${GLIB_EXTRAVERSION} + + cat << EOF > cross-file.txt + [host_machine] + system = 'android' + cpu_family = 'arm' + cpu = 'arm' + endian = 'little' + + [binaries] + c = '${CC}' + cpp = '${CXX}' + ar = '${AR}' + ld = '${LD}' + strip = '${STRIP}' + pkgconfig = '${PKGCFG}' + + [built-in options] + c_std = 'c11' + c_args = ['-fPIC','-I/home/git/work/ndk/builddir/out/include'] + cpp_args = ['-fPIC','-I/home/git/work/ndk/builddir/out/include'] + c_link_args = ['-fPIE','-L/home/git/work/ndk/builddir/out/lib'] + + pkg_config_path = '${PKG_CONFIG_PATH}' + EOF + + cat << EOF > native-file.txt + [host_machine] + system = 'linux' + cpu_family = 'x86_64' + cpu = 'x86_64' + endian = 'little' + + [properties] + + [binaries] + c = ['false'] + cpp = ['false'] + objc = ['false'] + objcpp = ['false'] + ar = ['false'] + pkgconfig = ['false'] + cmake = ['false'] + EOF + + cat native-file.txt + cat cross-file.txt + + unset AR + unset AS + unset CC + unset CFLAGS + unset CPPFLAGS + unset CPP + unset CXXFLAGS + unset CXX + unset LDFLAGS + unset LD + unset STRIP + + meson \ + --cross-file cross-file.txt \ + --native-file native-file.txt \ + --prefix=${PREFIX} \ + --libdir=lib \ + -Ddebug=false \ + --default-library=both \ + -Doptimization=s \ + --backend=ninja \ + --wrap-mode=nodownload \ + -Dinternal_pcre=true \ + -Dlibmount=false \ + -Ddtrace=false \ + -Diconv=auto \ + -Dxattr=false \ + -Dgtk_doc=false \ + _builddir \ + . + ninja + popd + displayName: 'Compile glib (meson)' + workingDirectory: $(DEV) + enabled: 'false' + + - script: | + pushd glib-${GLIB_VERSION}.${GLIB_EXTRAVERSION} + cat _builddir/meson-logs/meson-log.txt + popd + displayName: 'Meson LOG' + workingDirectory: $(DEV) + condition: failed() + enabled: 'false' + + - script: | + set -ex + + pushd gettext-${GETTEXT_VERSION} + ./configure \ + --host=${AUTOTOOLS_TARGET} \ + --prefix=${PREFIX} \ + --disable-rpath \ + --disable-libasprintf \ + --disable-java \ + --disable-native-java \ + --disable-openmp \ + --disable-curses \ + --disable-static \ + --enable-shared \ + --with-pic \ + --disable-maintainer-mode \ + --disable-silent-rules \ + --disable-gtk-doc \ + --disable-introspection + make -j$((`nproc`+1)) + make install + popd + displayName: 'Compile gettext' + workingDirectory: $(DEV) + condition: ne(variables.CACHE_RESTORED, 'true') + + - script: | + set -ex + + pushd glib-${GLIB_VERSION}.${GLIB_EXTRAVERSION} + cat << EOF > android.cache + glib_cv_long_long_format=ll + glib_cv_stack_grows=no + glib_cv_sane_realloc=yes + glib_cv_have_strlcpy=no + glib_cv_va_val_copy=yes + glib_cv_rtldglobal_broken=no + glib_cv_uscore=no + glib_cv_monotonic_clock=no + ac_cv_func_nonposix_getpwuid_r=no + ac_cv_func_posix_getpwuid_r=no + ac_cv_func_posix_getgrgid_r=no + glib_cv_use_pid_surrogate=yes + ac_cv_func_printf_unix98=no + ac_cv_func_vsnprintf_c99=yes + ac_cv_func_realloc_0_nonnull=yes + ac_cv_func_realloc_works=yes + EOF + + # Unfortunately, libffi is not linked against libgobject when compiling for aarch64, leading to the following error: + # + # /bin/bash ../libtool --tag=CC --mode=link aarch64-linux-android23-clang -Wall -Wstrict-prototypes -Wno-bad-function-cast -Werror=declaration-after-statement -Werror=missing-prototypes -Werror=implicit-function-declaration -Werror=pointer-arith -Werror=init-self -Werror=format=2 -Werror=missing-include-dirs -fPIE -fPIC -I/home/vsts/work/1/s/android-build-root/opt/android/include --sysroot=/usr/local/lib/android/sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64//sysroot -I/usr/local/lib/android/sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64//sysroot/include -Werror=implicit-function-declaration -fno-integrated-as -fno-strict-aliasing -pie -Wl,-rpath-link=-I/usr/local/lib/android/sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64//sysroot/usr/lib -L/usr/local/lib/android/sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64//sysroot/usr/lib -L/home/vsts/work/1/s/android-build-root/opt/android/lib -L/usr/local/lib/android/sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64//lib -o gobject-query gobject-query.o ./libgobject-2.0.la ../glib/libglib-2.0.la -lintl -liconv + # libtool: link: aarch64-linux-android23-clang -Wall -Wstrict-prototypes -Wno-bad-function-cast -Werror=declaration-after-statement -Werror=missing-prototypes -Werror=implicit-function-declaration -Werror=pointer-arith -Werror=init-self -Werror=format=2 -Werror=missing-include-dirs -fPIE -fPIC -I/home/vsts/work/1/s/android-build-root/opt/android/include --sysroot=/usr/local/lib/android/sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64//sysroot -I/usr/local/lib/android/sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64//sysroot/include -Werror=implicit-function-declaration -fno-integrated-as -fno-strict-aliasing -pie -Wl,-rpath-link=-I/usr/local/lib/android/sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64//sysroot/usr/lib -o .libs/gobject-query gobject-query.o -L/usr/local/lib/android/sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64//sysroot/usr/lib -L/home/vsts/work/1/s/android-build-root/opt/android/lib -L/usr/local/lib/android/sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64//lib ./.libs/libgobject-2.0.so ../glib/.libs/libglib-2.0.so /home/vsts/work/1/s/android-build-root/opt/android/lib/libintl.so /home/vsts/work/1/s/android-build-root/opt/android/lib/libiconv.so -pthread -L/home/vsts/work/1/s/android-build-root/opt/android/lib + # /usr/local/lib/android/sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64//bin/../lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin/ld: warning: libffi.so, needed by ./.libs/libgobject-2.0.so, not found (try using -rpath or -rpath-link) + # ./.libs/libgobject-2.0.so: undefined reference to `ffi_type_sint32@LIBFFI_BASE_8.0' + # ./.libs/libgobject-2.0.so: undefined reference to `ffi_prep_cif@LIBFFI_BASE_8.0' + # + # So, just add it to LDFLAGS to make sure it's always linked. + # libz.so is also missing... + #FFILIB=`pkg-config --libs libffi` + #echo ${FFILIB} + #export LDFLAGS="${LDFLAGS} ${FFILIB} -lz" + #unset FFILIB + + chmod a-x android.cache + NOCONFIGURE=true ./autogen.sh + ./configure \ + --host=${ANDROID_TARGET} \ + --prefix=${PREFIX} \ + --disable-dependency-tracking \ + --cache-file=android.cache \ + --enable-included-printf \ + --with-pcre=no \ + --enable-libmount=no \ + --enable-xattr=no \ + --with-libiconv=gnu \ + --disable-static \ + --enable-shared \ + --with-pic \ + --disable-maintainer-mode \ + --disable-silent-rules + make -j$((`nproc`+1)) + make install + popd + displayName: 'Compile glib' + workingDirectory: $(DEV) + condition: ne(variables.CACHE_RESTORED, 'true') + + - template: cmake-android.yml + parameters: + sourceDir: 'libogg-$(OGG_VERSION)' + cmakeArgs: '-DINSTALL_DOCS=0' + + - script: | + ls -la libogg-${OGG_VERSION}/build/CMakeFiles/ + cat libogg-${OGG_VERSION}/build/CMakeFiles/CMakeError.log + true + displayName: 'Print OGG Cmake Error Log' + condition: always() + workingDirectory: $(DEV) + + - template: cmake-android.yml + parameters: + sourceDir: 'libvorbis-$(VORBIS_VERSION)' + + - script: | + ls -la libvorbis-${VORBIS_VERSION}/build/CMakeFiles/ + cat libvorbis-${VORBIS_VERSION}/build/CMakeFiles/CMakeError.log + true + displayName: 'Print Vorbis Cmake Error Log' + condition: always() + workingDirectory: $(DEV) + + # flac uses c99 macros, but doesnt specify a standard, so we need to do it explicitly. + # On i686, they invoke yasm with -fstack-protector-strong flag... turn off asm optimizations. + - template: cmake-android.yml + parameters: + sourceDir: 'flac-$(FLAC_VERSION)' + cmakeArgs: '-DCMAKE_C_STANDARD=99 -DCMAKE_C_STANDARD_REQUIRED=1 -DWITH_ASM=0 -DBUILD_CXXLIBS=0 -DBUILD_PROGRAMS=0 -DBUILD_EXAMPLES=0 -DBUILD_DOCS=0 -DINSTALL_MANPAGES=0' + + - script: | + ls -la flac-${FLAC_VERSION}/build/CMakeFiles/ + cat flac-${FLAC_VERSION}/build/CMakeFiles/CMakeError.log + true + displayName: 'Print FLAC Cmake Error Log' + condition: always() + workingDirectory: $(DEV) + + - template: cmake-android.yml + parameters: + sourceDir: 'libsndfile-$(SNDFILE_VERSION)' + cmakeArgs: '-DBUILD_PROGRAMS=0 -DBUILD_EXAMPLES=0' + + - script: | + ls -la libsndfile-${SNDFILE_VERSION}/build/CMakeFiles/ + cat libsndfile-${SNDFILE_VERSION}/build/CMakeFiles/CMakeError.log + true + displayName: 'Print libsndfile Cmake Error Log' + condition: always() + workingDirectory: $(DEV) + + - template: cmake-android.yml + parameters: + sourceDir: 'oboe-$(OBOE_VERSION)' + installCommand: 'cp liboboe.* ${PREFIX}/lib/ && cp -ur ../include/oboe ${PREFIX}/include' + + - script: | + set -ex + + # create a custom pkgconfig file for oboe to allow fluidsynth to find it + cat << EOF > ${PKG_CONFIG_PATH}/oboe-1.0.pc + prefix=${PREFIX} + exec_prefix=\${prefix} + libdir=\${prefix}/lib + includedir=\${prefix}/include + + Name: Oboe + Description: Oboe library + Version: ${OBOE_VERSION} + Libs: -L\${libdir} -loboe -landroid -llog + Cflags: -I\${includedir} + EOF + + cat ${PKG_CONFIG_PATH}/oboe-1.0.pc + + displayName: 'Create fake oboe.pc' + workingDirectory: $(DEV) + condition: ne(variables.CACHE_RESTORED, 'true') + + - template: cmake-android.yml + parameters: + sourceDir: 'libinstpatch-$(INSTPATCH_VERSION)' + + # finally, compile fluidsynth + - template: cmake-android.yml + parameters: + workDir: '$(System.DefaultWorkingDirectory)' + sourceDir: '.' + condition: succeeded() + cmakeArgs: '-Denable-opensles=1 -Denable-floats=1 -Denable-oboe=1 -Denable-dbus=0 -Denable-oss=0' + installCommand: '' + + - script: | + set -x + export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$(PREFIX)/lib:$(NDK_TOOLCHAIN)/sysroot/usr/lib/$(ARCH)-linux-android$(ANDROID_TARGET_ABI)/$(ANDROID_API) + pushd build + make -j$((`nproc`+1)) check + ldd test/test_sample_cache + popd + displayName: 'Execute fluidsynth unit test' + condition: and(succeeded(), in(variables['ARCH'], 'x86_64', 'i686')) + enabled: 'false' + + - script: | + set -ex + pushd build + make install + popd + displayName: 'Install fluidsynth' + + - template: cmake-android.yml + parameters: + workDir: '$(System.DefaultWorkingDirectory)/doc/android/fluidsynth-assetloader/' + sourceDir: '.' + condition: succeeded() + installCommand: 'cp *.so ${PREFIX}/lib/' + + + - script: | + ls -Rg $(PREFIX) + displayName: 'Show cross-compiled files in $(PREFIX)' + condition: always() + + - script: | + set -ex + mkdir -p $(Build.ArtifactStagingDirectory)/$(ARCH) + cd $(Build.ArtifactStagingDirectory)/$(ARCH) + cp -a $(PREFIX)/lib/* . + ls -Rg . + rm -rf *.dll *.alias gettext/ libtextstyle.* *.a *.la + displayName: 'Collecting artifacts' + + - script: | + set -ex + ls libFLAC.so + ls libcharset.so + ls libffi.so + ls libfluidsynth-assetloader.so + ls libfluidsynth.so + ls libgio-2.0.so + ls libglib-2.0.so + ls libgmodule-2.0.so + ls libgobject-2.0.so + ls libgthread-2.0.so + ls libiconv.so + ls libinstpatch-1.0.so + ls libintl.so + ls liboboe.so + ls libogg.so + ls libsndfile.so + ls libvorbis.so + ls libvorbisenc.so + ls libvorbisfile.so + displayName: 'Verify all libs exist' + workingDirectory: '$(PREFIX)/lib' + + - task: PublishBuildArtifacts@1 + displayName: 'Publishing Artefacts for Android API$(ANDROID_API) $(ARCH)' + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)' + ArtifactName: '$(ARTIFACT_NAME)' + publishLocation: 'Container' + + - script: | + set -ex + # as very last step before creating the pipeline cache, remove fluidsynth + pushd build + make uninstall + popd + displayName: 'Uninstall fluidsynth' \ No newline at end of file diff --git a/.azure/cmake-android.yml b/.azure/cmake-android.yml new file mode 100644 index 00000000..a4e5635c --- /dev/null +++ b/.azure/cmake-android.yml @@ -0,0 +1,57 @@ + +parameters: +- name: cmakeArgs + type: string + default: '' +- name: sourceDir + type: string + default: '' +- name: workDir + type: string + default: $(DEV) +- name: condition + type: string + default: ne(variables.CACHE_RESTORED, 'true') +- name: installCommand + type: string + default: 'make install' + +steps: +- script: | + set -ex + + pushd ${{ parameters.sourceDir }} + mkdir -p build + pushd build + + # Invoke cmake in the most correctest way I've could find while try and erroring: + # + # The biggest pain point is that CMake does not seem to respect our existing cross compilation CFLAGS and LDFLAGS. + # Hence we are passing them manually, once via Android flags and once for "Required" flags. The latter is necessary + # to let cmake correctly probe for any existing header, function, library, etc. + # Watch out: Sometimes the flags are passed as ;-limited list! + cmake -G "Unix Makefiles" \ + -DCMAKE_MAKE_PROGRAM=make \ + -DCMAKE_TOOLCHAIN_FILE=${NDK}/build/cmake/android.toolchain.cmake \ + -DANDROID_NATIVE_API_LEVEL=${ANDROID_API} \ + -DANDROID_ABI=${ANDROID_ABI_CMAKE} \ + -DANDROID_TOOLCHAIN=${CC} \ + -DANDROID_NDK=${NDK} \ + -DANDROID_COMPILER_FLAGS="${CFLAGS// /;}" \ + -DANDROID_LINKER_FLAGS="${LDFLAGS// /;}" \ + -DANDROID_STL="c++_shared" \ + -DCMAKE_REQUIRED_FLAGS="${CFLAGS}" \ + -DCMAKE_REQUIRED_LINK_OPTIONS="${LDFLAGS// /;}" \ + -DCMAKE_INSTALL_PREFIX=${PREFIX} \ + -DCMAKE_STAGING_PREFIX=${PREFIX} \ + -DCMAKE_VERBOSE_MAKEFILE=1 \ + -DBUILD_SHARED_LIBS=1 \ + -DLIB_SUFFIX="" \ + ${{ parameters.cmakeArgs }} .. + make -j$((`nproc`+1)) + ${{ parameters.installCommand }} + popd + popd + displayName: 'Compile ${{ parameters.sourceDir }}' + workingDirectory: ${{ parameters.workDir }} + condition: ${{ parameters.condition }} diff --git a/.circleci/config.yml b/.circleci/config.yml index f8d87f77..6b375161 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -30,6 +30,7 @@ jobs: working_directory: doc/android command: | export TERM=dumb + export VERBOSE=1 echo Starting `nproc` parallel jobs make -f Makefile.android prepare - run: @@ -52,6 +53,11 @@ jobs: working_directory: doc/android command: | ls -R + mv ./external/cerbero/build/logs dist/ + cp ./external/cerbero/build/sources/android_armv7/glib-2.62.6/_builddir/meson*.txt dist/armeabi-v7a/ + cp ./external/cerbero/build/sources/android_arm64/glib-2.62.6/_builddir/meson*.txt dist/arm64-v8a/ + cp ./external/cerbero/build/sources/android_x86/glib-2.62.6/_builddir/meson*.txt dist/x86/ + cp ./external/cerbero/build/sources/android_x86_64/glib-2.62.6/_builddir/meson*.txt dist/x86_64/ - run: name: Zip FluidSynth Android Distribution working_directory: doc/android diff --git a/README.md b/README.md index af4ebd91..76d7ff48 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,8 @@ | **Windows** | [![Build Status](https://dev.azure.com/tommbrt/tommbrt/_apis/build/status/FluidSynth.fluidsynth.Win?branchName=master)](https://dev.azure.com/tommbrt/tommbrt/_build/latest?definitionId=3&branchName=master) | | **Windows (vcpkg)** | [![Build Status](https://dev.azure.com/tommbrt/tommbrt/_apis/build/status/FluidSynth.fluidsynth.vcpkg?branchName=master)](https://dev.azure.com/tommbrt/tommbrt/_build/latest?definitionId=6&branchName=master) | | **MacOSX** | [![Build Status](https://dev.azure.com/tommbrt/tommbrt/_apis/build/status/FluidSynth.fluidsynth.macOS?branchName=master)](https://dev.azure.com/tommbrt/tommbrt/_build/latest?definitionId=5&branchName=master) | -| **Android** | [![CircleCI](https://circleci.com/gh/FluidSynth/fluidsynth/tree/master.svg?style=shield)](https://circleci.com/gh/FluidSynth/fluidsynth) | +| **Android** | [![Build Status](https://dev.azure.com/tommbrt/tommbrt/_apis/build/status/FluidSynth.fluidsynth.Android?branchName=master)](https://dev.azure.com/tommbrt/tommbrt/_build/latest?definitionId=4&branchName=master) | +| **Android** (legacy Cerbero) | [![CircleCI](https://circleci.com/gh/FluidSynth/fluidsynth/tree/master.svg?style=shield)](https://circleci.com/gh/FluidSynth/fluidsynth) |