diff --git a/.azure/azure-pipelines-android.yml b/.azure/azure-pipelines-android.yml index da65e4f82..30e6c43ec 100644 --- a/.azure/azure-pipelines-android.yml +++ b/.azure/azure-pipelines-android.yml @@ -17,7 +17,7 @@ parameters: - name: UseCache displayName: Use Dependency Cache type: boolean - default: false + default: true values: - true - false @@ -44,8 +44,8 @@ variables: VORBIS_VERSION: '1.3.7' OGG_VERSION: '1.3.5' OPUS_VERSION: '1.3.1' - # flac 1.3.3 is completely broken: pkgconfig is incorrectly installed, compilation failure, etc.; use recent master instead - FLAC_VERSION: '27c615706cedd252a206dd77e3910dfa395dcc49' + FLAC_VERSION: '1.3.4' + PCRE_VERSION: '8.45' # Android NDK sources and standalone toolchain is put here DEV: '$(System.DefaultWorkingDirectory)/android-build-root' @@ -84,6 +84,7 @@ variables: CFLAGS: "-fPIE -fPIC -I$(PREFIX)/include --sysroot=$(NDK_TOOLCHAIN)/sysroot -I$(NDK_TOOLCHAIN)/sysroot/usr/include -Werror=implicit-function-declaration" CXXFLAGS: $(CFLAGS) CPPFLAGS: $(CXXFLAGS) + DEBIAN_FRONTEND: 'noninteractive' ARTIFACT_NAME: 'fluidsynth-android$(ANDROID_API)' @@ -96,10 +97,9 @@ jobs: ANDROID_ARCH: 'armv7a' ANDROID_ABI_CMAKE: 'armeabi-v7a' ANDROID_TARGET_ABI: "eabi" - ANDROID_ABI_MESON: 'arm' + ANDROID_ABI_MESON: 'arm' # 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' @@ -107,7 +107,6 @@ jobs: ANDROID_TARGET_ABI: ANDROID_ABI_MESON: 'aarch64' AUTOTOOLS_TARGET: "$(ARCH)-none-linux-android" - #AUTOTOOLS_TARGET: "$(ARCH)-none-linux" i686: ARCH: 'i686' ANDROID_ARCH: 'i686' @@ -115,7 +114,6 @@ jobs: ANDROID_TARGET_ABI: ANDROID_ABI_MESON: 'x86' AUTOTOOLS_TARGET: "$(ARCH)-pc-linux-android" - #AUTOTOOLS_TARGET: "$(ARCH)-pc-linux" x86_64: ARCH: 'x86_64' ANDROID_ARCH: 'x86_64' @@ -123,7 +121,6 @@ jobs: ANDROID_TARGET_ABI: ANDROID_ABI_MESON: 'x86_64' AUTOTOOLS_TARGET: "$(ARCH)-pc-linux-android" - #AUTOTOOLS_TARGET: "$(ARCH)-pc-linux" pool: vmImage: 'ubuntu-20.04' @@ -134,6 +131,15 @@ jobs: mkdir -p $(DEV) displayName: 'mkdir $(DEV)' + - script: | + sudo apt-get update -y + displayName: 'Update apt' + + - script: | + set -ex + sudo -E apt-get -y --no-install-suggests --no-install-recommends install wget tar bzip2 xz-utils ca-certificates + displayName: 'apt-get install wget tar' + - script: | set -ex @@ -164,18 +170,25 @@ jobs: 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 + wget -O flac-${FLAC_VERSION}.tar.gz https://github.com/xiph/flac/archive/refs/tags/${FLAC_VERSION}.tar.gz tar xf flac-${FLAC_VERSION}.tar.gz wget -O opus-${OPUS_VERSION}.tar.gz https://github.com/xiph/opus/archive/refs/tags/v${OPUS_VERSION}.tar.gz tar xf opus-${OPUS_VERSION}.tar.gz + wget -O pcre-${PCRE_VERSION}.tar.bz2 https://sourceforge.net/projects/pcre/files/pcre/${PCRE_VERSION}/pcre-${PCRE_VERSION}.tar.bz2/download + tar jxf pcre-${PCRE_VERSION}.tar.bz2 + cd pcre-${PCRE_VERSION} + # CMake checks for existence of strtoq() using the C compiler - and yes, it does exist! + # Later on, it's actually used by the C++ compiler, where it does not exist. + # Rename the function so CMake won't find it. + sed -i 's/strtoq/strtoqqqq/g' CMakeLists.txt displayName: 'Download Dependencies' workingDirectory: $(DEV) - task: Cache@2 inputs: - key: '$(ARCH) | $(DEV)/*.tar.gz | cacheVersion3' + key: '$(ARCH) | $(DEV)/*.tar.*' path: '$(PREFIX)' cacheHitVar: 'CACHE_RESTORED' displayName: 'Cache fluidsynth dependency libraries' @@ -191,15 +204,10 @@ jobs: condition: and(succeeded(), ne(variables.CACHE_RESTORED, 'true')) enabled: 'false' - - script: | - sudo apt-get update -y - displayName: 'Update apt' - condition: and(succeeded(), 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 python3-distutils - displayName: 'apt-get install' + sudo -E apt-get -y --no-install-suggests --no-install-recommends install gettext cmake zlib1g-dev autogen automake autoconf libtool pkg-config autotools-dev build-essential meson ninja-build python3-distutils + displayName: 'apt-get install build-tools' condition: and(succeeded(), ne(variables.CACHE_RESTORED, 'true')) - script: | @@ -266,6 +274,14 @@ jobs: workingDirectory: $(DEV) condition: and(succeeded(), ne(variables.CACHE_RESTORED, 'true')) + - script: | + set -ex + pushd libiconv-${ICONV_VERSION} + cat config.log + displayName: 'libiconv config.log' + workingDirectory: $(DEV) + condition: and(failed(), ne(variables.CACHE_RESTORED, 'true')) + - script: | set -ex @@ -310,69 +326,10 @@ jobs: workingDirectory: $(DEV) condition: and(succeeded(), 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} \ - --libdir=${LIBPATH0} \ - --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) - enabled: 'false' - condition: and(succeeded(), ne(variables.CACHE_RESTORED, 'true')) + - template: cmake-android.yml + parameters: + sourceDir: 'pcre-$(PCRE_VERSION)' + cmakeArgs: '-DPCRE_SUPPORT_UNICODE_PROPERTIES=1 -DPCRE_SUPPORT_UTF=1 -DPCRE_BUILD_PCRECPP=0 -DPCRE_BUILD_TESTS=0' - script: | set -ex @@ -400,7 +357,6 @@ jobs: prefix = '${PREFIX}' c_args = '${CFLAGS}' cpp_args = '${CXXFLAGS}' - sys_root = '${NDK_TOOLCHAIN}/sysroot' pkg_config_libdir = '${PKG_CONFIG_LIBDIR}' c_link_args = '${LDFLAGS}' @@ -417,22 +373,26 @@ jobs: cat cross_file.ini - env -i bash -c "export PATH && meson setup build --cross-file cross_file.ini --prefix=${PREFIX}" + # When CC and CXX are set, then meson detects them as host compiler (not cross compiler), + # so they tries to run arm binaries in x86. That's why sanity check is failing, and that's + # why we have to use env -i. + # And we must explicitly set PKG_CONFIG_LIBDIR, because pkg_config_libdir is only recognized by meson >= 0.54 + env -i bash -c "export PATH && export PKG_CONFIG_LIBDIR=$(PKG_CONFIG_LIBDIR) && meson setup build --cross-file cross_file.ini --prefix=$(PREFIX)" ninja -C build ninja -C build install popd displayName: 'Compile glib (meson)' workingDirectory: $(DEV) - + condition: and(succeeded(), ne(variables.CACHE_RESTORED, 'true')) - script: | pushd glib-${GLIB_VERSION}.${GLIB_EXTRAVERSION} - cat _builddir/meson-logs/meson-log.txt + ls -la build + cat build/meson-logs/meson-log.txt popd displayName: 'Meson LOG' workingDirectory: $(DEV) - condition: failed() - enabled: 'false' + condition: and(succeededOrFailed(), ne(variables.CACHE_RESTORED, 'true')) - template: cmake-android.yml parameters: @@ -564,6 +524,8 @@ jobs: ls libvorbis.so ls libvorbisenc.so ls libvorbisfile.so + ls libpcre.so + ls libpcreposix.so displayName: 'Verify all libs exist' workingDirectory: '$(PREFIX)/lib'