Skip to content

Commit 609aedb

Browse files
author
James Donald
authored
Merge pull request #34 from leapmotion/fix-android
Fix android toolchain & arm platform matching.
2 parents 6b057e5 + 16bf7d5 commit 609aedb

File tree

5 files changed

+61
-80
lines changed

5 files changed

+61
-80
lines changed

standard/StandardProject.cmake

Lines changed: 41 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -16,27 +16,37 @@ does the following:
1616

1717
include(CMakeParseArguments) # Backwards compatibility
1818

19-
# This must be a macro since project defines scope-local variables
20-
# that we generally rely on being in the root context.
2119
# IMPORTANT: Note that if there is no *direct* call to 'project' in the root CMakeLists.txt
2220
# file, CMake will automatically inject one with the default languages of C and CXX.
2321
# This will cause the toolchain file to be parsed multiple times, and will
2422
# make much of the work done in standard_project_preinit useless.
2523
macro(standard_project project_name)
26-
cmake_parse_arguments(standard "" "VERSION" "LANGUAGES" ${ARGN})
24+
message(AUTHOR_WARNING "Standard_project has been replaced by an override of project.")
25+
project(${ARGV})
26+
endmacro()
2727

28-
if(NOT standard_VERSION)
29-
message(FATAL_ERROR "Standard compliant projects must specify a version")
30-
endif()
28+
if(NOT DEFINED standard_project_OVERRIDE)
29+
set(standard_project_OVERRIDE ON)
30+
endif()
3131

32-
set(_language_arg "")
33-
if(standard_LANGUAGES)
34-
set(_language_arg LANGUAGES ${standard_LANGUAGES})
35-
endif()
32+
# This must be a macro since project defines scope-local variables
33+
# that we generally rely on being in the root context.
34+
macro(project project_name)
35+
if(standard_project_OVERRIDE)
36+
cmake_parse_arguments(standard "" "VERSION" "" ${ARGN})
37+
38+
if(NOT standard_VERSION)
39+
message(FATAL_ERROR "Standard compliant projects must specify a version")
40+
endif()
41+
42+
standard_project_preinit()
43+
_project(${project_name} VERSION ${standard_VERSION} ${standard_UNPARSED_ARGUMENTS})
44+
standard_project_postinit()
3645

37-
standard_project_preinit()
38-
project(${project_name} VERSION ${standard_VERSION} ${_language_arg})
39-
standard_project_postinit()
46+
set(standard_project_OVERRIDE OFF) #we generally only want to modify the root project.
47+
else()
48+
_project(${ARGV})
49+
endif()
4050
endmacro()
4151

4252
function(standard_project_preinit)
@@ -48,30 +58,28 @@ function(standard_project_preinit)
4858
else()
4959
# Build Fat binaries on OSX by default
5060
set(CMAKE_OSX_ARCHITECTURES "x86_64;i386" CACHE STRING "Mac OS X build architectures" FORCE)
61+
if(NOT CMAKE_OSX_SYSROOT)
62+
# CLANG_VERSION requires a sysroot to obtain, so resort to execute_process() here
63+
execute_process(COMMAND clang -v ERROR_VARIABLE _clang_version)
64+
if(_clang_version MATCHES "clang-7")
65+
set(_developer_sdk_version 10.11)
66+
elseif(_clang_version MATCHES "clang-8")
67+
set(_developer_sdk_version 10.12)
68+
endif()
69+
if(_developer_sdk_version)
70+
set(CMAKE_OSX_SYSROOT "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX${_developer_sdk_version}.sdk" CACHE STRING "Mac OS X build environment" FORCE)
71+
if(NOT CMAKE_OSX_DEPLOYMENT_TARGET)
72+
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.10" CACHE STRING "Mac OS X deployment target" FORCE)
73+
endif()
74+
endif()
75+
endif()
5176
endif()
5277
endif()
5378

5479
if(NOT MSVC AND NOT CMAKE_BUILD_TYPE)
5580
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: Debug Release." FORCE)
5681
endif()
5782

58-
if(APPLE AND NOT (CMAKE_SYSTEM_PROCESSOR STREQUAL "arm"))
59-
if(NOT CMAKE_OSX_SYSROOT)
60-
# CLANG_VERSION requires a sysroot to obtain, so resort to execute_process() here
61-
execute_process(COMMAND clang -v ERROR_VARIABLE _clang_version)
62-
if(_clang_version MATCHES "clang-7")
63-
set(_developer_sdk_version 10.11)
64-
elseif(_clang_version MATCHES "clang-8")
65-
set(_developer_sdk_version 10.12)
66-
endif()
67-
if(_developer_sdk_version)
68-
set(CMAKE_OSX_SYSROOT "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX${_developer_sdk_version}.sdk" CACHE STRING "Mac OS X build environment" FORCE)
69-
if(NOT CMAKE_OSX_DEPLOYMENT_TARGET)
70-
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.10" CACHE STRING "Mac OS X deployment target" FORCE)
71-
endif()
72-
endif()
73-
endif()
74-
endif()
7583
endfunction()
7684

7785
function(standard_project_postinit)
@@ -122,19 +130,16 @@ function(standard_project_postinit)
122130
# CMAKE_SYSTEM_PROCESSOR is set by the toolchain, so must happen strictly after project()
123131
if(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64")
124132
set(standard_BUILD_ARCHITECTURES "aarch64" PARENT_SCOPE)
125-
set(standard_BUILD_64 ON PARENT_SCOPE)
126-
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "arm")
133+
elseif(CMAKE_SYSTEM_NAME MATCHES "Android")
134+
set(standard_BUILD_ARCHITECTURES "${CMAKE_ANDROID_ARCH_ABI}" PARENT_SCOPE) #prevent mixing armeabi & armeabi-v7a
135+
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm")
127136
set(standard_BUILD_ARCHITECTURES "arm" PARENT_SCOPE)
128-
set(standard_BUILD_64 OFF PARENT_SCOPE)
129137
elseif(CMAKE_OSX_ARCHITECTURES STREQUAL "x86_64;i386")
130138
set(standard_BUILD_ARCHITECTURES x64 x86 PARENT_SCOPE)
131-
set(standard_BUILD_64 ON PARENT_SCOPE)
132139
elseif(CMAKE_SIZEOF_VOID_P STREQUAL 4)
133140
set(standard_BUILD_ARCHITECTURES "x86" PARENT_SCOPE)
134-
set(standard_BUILD_64 OFF PARENT_SCOPE)
135141
else()
136142
set(standard_BUILD_ARCHITECTURES "x64" PARENT_SCOPE)
137-
set(standard_BUILD_64 ON PARENT_SCOPE)
138143
endif()
139144
message(STATUS "Using architecture: ${standard_BUILD_ARCHITECTURES}")
140145

standard/standard-configVersion.cmake.in

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,28 +5,22 @@ if(@ARG_NAME@_DEBUG)
55
message(STATUS "Installed @ARG_NAME@_VERSION: ${PACKAGE_VERSION}")
66

77
message(STATUS "Installed @ARG_NAME@_BUILD_ARCHITECTURES: @standard_BUILD_ARCHITECTURES@")
8-
message(STATUS "Configured @ARG_NAME@_BUILD_ARCHITECTURES: ${@ARG_NAME@_BUILD_ARCHITECTURES}")
8+
message(STATUS "Configured @ARG_NAME@_BUILD_ARCHITECTURES: ${@ARG_NAME@_BUILD_ARCHITECTURES}")
99

1010
message(STATUS "Installed CMAKE_SIZEOF_VOID_P: @CMAKE_SIZEOF_VOID_P@")
1111
message(STATUS "Configured CMAKE_SIZEOF_VOID_P: ${CMAKE_SIZEOF_VOID_P}")
1212
endif()
1313

1414
# If the customer has an override architecture requirement, use that
1515
if(DEFINED @ARG_NAME@_ARCHITECTURE)
16-
foreach(i IN LISTS @ARG_NAME@_ARCHITECTURE)
17-
string(REGEX MATCH "amd64|x86_64|x64" @ARG_NAME@_is_x64 ${i})
18-
string(REGEX MATCH "i386|x86" @ARG_NAME@_is_x86 ${i})
19-
string(REGEX MATCH "arm$" @ARG_NAME@_is_arm ${i})
20-
string(REGEX MATCH "arm64|aarch64" @ARG_NAME@_is_aarch64 ${i})
21-
22-
# Classify
23-
if(@ARG_NAME@_is_x86)
24-
list(APPEND @ARG_NAME@_ARCHITECTURES x86)
25-
elseif(@ARG_NAME@_is_x64)
16+
foreach(_arch IN LISTS @ARG_NAME@_ARCHITECTURE)
17+
if(_arch MATCHES "amd64|x86_64|x64")
2618
list(APPEND @ARG_NAME@_ARCHITECTURES x64)
27-
elseif(@ARG_NAME@_is_arm)
19+
elseif(_arch MATCHES "i386|x86")
20+
list(APPEND @ARG_NAME@_ARCHITECTURES x86)
21+
elseif(_arch MATCHES "arm$")
2822
list(APPEND @ARG_NAME@_ARCHITECTURES arm)
29-
elseif(@ARG_NAME@_is_aarch64)
23+
elseif(_arch MATCHES "arm64|aarch64")
3024
list(APPEND @ARG_NAME@_ARCHITECTURES aarch64)
3125
else()
3226
message(WARNING "Unrecognized architecture ${i}")
@@ -36,7 +30,9 @@ else()
3630
# Try to infer what the user wants
3731
if(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64")
3832
set(@ARG_NAME@_ARCHITECTURES aarch64)
39-
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "arm")
33+
elseif(CMAKE_SYSTEM_NAME MATCHES "Android")
34+
set(@ARG_NAME@_ARCHITECTURES "${CMAKE_ANDROID_ARCH_ABI}") #prevent mixing armeabi & armeabi-v7a
35+
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm")
4036
set(@ARG_NAME@_ARCHITECTURES arm)
4137
elseif(CMAKE_SIZEOF_VOID_P EQUAL "8")
4238
set(@ARG_NAME@_ARCHITECTURES x64)

standard/toolchain-android.cmake

Lines changed: 5 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,12 @@
1-
set(CMAKE_SYSTEM_NAME Linux)
2-
set(CMAKE_SYSTEM_VERSION 1)
3-
4-
# Deal with weirdnesses caused by our standard_project setup. See
5-
# notes in StandardProject.cmake
6-
if(NOT LLVM_ANDROID_TOOLCHAIN_DIR)
7-
set(LLVM_ANDROID_TOOLCHAIN_DIR $ENV{LLVM_ANDROID_TOOLCHAIN_DIR})
8-
else()
9-
set(ENV{LLVM_ANDROID_TOOLCHAIN_DIR} ${LLVM_ANDROID_TOOLCHAIN_DIR} CACHE PATH)
10-
endif()
11-
12-
find_path(ANDROID_NDK_ROOT bin/${ANDROID_NDK_TOOL_PREFIX}-gcc${_exe_suffix} PATHS
13-
${LLVM_ANDROID_TOOLCHAIN_DIR}${_ndk_suffix} # legacy variable
14-
/opt/android-standalone-toolchain${_ndk_suffix}
15-
${LLVM_ANDROID_TOOLCHAIN_DIR}
1+
set(CMAKE_SYSTEM_NAME Android)
2+
set(CMAKE_SYSTEM_VERSION 21)
3+
find_path(CMAKE_ANDROID_STANDALONE_TOOLCHAIN sysroot/usr/lib/libandroid.so PATHS
164
/opt/android-standalone-toolchain
175
)
18-
if(NOT ANDROID_NDK_ROOT)
19-
message(FATAL_ERROR "ANDROID_NDK_ROOT could not be located. Have you installed the NDK?")
6+
if(NOT CMAKE_ANDROID_STANDALONE_TOOLCHAIN)
7+
message(FATAL_ERROR "CMAKE_ANDROID_STANDALONE_TOOLCHAIN could not be located. Have you installed the NDK?")
208
endif()
219

22-
set(ANDROID_COMMON_FLAGS " --sysroot=${ANDROID_NDK_ROOT}/sysroot -B${ANDROID_NDK_ROOT} -pie ")
23-
set(CMAKE_C_COMPILER ${ANDROID_NDK_ROOT}/bin/${ANDROID_NDK_TOOL_PREFIX}-gcc${_exe_suffix} CACHE FILEPATH "C Compiler" FORCE)
24-
set(CMAKE_CXX_COMPILER ${ANDROID_NDK_ROOT}/bin/${ANDROID_NDK_TOOL_PREFIX}-g++${_exe_suffix} CACHE FILEPATH "C++ Compiler" FORCE)
25-
set(ANDROID_STRIP_COMMAND ${ANDROID_NDK_ROOT}/bin/${ANDROID_NDK_TOOL_PREFIX}-strip)
26-
set(CMAKE_C_FLAGS "${ANDROID_COMMON_FLAGS}" CACHE STRING "toolchain_cflags" FORCE)
27-
set(CMAKE_CXX_FLAGS "${ANDROID_COMMON_FLAGS}" CACHE STRING "toolchain_cxxflags" FORCE)
28-
set(CMAKE_LINK_FLAGS "${ANDROID_COMMON_FLAGS}" CACHE STRING "toolchain_linkflags" FORCE)
2910
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
3011
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
3112
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

standard/toolchain-android32.cmake

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
set(ARM_TARGET "armeabi-v7a")
2-
set(ANDROID_NDK_TOOL_PREFIX arm-linux-androideabi)
3-
set(CMAKE_SYSTEM_PROCESSOR arm)
1+
if(NOT DEFINED CMAKE_ANDROID_ARCH_ABI)
2+
set(CMAKE_ANDROID_ARCH_ABI armeabi)
3+
endif()
44
include(${CMAKE_CURRENT_LIST_DIR}/toolchain-android.cmake)

standard/toolchain-android64.cmake

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
set(ANDROID_NDK_TOOL_PREFIX aarch64-linux-android)
2-
set(_ndk_suffix -4.9-aarch64)
3-
set(CMAKE_SYSTEM_PROCESSOR aarch64)
1+
set(CMAKE_ANDROID_ARCH_ABI arm64-v8a)
42
include(${CMAKE_CURRENT_LIST_DIR}/toolchain-android.cmake)
3+

0 commit comments

Comments
 (0)