Add android-riscv64 build to workflows (#256)
The Android NDK supports building for RISC-V as of version r27. Add it
to the build workflows here to improve coverage of the RISC-V code.
Fixes: #206
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 311f926..622650a 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -73,7 +73,7 @@
cmake-android:
strategy:
matrix:
- script: [android-arm64-build.sh, android-armv7-build.sh, android-x86-build.sh]
+ script: [android-arm64-build.sh, android-armv7-build.sh, android-riscv64-build.sh, android-x86-build.sh]
runs-on: ubuntu-latest
timeout-minutes: 40
steps:
@@ -86,7 +86,7 @@
id: setup-ndk
uses: nttld/setup-ndk@v1.0.6
with:
- ndk-version: r23b
+ ndk-version: r27
add-to-path: false
- name: Configure and build
run: scripts/${{ matrix.script }}
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4634a22..bd9f77f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -218,7 +218,7 @@
ELSEIF(CPUINFO_TARGET_PROCESSOR MATCHES "^(riscv(32|64))$")
LIST(APPEND CPUINFO_SRCS
src/riscv/uarch.c)
- IF(CMAKE_SYSTEM_NAME STREQUAL "Linux")
+ IF(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "Android")
LIST(APPEND CPUINFO_SRCS
src/riscv/linux/init.c
src/riscv/linux/riscv-hw.c
diff --git a/scripts/android-riscv64-build.sh b/scripts/android-riscv64-build.sh
new file mode 100755
index 0000000..51b578b
--- /dev/null
+++ b/scripts/android-riscv64-build.sh
@@ -0,0 +1,59 @@
+#!/usr/bin/env bash
+
+set -e
+
+if [ -z "$ANDROID_NDK" ]
+then
+ echo "ANDROID_NDK not set; please set it to the Android NDK directory"
+ exit 1
+fi
+
+if [ ! -d "$ANDROID_NDK" ]
+then
+ echo "ANDROID_NDK not a directory; did you install it under ${ANDROID_NDK}?"
+ exit 1
+fi
+
+mkdir -p build/android/riscv64
+
+CMAKE_ARGS=()
+
+# CMake-level configuration
+CMAKE_ARGS+=("-DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake")
+CMAKE_ARGS+=("-DCMAKE_BUILD_TYPE=Release")
+CMAKE_ARGS+=("-DCMAKE_POSITION_INDEPENDENT_CODE=ON")
+
+# If Ninja is installed, prefer it to Make
+if [ -x "$(command -v ninja)" ]
+then
+ CMAKE_ARGS+=("-GNinja")
+fi
+
+CMAKE_ARGS+=("-DCPUINFO_LIBRARY_TYPE=static")
+# CMakeLists for Google Benchmark is broken on Android
+CMAKE_ARGS+=("-DCPUINFO_BUILD_BENCHMARKS=OFF")
+CMAKE_ARGS+=("-DCPUINFO_BUILD_TOOLS=ON")
+CMAKE_ARGS+=("-DCPUINFO_BUILD_UNIT_TESTS=ON")
+CMAKE_ARGS+=("-DCPUINFO_BUILD_MOCK_TESTS=ON")
+
+# Android-specific options
+CMAKE_ARGS+=("-DANDROID_NDK=$ANDROID_NDK")
+CMAKE_ARGS+=("-DANDROID_ABI=riscv64")
+CMAKE_ARGS+=("-DANDROID_PLATFORM=android-35")
+CMAKE_ARGS+=("-DANDROID_PIE=ON")
+CMAKE_ARGS+=("-DANDROID_STL=c++_static")
+CMAKE_ARGS+=("-DANDROID_CPP_FEATURES=exceptions")
+
+# Use-specified CMake arguments go last to allow overridding defaults
+CMAKE_ARGS+=($@)
+
+cd build/android/riscv64 && cmake ../../.. \
+ "${CMAKE_ARGS[@]}"
+
+# Cross-platform parallel build
+if [ "$(uname)" == "Darwin" ]
+then
+ cmake --build . -- "-j$(sysctl -n hw.ncpu)"
+else
+ cmake --build . -- "-j$(nproc)"
+fi