Skip to content

Refactor Android build workflow and environment variables #12

Refactor Android build workflow and environment variables

Refactor Android build workflow and environment variables #12

Workflow file for this run

name: FluidSynth Android

Check failure on line 1 in .github/workflows/android.yml

View workflow run for this annotation

GitHub Actions / .github/workflows/android.yml

Invalid workflow file

(Line: 48, Col: 11): Unrecognized named-value: 'env'. Located at position 1 within expression: env.DEV, (Line: 52, Col: 13): Unrecognized named-value: 'env'. Located at position 1 within expression: env.PREFIX, (Line: 56, Col: 18): Unrecognized named-value: 'env'. Located at position 1 within expression: env.NDK, (Line: 59, Col: 20): Unrecognized named-value: 'envLIBPATH0'. Located at position 1 within expression: envLIBPATH0, (Line: 61, Col: 22): Unrecognized named-value: 'env'. Located at position 1 within expression: env.PKG_CONFIG_PATH, (Line: 72, Col: 11): Unrecognized named-value: 'env'. Located at position 1 within expression: env.PREFIX, (Line: 73, Col: 13): Unrecognized named-value: 'env'. Located at position 1 within expression: env.CFLAGS, (Line: 74, Col: 13): Unrecognized named-value: 'env'. Located at position 1 within expression: env.CXXFLAGS, (Line: 77, Col: 18): Unrecognized named-value: 'env'. Located at position 1 within expression: env.ANDROID_API
on:
pull_request:
push:
paths-ignore:
- '.azure/**'
- '.github/workflows/api_doc_build.yml'
- '.github/workflows/codeql-analysis.yml'
- '.github/workflows/codespell.yml'
- '.github/workflows/linux.yml'
- '.github/workflows/sonarcloud.yml'
- '.github/workflows/solaris.yml'
- '.github/workflows/windows.yml'
- '.github/workflows/ios.yml'
- '.cirrus.yml'
- 'README.md'
schedule:
# Weekly Monday Midnight build without caching
- cron: '0 0 * * 1'
env:
ICONV_VERSION: '1.17'
# libffi 3.4.4 fails due to https://github.com/libffi/libffi/issues/760
FFI_VERSION: 'ce077e5565366171aa1b4438749b0922fce887a4'
GETTEXT_VERSION: '0.22.5'
GLIB_VERSION: '2.72'
GLIB_EXTRAVERSION: '4'
OBOE_VERSION: '1.9.0'
SNDFILE_VERSION: '1.2.2'
INSTPATCH_VERSION: '1.1.6'
VORBIS_VERSION: '1.3.7'
OGG_VERSION: '1.3.5'
OPUS_VERSION: '1.5.2'
FLAC_VERSION: '1.4.3'
PCRE_VERSION: '8.45'
# Android NDK sources and standalone toolchain is put here
DEV: '${{ github.workspace }}/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
# We cannot use $ANDROID_NDK_HOME because this is an environment variable, but here, we need a compile-time constant.
NDK: '/usr/local/lib/android/sdk/ndk/27.3.13750724'
# All the built binaries, libs and their headers will be installed here
PREFIX: '${{ env.DEV }}/opt/android'
# Prevent installing to lib64/
# This becomes important, if you would build on e.g. openSUSE
LIBPATH0: '${{ env.PREFIX }}/lib'
# The path of standalone NDK toolchain
# Refer to https://developer.android.com/ndk/guides/standalone_toolchain.html
NDK_TOOLCHAIN: '${{ env.NDK }}/toolchains/llvm/prebuilt/linux-x86_64/'
# Don't mix up .pc files from your host and build target
PKG_CONFIG_PATH: '${{ envLIBPATH0}}/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: '${{ env.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.
CFLAGS: "-fPIE -fPIC -I${{ env.PREFIX }}/include --sysroot=${{ env.NDK_TOOLCHAIN }}/sysroot -I${{ env.NDK_TOOLCHAIN }}/sysroot/usr/include -Werror=implicit-function-declaration"
CXXFLAGS: ${{ env.CFLAGS }}
CPPFLAGS: ${{ env.CXXFLAGS }}
DEBIAN_FRONTEND: 'noninteractive'
ARTIFACT_NAME: 'fluidsynth-android${{ env.ANDROID_API }}'
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-22.04
strategy:
matrix:
include:
- arch: 'arm'
android_arch: 'armv7a'
android_abi_cmake: 'armeabi-v7a'
android_target_abi: 'eabi'
android_abi_meson: 'arm'
autotools_target: 'arm-linux-androideabi'
- arch: 'aarch64'
android_arch: 'aarch64'
android_abi_cmake: 'arm64-v8a'
android_target_abi: ''
android_abi_meson: 'aarch64'
autotools_target: 'aarch64-none-linux-android'
- arch: 'i686'
android_arch: 'i686'
android_abi_cmake: 'x86'
android_target_abi: ''
android_abi_meson: 'x86'
autotools_target: 'i686-pc-linux-android'
- arch: 'x86_64'
android_arch: 'x86_64'
android_abi_cmake: 'x86_64'
android_target_abi: ''
android_abi_meson: 'x86_64'
autotools_target: 'x86_64-pc-linux-android'
steps:
- name: Checkout
uses: actions/checkout@v5
with:
submodules: true
- name: Setup build directories
run: |
set -ex
mkdir -p ${{ env.DEV }}
- name: Update apt
run: sudo apt-get update -y
- name: Install wget and tar
run: |
set -ex
sudo -E apt-get -y --no-install-suggests --no-install-recommends install wget tar bzip2 xz-utils ca-certificates
- name: Download Dependencies
run: |
set -ex
wget http://ftpmirror.gnu.org/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://ftpmirror.gnu.org/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.xz
tar xf libsndfile-${SNDFILE_VERSION}.tar.xz
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/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 the 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
working-directory: ${{ env.DEV }}
- name: Cache fluidsynth dependency libraries
id: cache-deps
if: github.event_name != 'schedule'
uses: actions/cache@v4
with:
key: ${{ matrix.arch }}-android${{ env.ANDROID_API }}-${{ env.NDK }}-${{ env.DEV }}/*.tar.*
path: ${{ env.PREFIX }}
- name: Install build tools
if: steps.cache-deps.outputs.cache-hit != 'true'
run: |
set -ex
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
- name: Set environment variables
run: |
set -e
# The cross-compile toolchain we use
ANDROID_TARGET="${{ matrix.arch }}-linux-android${{ matrix.android_target_abi }}"
echo "ANDROID_TARGET=$ANDROID_TARGET" >> $GITHUB_ENV
ANDROID_TARGET_API="${{ matrix.android_arch }}-linux-android${{ matrix.android_target_abi }}${ANDROID_API}"
echo "ANDROID_TARGET_API=$ANDROID_TARGET_API" >> $GITHUB_ENV
# Add the standalone toolchain to the search path.
echo "${{ env.PREFIX }}/bin" >> $GITHUB_PATH
echo "${{ env.PREFIX }}/lib" >> $GITHUB_PATH
echo "${{ env.PREFIX }}/include" >> $GITHUB_PATH
echo "${{ env.NDK_TOOLCHAIN }}/bin" >> $GITHUB_PATH
# Linker flags
LIBPATH1="${{ env.NDK_TOOLCHAIN }}/sysroot/usr/lib"
LIBPATH2="${{ env.NDK_TOOLCHAIN }}/sysroot/usr/lib/${{ matrix.arch }}-linux-android${{ matrix.android_target_abi }}/${ANDROID_API}"
LIBPATH3="${{ env.NDK_TOOLCHAIN }}/sysroot/usr/lib/${{ matrix.arch }}-linux-android${{ matrix.android_target_abi }}"
# Add max. page size to linker flag, see https://developer.android.com/guide/practices/page-sizes
echo "LDFLAGS=-pie -Wl,-z,max-page-size=16384 -Wl,-rpath-link=${LIBPATH1} -L${LIBPATH1} -Wl,-rpath-link=${LIBPATH2} -L${LIBPATH2} -Wl,-rpath-link=${LIBPATH3} -L${LIBPATH3} -Wl,-rpath-link=${LIBPATH0} -L${LIBPATH0}" >> $GITHUB_ENV
# Tell configure what tools to use.
echo "AR=llvm-ar" >> $GITHUB_ENV
echo "AS=${ANDROID_TARGET_API}-clang" >> $GITHUB_ENV
echo "CC=${ANDROID_TARGET_API}-clang" >> $GITHUB_ENV
echo "CXX=${ANDROID_TARGET_API}-clang++" >> $GITHUB_ENV
echo "LD=ld.lld" >> $GITHUB_ENV
echo "STRIP=llvm-strip" >> $GITHUB_ENV
echo "RANLIB=llvm-ranlib" >> $GITHUB_ENV
- name: Compile libiconv-${{ env.ICONV_VERSION }}
if: steps.cache-deps.outputs.cache-hit != 'true'
run: |
set -ex
pushd libiconv-${ICONV_VERSION}
./configure \
--host=${{ matrix.autotools_target }} \
--prefix=${PREFIX} \
--libdir=${LIBPATH0} \
--disable-rpath \
--enable-static \
--disable-shared \
--with-pic \
--disable-maintainer-mode \
--disable-silent-rules \
--disable-gtk-doc \
--disable-introspection \
--disable-nls
make -j$((`nproc`+1))
make install
popd
working-directory: ${{ env.DEV }}
- name: libiconv config.log
if: ${{ failure() && env.CACHE_RESTORED != 'true' }}
working-directory: ${{ env.DEV }}
run: |
set -ex
pushd "libiconv-${ICONV_VERSION}"
cat config.log
popd
- name: Compile libffi
if: steps.cache-deps.outputs.cache-hit != 'true'
run: |
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=${{ matrix.autotools_target }} --prefix=${PREFIX} --libdir=${LIBPATH0} --enable-static --disable-shared
make -j$((`nproc`+1))
make install
popd
working-directory: ${{ env.DEV }}
- name: Compile gettext
if: steps.cache-deps.outputs.cache-hit != 'true'
run: |
set -ex
pushd gettext-${GETTEXT_VERSION}
./configure \
--host=${{ matrix.autotools_target }} \
--prefix=${PREFIX} \
--libdir=${LIBPATH0} \
--disable-rpath \
--disable-libasprintf \
--disable-java \
--disable-native-java \
--disable-openmp \
--disable-curses \
--enable-static \
--disable-shared \
--with-pic \
--disable-maintainer-mode \
--disable-silent-rules \
--disable-gtk-doc \
--disable-introspection
make -j$((`nproc`+1))
make install
popd
working-directory: ${{ env.DEV }}
- name: Compile pcre
if: steps.cache-deps.outputs.cache-hit != 'true'
run: |
set -ex
pushd pcre-${PCRE_VERSION}
mkdir -p build
pushd build
cmake -G "Unix Makefiles" \
-DCMAKE_MAKE_PROGRAM=make \
-DCMAKE_TOOLCHAIN_FILE=${NDK}/build/cmake/android.toolchain.cmake \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DANDROID_NATIVE_API_LEVEL=${ANDROID_API} \
-DANDROID_ABI=${{ matrix.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= \
-DPCRE_SUPPORT_UNICODE_PROPERTIES=1 -DPCRE_SUPPORT_UTF=1 -DPCRE_BUILD_PCRECPP=0 -DPCRE_BUILD_TESTS=0 ..
make -j$((`nproc`+1))
make install
popd
popd
working-directory: ${{ env.DEV }}
- name: Compile glib (meson)
if: steps.cache-deps.outputs.cache-hit != 'true'
run: |
set -ex
export PKGCFG=`which pkg-config`
pushd glib-${GLIB_VERSION}.${GLIB_EXTRAVERSION}
cat << EOF > cross_file.ini
[host_machine]
system = 'android'
cpu_family = '${{ matrix.android_abi_meson }}'
cpu = '${{ matrix.android_arch }}'
endian = 'little'
[binaries]
c = '${NDK_TOOLCHAIN}/bin/${CC}'
cpp = '${NDK_TOOLCHAIN}/bin/${CXX}'
ar = '${NDK_TOOLCHAIN}/bin/${AR}'
as = '${NDK_TOOLCHAIN}/bin/${AS}'
ld = '${NDK_TOOLCHAIN}/bin/${LD}'
strip = '${NDK_TOOLCHAIN}/bin/${STRIP}'
ranlib = '${NDK_TOOLCHAIN}/bin/${RANLIB}'
pkgconfig = '${PKGCFG}'
[properties]
prefix = '${PREFIX}'
c_args = '${CFLAGS}'
cpp_args = '${CXXFLAGS}'
pkg_config_libdir = '${PKG_CONFIG_LIBDIR}'
c_link_args = '${LDFLAGS}'
[project options]
libmount = 'disabled'
xattr = false
selinux = 'disabled'
nls = 'disabled'
glib_debug = 'disabled'
glib_assert = false
glib_checks = false
libelf = 'disabled'
EOF
cat cross_file.ini
# 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
working-directory: ${{ env.DEV }}
- name: Meson LOG
if: ${{ failure() && env.CACHE_RESTORED != 'true' }}
working-directory: ${{ env.DEV }}
shell: bash
run: |
pushd glib-${GLIB_VERSION}.${GLIB_EXTRAVERSION}
ls -la build
cat build/meson-logs/meson-log.txt
popd
- name: Compile libogg
if: steps.cache-deps.outputs.cache-hit != 'true'
run: |
set -ex
pushd libogg-${OGG_VERSION}
mkdir -p build
pushd build
cmake -G "Unix Makefiles" \
-DCMAKE_MAKE_PROGRAM=make \
-DCMAKE_TOOLCHAIN_FILE=${NDK}/build/cmake/android.toolchain.cmake \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DANDROID_NATIVE_API_LEVEL=${ANDROID_API} \
-DANDROID_ABI=${{ matrix.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= \
-DINSTALL_DOCS=0 ..
make -j$((`nproc`+1))
make install
popd
popd
working-directory: ${{ env.DEV }}
- name: Compile libvorbis
if: steps.cache-deps.outputs.cache-hit != 'true'
run: |
set -ex
pushd libvorbis-${VORBIS_VERSION}
mkdir -p build
pushd build
cmake -G "Unix Makefiles" \
-DCMAKE_MAKE_PROGRAM=make \
-DCMAKE_TOOLCHAIN_FILE=${NDK}/build/cmake/android.toolchain.cmake \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DANDROID_NATIVE_API_LEVEL=${ANDROID_API} \
-DANDROID_ABI=${{ matrix.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= \
..
make -j$((`nproc`+1))
make install
popd
popd
working-directory: ${{ env.DEV }}
- name: Compile flac
if: steps.cache-deps.outputs.cache-hit != 'true'
run: |
set -ex
pushd flac-${FLAC_VERSION}
mkdir -p build
pushd build
cmake -G "Unix Makefiles" \
-DCMAKE_MAKE_PROGRAM=make \
-DCMAKE_TOOLCHAIN_FILE=${NDK}/build/cmake/android.toolchain.cmake \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DANDROID_NATIVE_API_LEVEL=${ANDROID_API} \
-DANDROID_ABI=${{ matrix.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= \
-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 ..
make -j$((`nproc`+1))
make install
popd
popd
working-directory: ${{ env.DEV }}
- name: Compile opus
if: steps.cache-deps.outputs.cache-hit != 'true'
run: |
set -ex
pushd opus-${OPUS_VERSION}
mkdir -p build
pushd build
cmake -G "Unix Makefiles" \
-DCMAKE_MAKE_PROGRAM=make \
-DCMAKE_TOOLCHAIN_FILE=${NDK}/build/cmake/android.toolchain.cmake \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DANDROID_NATIVE_API_LEVEL=${ANDROID_API} \
-DANDROID_ABI=${{ matrix.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= \
-DBUILD_PROGRAMS=0 -DOPUS_MAY_HAVE_NEON=1 -DCMAKE_C_STANDARD=99 -DCMAKE_C_STANDARD_REQUIRED=1 ..
make -j$((`nproc`+1))
make install
popd
popd
working-directory: ${{ env.DEV }}
- name: Compile libsndfile
if: steps.cache-deps.outputs.cache-hit != 'true'
run: |
set -ex
pushd libsndfile-${SNDFILE_VERSION}
mkdir -p build
pushd build
cmake -G "Unix Makefiles" \
-DCMAKE_MAKE_PROGRAM=make \
-DCMAKE_TOOLCHAIN_FILE=${NDK}/build/cmake/android.toolchain.cmake \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DANDROID_NATIVE_API_LEVEL=${ANDROID_API} \
-DANDROID_ABI=${{ matrix.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= \
-DBUILD_PROGRAMS=0 -DBUILD_EXAMPLES=0 ..
make -j$((`nproc`+1))
make install
popd
popd
working-directory: ${{ env.DEV }}
- name: Compile oboe
if: steps.cache-deps.outputs.cache-hit != 'true'
run: |
set -ex
pushd oboe-${OBOE_VERSION}
mkdir -p build
pushd build
cmake -G "Unix Makefiles" \
-DCMAKE_MAKE_PROGRAM=make \
-DCMAKE_TOOLCHAIN_FILE=${NDK}/build/cmake/android.toolchain.cmake \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DANDROID_NATIVE_API_LEVEL=${ANDROID_API} \
-DANDROID_ABI=${{ matrix.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= \
..
make -j$((`nproc`+1))
cp liboboe.* ${PREFIX}/lib/ && cp -ur ../include/oboe ${PREFIX}/include
popd
popd
working-directory: ${{ env.DEV }}
- name: Create fake oboe.pc
if: steps.cache-deps.outputs.cache-hit != 'true'
run: |
set -ex
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
working-directory: ${{ env.DEV }}
- name: Compile libinstpatch
if: steps.cache-deps.outputs.cache-hit != 'true'
run: |
set -ex
pushd libinstpatch-${INSTPATCH_VERSION}
mkdir -p build
pushd build
cmake -G "Unix Makefiles" \
-DCMAKE_MAKE_PROGRAM=make \
-DCMAKE_TOOLCHAIN_FILE=${NDK}/build/cmake/android.toolchain.cmake \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DANDROID_NATIVE_API_LEVEL=${ANDROID_API} \
-DANDROID_ABI=${{ matrix.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= \
..
make -j$((`nproc`+1))
make install
popd
popd
working-directory: ${{ env.DEV }}
- name: Compile fluidsynth
run: |
set -ex
mkdir -p build
pushd build
cmake -G "Unix Makefiles" \
-DCMAKE_MAKE_PROGRAM=make \
-DCMAKE_TOOLCHAIN_FILE=${NDK}/build/cmake/android.toolchain.cmake \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DANDROID_NATIVE_API_LEVEL=${ANDROID_API} \
-DANDROID_ABI=${{ matrix.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= \
-Denable-opensles=1 -Denable-floats=1 -Denable-oboe=1 -Denable-dbus=0 -Denable-oss=0 -Denable-openmp=0 ..
make -j$((`nproc`+1))
popd
- name: Install fluidsynth
run: |
set -ex
pushd build
make install
popd
- name: Compile fluidsynth-assetloader
run: |
set -ex
pushd doc/android/fluidsynth-assetloader
mkdir -p build
pushd build
cmake -G "Unix Makefiles" \
-DCMAKE_MAKE_PROGRAM=make \
-DCMAKE_TOOLCHAIN_FILE=${NDK}/build/cmake/android.toolchain.cmake \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DANDROID_NATIVE_API_LEVEL=${ANDROID_API} \
-DANDROID_ABI=${{ matrix.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= \
..
make -j$((`nproc`+1))
cp *.so ${PREFIX}/lib/
popd
popd
- name: Show cross-compiled files
run: ls -Rg ${PREFIX}
- name: Collect artifacts
run: |
set -ex
mkdir -p ${{ runner.temp }}/artifacts/lib/${{ matrix.android_abi_cmake }}
cd ${{ runner.temp }}/artifacts/lib/${{ matrix.android_abi_cmake }}
cp -LR ${PREFIX}/lib/* .
ls -Rg .
rm -rf *.dll *.alias gettext/ libtextstyle.* *.a *.la
rm -f *.so.*
mkdir -p ${{ runner.temp }}/artifacts/include
cd ${{ runner.temp }}/artifacts/include
cp -a ${PREFIX}/include/fluidsynth* .
- name: Verify all libs exist
run: |
set -ex
ls libFLAC.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 libinstpatch-1.0.so
ls liboboe.so
ls libogg.so
ls libopus.so
ls libsndfile.so
ls libvorbis.so
ls libvorbisenc.so
ls libvorbisfile.so
ls libpcre.so
ls libpcreposix.so
working-directory: ${{ env.DEV }}/opt/android/lib
- name: Assert 16K page alignment
run: |
set -ex
chmod +x contrib/check_elf_alignment.sh
contrib/check_elf_alignment.sh "${PREFIX}/lib"
- name: Publish artifacts
uses: actions/upload-artifact@v4
with:
name: fluidsynth-android${{ env.ANDROID_API }}-${{ matrix.android_abi_cmake }}
path: ${{ runner.temp }}/artifacts
- name: Uninstall fluidsynth
run: |
set -ex
pushd build
make uninstall
popd