diff --git a/CMakeLists.txt b/CMakeLists.txt index aa51851bf2..9becbc0051 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,6 +25,10 @@ option(FILAMENT_SUPPORTS_XCB "Include XCB support in Linux builds" ON) option(FILAMENT_SUPPORTS_XLIB "Include XLIB support in Linux builds" ON) +set(FILAMENT_NDK_VERSION "" CACHE STRING + "Android NDK version or version prefix to be used when building for Android." +) + set(FILAMENT_PER_RENDER_PASS_ARENA_SIZE_IN_MB "2" CACHE STRING "Per render pass arena size. Must be roughly 1 MB larger than FILAMENT_PER_FRAME_COMMANDS_SIZE_IN_MB, default 2." ) diff --git a/build.sh b/build.sh index 620e273af7..015a7dd5b0 100755 --- a/build.sh +++ b/build.sh @@ -103,10 +103,12 @@ function print_matdbg_help { echo "" } +# Unless explicitly specified, NDK version will be selected as highest available version within same major release chain +FILAMENT_NDK_VERSION=${FILAMENT_NDK_VERSION:-$(cat `dirname $0`/build/android/ndk.version | cut -f 1 -d ".")} + # Requirements CMAKE_MAJOR=3 CMAKE_MINOR=19 -ANDROID_NDK_VERSION=22 # Internal variables ISSUE_CLEAN=false @@ -322,6 +324,7 @@ function build_android_target { -G "${BUILD_GENERATOR}" \ -DIMPORT_EXECUTABLES_DIR=out \ -DCMAKE_BUILD_TYPE="$1" \ + -DFILAMENT_NDK_VERSION="${FILAMENT_NDK_VERSION}" \ -DCMAKE_INSTALL_PREFIX="../android-${lc_target}/filament" \ -DCMAKE_TOOLCHAIN_FILE="../../build/toolchain-${arch}-linux-android.cmake" \ ${MATDBG_OPTION} \ @@ -366,16 +369,9 @@ function ensure_android_build { exit 1 fi - local ndk_side_by_side="${ANDROID_HOME}/ndk/" - if [[ -d ${ndk_side_by_side} ]]; then - # shellcheck disable=SC2012 - local ndk_version=$(ls "${ndk_side_by_side}" | sort -V | tail -n 1 | cut -f 1 -d ".") - if [[ ${ndk_version} -lt ${ANDROID_NDK_VERSION} ]]; then - echo "Error: Android NDK side-by-side version ${ANDROID_NDK_VERSION} or higher must be installed, exiting" - exit 1 - fi - else - echo "Error: Android NDK side-by-side version ${ANDROID_NDK_VERSION} or higher must be installed, exiting" + # shellcheck disable=SC2012 + if [[ -z $(ls "${ANDROID_HOME}/ndk/" | sort -V | grep "^${FILAMENT_NDK_VERSION}") ]]; then + echo "Error: Android NDK side-by-side version ${FILAMENT_NDK_VERSION} or compatible must be installed, exiting" exit 1 fi diff --git a/build/android/build.sh b/build/android/build.sh index b2976d1cc2..c4b798dc61 100755 --- a/build/android/build.sh +++ b/build/android/build.sh @@ -8,9 +8,6 @@ # # The default is release -NDK_VERSION="ndk;22.1.7171670" -ANDROID_NDK_VERSION=22 - echo "This script is intended to run in a CI environment and may modify your current environment." echo "Please refer to BUILDING.md for more information." @@ -47,15 +44,12 @@ elif [[ "$LC_UNAME" == "darwin" ]]; then fi source `dirname $0`/../common/build-common.sh -# Only update and install the NDK if necessary, as this can be slow -ndk_side_by_side="${ANDROID_HOME}/ndk/" -if [[ -d $ndk_side_by_side ]]; then - ndk_version=`ls ${ndk_side_by_side} | sort -V | tail -n 1 | cut -f 1 -d "."` - if [[ ${ndk_version} -lt ${ANDROID_NDK_VERSION} ]]; then - ${ANDROID_HOME}/tools/bin/sdkmanager "${NDK_VERSION}" > /dev/null - fi -else - ${ANDROID_HOME}/tools/bin/sdkmanager "${NDK_VERSION}" > /dev/null +# Unless explicitly specified, NDK version will be set to match exactly the required one +FILAMENT_NDK_VERSION=${FILAMENT_NDK_VERSION:-$(cat `dirname $0`/ndk.version)} + +# Install the required NDK version specifically (if not present) +if [[ ! -d "${ANDROID_HOME}/ndk/$FILAMENT_NDK_VERSION" ]]; then + ${ANDROID_HOME}/tools/bin/sdkmanager "ndk;$FILAMENT_NDK_VERSION" > /dev/null fi # Only build 1 32 bit and 1 64 bit target during presubmit to cut down build times @@ -66,4 +60,4 @@ if [[ "$TARGET" == "presubmit" ]]; then fi pushd `dirname $0`/../.. > /dev/null -./build.sh -p android $ANDROID_ABIS -c $GENERATE_ARCHIVES $BUILD_DEBUG $BUILD_RELEASE +FILAMENT_NDK_VERSION=${FILAMENT_NDK_VERSION} ./build.sh -p android $ANDROID_ABIS -c $GENERATE_ARCHIVES $BUILD_DEBUG $BUILD_RELEASE diff --git a/build/android/ndk.version b/build/android/ndk.version new file mode 100644 index 0000000000..19e2b99124 --- /dev/null +++ b/build/android/ndk.version @@ -0,0 +1 @@ +22.1.7171670 \ No newline at end of file diff --git a/build/toolchain-aarch64-linux-android.cmake b/build/toolchain-aarch64-linux-android.cmake index 8bd8800ff1..272e9e1793 100644 --- a/build/toolchain-aarch64-linux-android.cmake +++ b/build/toolchain-aarch64-linux-android.cmake @@ -31,7 +31,11 @@ set(DIST_ARCH arm64-v8a) string(TOLOWER ${CMAKE_HOST_SYSTEM_NAME} HOST_NAME_L) file(TO_CMAKE_PATH $ENV{ANDROID_HOME} ANDROID_HOME_UNIX) -file(GLOB NDK_VERSIONS LIST_DIRECTORIES true ${ANDROID_HOME_UNIX}/ndk/*) +if (NOT FILAMENT_NDK_VERSION) + file(READ "${CMAKE_CURRENT_LIST_DIR}/android/ndk.version" FILAMENT_NDK_VERSION) + string(REGEX MATCH "^\\d+" FILAMENT_NDK_VERSION ${FILAMENT_NDK_VERSION}) +endif() +file(GLOB NDK_VERSIONS LIST_DIRECTORIES true ${ANDROID_HOME_UNIX}/ndk/${FILAMENT_NDK_VERSION}*) list(SORT NDK_VERSIONS) list(GET NDK_VERSIONS -1 NDK_VERSION) get_filename_component(NDK_VERSION ${NDK_VERSION} NAME) diff --git a/build/toolchain-arm7-linux-android.cmake b/build/toolchain-arm7-linux-android.cmake index 8e2b9fbe6b..a704c401dc 100644 --- a/build/toolchain-arm7-linux-android.cmake +++ b/build/toolchain-arm7-linux-android.cmake @@ -32,7 +32,11 @@ set(DIST_ARCH armeabi-v7a) string(TOLOWER ${CMAKE_HOST_SYSTEM_NAME} HOST_NAME_L) file(TO_CMAKE_PATH $ENV{ANDROID_HOME} ANDROID_HOME_UNIX) -file(GLOB NDK_VERSIONS LIST_DIRECTORIES true ${ANDROID_HOME_UNIX}/ndk/*) +if (NOT FILAMENT_NDK_VERSION) + file(READ "${CMAKE_CURRENT_LIST_DIR}/android/ndk.version" FILAMENT_NDK_VERSION) + string(REGEX MATCH "^\\d+" FILAMENT_NDK_VERSION ${FILAMENT_NDK_VERSION}) +endif() +file(GLOB NDK_VERSIONS LIST_DIRECTORIES true ${ANDROID_HOME_UNIX}/ndk/${FILAMENT_NDK_VERSION}*) list(SORT NDK_VERSIONS) list(GET NDK_VERSIONS -1 NDK_VERSION) get_filename_component(NDK_VERSION ${NDK_VERSION} NAME) diff --git a/build/toolchain-x86-linux-android.cmake b/build/toolchain-x86-linux-android.cmake index 2ae7525939..41c1d3358e 100644 --- a/build/toolchain-x86-linux-android.cmake +++ b/build/toolchain-x86-linux-android.cmake @@ -31,7 +31,11 @@ set(DIST_ARCH x86) string(TOLOWER ${CMAKE_HOST_SYSTEM_NAME} HOST_NAME_L) file(TO_CMAKE_PATH $ENV{ANDROID_HOME} ANDROID_HOME_UNIX) -file(GLOB NDK_VERSIONS LIST_DIRECTORIES true ${ANDROID_HOME_UNIX}/ndk/*) +if (NOT FILAMENT_NDK_VERSION) + file(READ "${CMAKE_CURRENT_LIST_DIR}/android/ndk.version" FILAMENT_NDK_VERSION) + string(REGEX MATCH "^\\d+" FILAMENT_NDK_VERSION ${FILAMENT_NDK_VERSION}) +endif() +file(GLOB NDK_VERSIONS LIST_DIRECTORIES true ${ANDROID_HOME_UNIX}/ndk/${FILAMENT_NDK_VERSION}*) list(SORT NDK_VERSIONS) list(GET NDK_VERSIONS -1 NDK_VERSION) get_filename_component(NDK_VERSION ${NDK_VERSION} NAME) diff --git a/build/toolchain-x86_64-linux-android.cmake b/build/toolchain-x86_64-linux-android.cmake index 46aa3dc4f8..4b80751437 100644 --- a/build/toolchain-x86_64-linux-android.cmake +++ b/build/toolchain-x86_64-linux-android.cmake @@ -31,7 +31,11 @@ set(DIST_ARCH x86_64) string(TOLOWER ${CMAKE_HOST_SYSTEM_NAME} HOST_NAME_L) file(TO_CMAKE_PATH $ENV{ANDROID_HOME} ANDROID_HOME_UNIX) -file(GLOB NDK_VERSIONS LIST_DIRECTORIES true ${ANDROID_HOME_UNIX}/ndk/*) +if (NOT FILAMENT_NDK_VERSION) + file(READ "${CMAKE_CURRENT_LIST_DIR}/android/ndk.version" FILAMENT_NDK_VERSION) + string(REGEX MATCH "^\\d+" FILAMENT_NDK_VERSION ${FILAMENT_NDK_VERSION}) +endif() +file(GLOB NDK_VERSIONS LIST_DIRECTORIES true ${ANDROID_HOME_UNIX}/ndk/${FILAMENT_NDK_VERSION}*) list(SORT NDK_VERSIONS) list(GET NDK_VERSIONS -1 NDK_VERSION) get_filename_component(NDK_VERSION ${NDK_VERSION} NAME)