Skip to content

Commit ffb71ef

Browse files
committed
support any version of NDK passing our new validation, also correct and improve our CMake code
1 parent 13c47b8 commit ffb71ef

File tree

1 file changed

+47
-39
lines changed

1 file changed

+47
-39
lines changed

CMakeLists.txt

Lines changed: 47 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -7,57 +7,65 @@ cmake_minimum_required(VERSION 3.20)
77
cmake_policy(SET CMP0072 OLD) #not yet, would need to get pointers to all OpenGL functions
88
set(OpenGL_GL_PREFERENCE LEGACY)
99
#cmake_policy(SET CMP )
10-
option(NBL_BUILD_ANDROID "Build for Android?" OFF)
10+
set(NBL_BUILD_ANDROID OFF)
1111

12-
if(DEFINED CMAKE_TOOLCHAIN_FILE) # TODO - validate paths due to CMake path-policy (errors when no path passed in)
13-
cmake_path(GET CMAKE_TOOLCHAIN_FILE FILENAME _NBL_CMAKE_TOOLCHAIN_FILENAME_)
12+
if(DEFINED CMAKE_TOOLCHAIN_FILE)
13+
14+
if(EXISTS "${CMAKE_TOOLCHAIN_FILE}")
15+
cmake_path(GET CMAKE_TOOLCHAIN_FILE FILENAME _NBL_CMAKE_TOOLCHAIN_FILENAME_)
16+
else()
17+
message(FATAL_ERROR "CMAKE_TOOLCHAIN_FILE as '${CMAKE_TOOLCHAIN_FILE}' is invalid!")
18+
endif()
1419

1520
if(${_NBL_CMAKE_TOOLCHAIN_FILENAME_} STREQUAL "android.toolchain.cmake")
1621
message(STATUS "Found Android toolchain! Validating...")
1722

18-
set(_NBL_SUPPORTED_NDK_ "android-ndk-r22b") # supported NDK version
19-
set(_NBL_SUPPORTED_ABI_ "x86_64") # supported ABI
20-
21-
# quering ${_NBL_EXPECTED_ANDROID_SDK_ROOT_DIRECTORY_}/${_NBL_SUPPORTED_NDK_}/build/cmake/android.toolchain.cmake
22-
cmake_path(GET CMAKE_TOOLCHAIN_FILE PARENT_PATH _NBL_TOOLCHAIN_NDK_CMAKE_DIRECTORY_)
23-
cmake_path(GET _NBL_TOOLCHAIN_NDK_CMAKE_DIRECTORY_ PARENT_PATH _NBL_TOOLCHAIN_NDK_BUILD_DIRECTORY_)
24-
cmake_path(GET _NBL_TOOLCHAIN_NDK_BUILD_DIRECTORY_ PARENT_PATH _NBL_TOOLCHAIN_NDK_ROOT_DIRECTORY_)
25-
cmake_path(GET _NBL_TOOLCHAIN_NDK_ROOT_DIRECTORY_ PARENT_PATH _NBL_EXPECTED_ANDROID_SDK_ROOT_DIRECTORY_)
26-
27-
string(LENGTH ${CMAKE_TOOLCHAIN_FILE} _NBL_CMAKE_TOOLCHAIN_FILE_LENGTH_)
28-
string(LENGTH ${_NBL_EXPECTED_ANDROID_SDK_ROOT_DIRECTORY_} _NBL_EXPECTED_ANDROID_SDK_ROOT_DIRECTORY_LENGTH_)
29-
math(EXPR _NBL_PARENT_NDK_TO_TOOLCHAIN_FILE_LENGTH_ "${_NBL_CMAKE_TOOLCHAIN_FILE_LENGTH_} - ${_NBL_EXPECTED_ANDROID_SDK_ROOT_DIRECTORY_LENGTH_}" OUTPUT_FORMAT DECIMAL)
30-
string(SUBSTRING ${CMAKE_TOOLCHAIN_FILE} ${_NBL_EXPECTED_ANDROID_SDK_ROOT_DIRECTORY_LENGTH_} ${_NBL_PARENT_NDK_TO_TOOLCHAIN_FILE_LENGTH_} _NBL_PARENT_NDK_TO_TOOLCHAIN_FILEPATH_)
31-
32-
if(${_NBL_PARENT_NDK_TO_TOOLCHAIN_FILEPATH_} STREQUAL "/${_NBL_SUPPORTED_NDK_}/build/cmake/android.toolchain.cmake")
33-
message(STATUS "Found Android NDK '${_NBL_SUPPORTED_NDK_}' is appropriate!")
34-
else()
35-
message(FATAL_ERROR "Found Android NDK version isn't appropriate. Use '${_NBL_SUPPORTED_NDK_}'!")
36-
endif()
23+
set(_NBL_SUPPORTED_ABI_
24+
"x86_64"
25+
# "arm64-v8a" in future
26+
)
3727

38-
if(EXISTS "${_NBL_EXPECTED_ANDROID_SDK_ROOT_DIRECTORY_}/build-tools")
39-
if(DEFINED ANDROID_ABI)
40-
if(${ANDROID_ABI} STREQUAL ${_NBL_SUPPORTED_ABI_})
41-
message(STATUS "Supported '${_NBL_SUPPORTED_ABI_}' ABI!")
42-
43-
else()
44-
message(FATAL_ERROR "Found '${ANDROID_ABI}' isn't appropriate. Use '${_NBL_SUPPORTED_ABI_}'!")
28+
if(DEFINED ANDROID_ABI) # see _NBL_SUPPORTED_ABI_
29+
set(FOUND 0)
30+
foreach(CURRENT_ABI IN LISTS _NBL_SUPPORTED_ABI_)
31+
if("${CURRENT_ABI}" STREQUAL ${ANDROID_ABI})
32+
message(STATUS "Selecting found ${CURRENT_ABI} ABI!")
33+
set(FOUND 1)
34+
break()
4535
endif()
36+
endforeach()
37+
38+
if(NOT FOUND)
39+
message(FATAL_ERROR "Selected ${ANDROID_ABI} isn't appropriate. Supported ABIs: ${_NBL_SUPPORTED_ABI_}!")
4640
else()
47-
message(STATUS "Could not find 'ANDROID_ABI', using supported ABI: '${_NBL_SUPPORTED_ABI_}'")
48-
set(ANDROID_ABI ${_NBL_SUPPORTED_ABI_} CACHE INTERNAL "" FORCE)
41+
unset(FOUND)
4942
endif()
43+
else()
44+
message(FATAL_ERROR "ANDROID_ABI must be specified at the very beginning of execution!")
45+
endif()
46+
47+
if(NOT DEFINED ANDROID_PLATFORM) # android-28
48+
message(FATAL_ERROR "ANDROID_PLATFORM must be specified at the very beginning of execution!")
49+
endif()
50+
51+
include(${CMAKE_TOOLCHAIN_FILE})
52+
53+
if(${ANDROID_NDK_MAJOR} LESS 22)
54+
message(FATAL_ERROR "Update your NDK to at least 22. We don't support ${ANDROID_NDK_REVISION} NDK version!")
55+
endif()
5056

51-
message(STATUS "'${_NBL_SUPPORTED_NDK_}' located in Android SDK path. Building Nabla with Android toolchain!")
57+
# note that we assume NDK has been installed using Android Studio, so the existing paths should look as followning:
58+
# ${ANDROID_SDK_ROOT_PATH}/ndk/${ANDROID_NDK_REVISION}/build/cmake/android.toolchain.cmake
5259

53-
set(ANDROID_SDK_ROOT_PATH "${_NBL_EXPECTED_ANDROID_SDK_ROOT_DIRECTORY_}")
54-
set(ANDROID_NDK_ROOT_PATH ${ANDROID_SDK_ROOT_PATH}/${_NBL_SUPPORTED_NDK_})
55-
56-
set(NBL_BUILD_ANDROID ON)
57-
set(_NBL_ANDROID_VALIDATED_ ON)
58-
else()
59-
message(FATAL_ERROR "${_NBL_SUPPORTED_NDK_} must be placed in Android SDK path!")
60+
set(ANDROID_NDK_ROOT_PATH ${CMAKE_ANDROID_NDK})
61+
get_filename_component(ANDROID_SDK_ROOT_PATH "${ANDROID_NDK_ROOT_PATH}/../../" ABSOLUTE)
62+
63+
if(EXISTS "${ANDROID_SDK_ROOT_PATH}/build-tools")
64+
message(STATUS "Building Nabla with ${ANDROID_NDK_REVISION} NDK!")
6065
endif()
66+
67+
set(NBL_BUILD_ANDROID ON)
68+
set(_NBL_ANDROID_VALIDATED_ ON)
6169
endif()
6270

6371
# TODO - another toolchains in future

0 commit comments

Comments
 (0)