feat: android arm64 target support (#194)
* feat: android arm64 (`aarch64-linux-android`) target
* refactor: android arm64 release ci pipeline
resolves #163
Diff
.github/workflows/devel.yml | 41 ++++++++++++++++++-------
.github/workflows/release.docker.yml | 3 +-
.github/workflows/release.yml | 25 +++++++++++++--
ci/cargo.sh | 61 +++++++++++++++++++++++++++++++++++++-
ci/install-tools.sh | 36 ++++++++++++++++++++++-
5 files changed, 152 insertions(+), 14 deletions(-)
@@ -40,6 +40,9 @@ jobs:
- linux-arm-gnueabihf
- linux-musl-armv6
- linux-musl-armv7
- linux-android-arm64
- macos
- macos-arm64
- windows-msvc
@@ -95,6 +98,15 @@ jobs:
os: ubuntu-20.04
rust: stable
target: armv7-unknown-linux-musleabihf
- build: linux-android-arm64
os: ubuntu-22.04
rust: stable
target: aarch64-linux-android
- build: macos
os: macos-11
rust: stable
@@ -123,18 +135,28 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v3
- name: Install Linux/BSD tools
if: ${{ !contains(matrix.os, 'windows') }}
run: ci/install-tools.sh --target=${{ matrix.target }}
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
toolchain: ${{ matrix.rust }}
target: ${{ matrix.target }}
- name: Use Cross
if: matrix.target != ''
- name: Set up Cross
if: ${{ !contains(matrix.os, 'windows') && matrix.target != '' }}
run: |
cargo install cross@^0.2
echo "CARGO_BIN=cross" >> $GITHUB_ENV
echo "TARGET_FLAGS=--target ${{ matrix.target }}" >> $GITHUB_ENV
if [[ "${{ matrix.build }}" == "linux-android-armv7" ]] || [[ "${{ matrix.build }}" == "linux-android-arm64" ]]; then
echo "CARGO_BIN=ci/cargo.sh" >> $GITHUB_ENV
else
cargo install cross@^0.2
echo "CARGO_BIN=cross" >> $GITHUB_ENV
fi
echo "TARGET_FLAGS=--target=${{ matrix.target }}" >> $GITHUB_ENV
echo "TARGET_DIR=./target/${{ matrix.target }}" >> $GITHUB_ENV
- name: Show command used for Cargo
@@ -143,18 +165,17 @@ jobs:
echo "target flag is: ${{ env.TARGET_FLAGS }}"
echo "target dir is: ${{ env.TARGET_DIR }}"
- name: aarch64 specific items
if: matrix.build == 'macos-arm64'
- name: Skip tests
if: ${{ contains(fromJSON('["macos-arm64", "linux-android-arm64", "linux-android-armv7"]'), matrix.build) }}
run: |
echo "SKIP_TESTS=yes" >> $GITHUB_ENV
echo "SKIP_TESTS=--no-run" >> $GITHUB_ENV
- name: Run tests
shell: bash
if: env.SKIP_TESTS == ''
run: |
if [[ "${{ matrix.build }}" == "pinned" ]]; then unset CARGO_REGISTRIES_CRATES_IO_PROTOCOL; fi
${{ env.CARGO_BIN }} test --verbose ${{ env.TARGET_FLAGS }}
${{ env.CARGO_BIN }} test --verbose ${{ env.TARGET_FLAGS }} ${{ env.SKIP_TESTS }}
- name: Run build
shell: bash
@@ -1,7 +1,8 @@
name: release-docker
on:
release:
types: published
types:
- published
jobs:
docker-image-alpine:
@@ -60,6 +60,8 @@ jobs:
- linux-arm-gnueabihf
- linux-musl-armv6
- linux-musl-armv7
- linux-android-arm64
- macos
- macos-arm64
- windows-msvc
@@ -103,6 +105,14 @@ jobs:
os: ubuntu-20.04
rust: stable
target: armv7-unknown-linux-musleabihf
- build: linux-android-arm64
os: ubuntu-22.04
rust: stable
target: aarch64-linux-android
- build: macos
os: macos-11
rust: stable
@@ -134,18 +144,27 @@ jobs:
with:
fetch-depth: 1
- name: Install Linux/BSD tools
if: ${{ !contains(matrix.os, 'windows') }}
run: ci/install-tools.sh --target=${{ matrix.target }}
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
toolchain: ${{ matrix.rust }}
target: ${{ matrix.target }}
- name: Use Cross
- name: Set up Cross
shell: bash
run: |
if [ "${{ matrix.os }}" = "ubuntu-20.04" ]; then
cargo install cross@^0.2
echo "CARGO_BIN=cross" >> $GITHUB_ENV
if [[ "${{ matrix.build }}" == "linux-android-armv7" ]] || [[ "${{ matrix.build }}" == "linux-android-arm64" ]]; then
echo "CARGO_BIN=ci/cargo.sh" >> $GITHUB_ENV
else
cargo install cross@^0.2
echo "CARGO_BIN=cross" >> $GITHUB_ENV
fi
fi
echo "TARGET_FLAGS=--target ${{ matrix.target }}" >> $GITHUB_ENV
echo "TARGET_DIR=./target/${{ matrix.target }}" >> $GITHUB_ENV
@@ -0,0 +1,61 @@
set -eux -o pipefail
if [ -n "${ANDROID_HOME-}" ]; then
ndk_version=25.2.9519653
ANDROID_NDK_ROOT=${ANDROID_NDK_ROOT:-${ANDROID_HOME}/ndk/$ndk_version}
fi
if [ -n "${ANDROID_NDK_ROOT-}" ]; then
android_tools=${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/bin
fi
for arg in $*; do
case $arg in
--target=*)
target=${arg#*=}
;;
*)
;;
esac
done
case $target in
aarch64-linux-android)
export CC_aarch64_linux_android=$android_tools/aarch64-linux-android21-clang
export AR_aarch64_linux_android=$android_tools/llvm-ar
export CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER=$android_tools/aarch64-linux-android21-clang
;;
armv7-linux-androideabi)
export CC_armv7_linux_androideabi=$android_tools/armv7a-linux-androideabi19-clang
export AR_armv7_linux_androideabi=$android_tools/llvm-ar
export CARGO_TARGET_ARMV7_LINUX_ANDROIDEABI_LINKER=$android_tools/armv7a-linux-androideabi19-clang
;;
*)
;;
esac
cargo "$@"
@@ -0,0 +1,36 @@
set -eux -o pipefail
target=$1
case $target in
--target*android*)
ndk_version=25.2.9519653
mkdir -p "${ANDROID_HOME}/licenses"
android_license_file="${ANDROID_HOME}/licenses/android-sdk-license"
accept_android_license=24333f8a63b6825ea9c5514f83c2829b004d1fee
grep --quiet --no-messages "$accept_android_license" "$android_license_file" \
|| echo $accept_android_license >> "$android_license_file"
"${ANDROID_HOME}/cmdline-tools/latest/bin/sdkmanager" "ndk;$ndk_version"
find -L ${ANDROID_NDK_ROOT:-${ANDROID_HOME}/ndk/$ndk_version} -name libunwind.a \
-execdir sh -c 'echo "INPUT(-lunwind)" > libgcc.a' \;
;;
esac