Skip to content

Commit acf0027

Browse files
committed
CMake Toolchains
1 parent 0405b2a commit acf0027

5 files changed

Lines changed: 1674 additions & 0 deletions

File tree

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
# Android Toolchain CMake Configuration
2+
cmake_minimum_required(VERSION 3.14)
3+
4+
# Add additional flags or settings if needed
5+
set(CMAKE_ANDROID_STL_TYPE "c++_shared") # Adjust STL type if needed
6+
7+
if(NOT DEFINED C_STANDARD)
8+
set(C_STANDARD 17) # Default to C17
9+
endif()
10+
if(NOT DEFINED CPP_STANDARD)
11+
set(CPP_STANDARD 17) # Default to C++17
12+
endif()
13+
set(CMAKE_C_STANDARD ${C_STANDARD})
14+
set(CMAKE_C_STANDARD_REQUIRED ON)
15+
set(CMAKE_CXX_STANDARD ${CPP_STANDARD})
16+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
17+
18+
19+
if(NOT DEFINED ANDROID_ABI)
20+
if(DEFINED ENV{ANDROID_ABI})
21+
set(ANDROID_ABI $ENV{ANDROID_ABI})
22+
else()
23+
message(FATAL_ERROR "ANDROID_ABI must be specified (e.g., armeabi-v7a, arm64-v8a, x86, x86_64)")
24+
endif()
25+
endif()
26+
27+
if(NOT DEFINED ANDROID_NDK_ROOT)
28+
if(DEFINED ENV{ANDROID_NDK_ROOT})
29+
set(ANDROID_NDK_ROOT $ENV{ANDROID_NDK_ROOT})
30+
else()
31+
message(FATAL_ERROR "ANDROID_NDK_ROOT must be specified as the path to the Android NDK")
32+
endif()
33+
endif()
34+
35+
if(NOT DEFINED ANDROID_API)
36+
if(DEFINED ENV{ANDROID_API})
37+
set(ANDROID_API $ENV{ANDROID_API})
38+
else()
39+
message(FATAL_ERROR "ANDROID_API must be specified as the path to the ANDROID_API")
40+
endif()
41+
endif()
42+
set(ANDROID_NATIVE_API_LEVEL ${ANDROID_API})
43+
44+
# Detect Host Platform
45+
if(NOT DEFINED HOST_PLATFORM)
46+
if(CMAKE_HOST_SYSTEM_NAME MATCHES "Darwin")
47+
if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "arm64")
48+
set(HOST_PLATFORM "darwin-arm64")
49+
else()
50+
set(HOST_PLATFORM "darwin-x86_64")
51+
endif()
52+
elseif(CMAKE_HOST_SYSTEM_NAME MATCHES "Windows")
53+
set(HOST_PLATFORM "windows-x86_64") # Windows ARM64 is rare, adjust if needed
54+
elseif(CMAKE_HOST_SYSTEM_NAME MATCHES "Linux")
55+
if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "aarch64")
56+
set(HOST_PLATFORM "linux-arm64")
57+
else()
58+
set(HOST_PLATFORM "linux-x86_64")
59+
endif()
60+
else()
61+
message(FATAL_ERROR "Unsupported host platform: ${CMAKE_HOST_SYSTEM_NAME} (${CMAKE_HOST_SYSTEM_PROCESSOR})")
62+
endif()
63+
endif()
64+
65+
message(STATUS "Android ABI: ${ANDROID_ABI}")
66+
message(STATUS "Detected Host Platform: ${HOST_PLATFORM}")
67+
68+
# NDK Configuration
69+
set(TOOLCHAIN_TYPE "llvm")
70+
71+
set(TOOLCHAIN "${ANDROID_NDK_ROOT}/toolchains/${TOOLCHAIN_TYPE}/prebuilt/${HOST_PLATFORM}")
72+
set(SYSROOT "${TOOLCHAIN}/sysroot")
73+
74+
# ABI-specific configuration
75+
if(ANDROID_ABI STREQUAL "armeabi-v7a")
76+
set(MACHINE "armv7")
77+
set(ANDROID_PREFIX "armv7a-linux-androideabi")
78+
set(ANDROID_TARGET "armv7a-none-linux-androideabi${ANDROID_NATIVE_API_LEVEL}")
79+
set(CMAKE_ANDROID_ARM_MODE ON)
80+
set(CMAKE_ANDROID_ARM_NEON ON)
81+
set(CMAKE_SYSTEM_PROCESSOR "armv7-a")
82+
set(CMAKE_C_FLAGS "-mfpu=neon -mfloat-abi=softfp -O3 -ffast-math -funroll-loops -funsafe-math-optimizations --target=${ANDROID_TARGET}")
83+
set(CMAKE_CXX_FLAGS "-mfpu=neon -mfloat-abi=softfp -O3 -ffast-math -funroll-loops -funsafe-math-optimizations --target=${ANDROID_TARGET}")
84+
elseif(ANDROID_ABI STREQUAL "arm64-v8a")
85+
set(MACHINE "arm64")
86+
set(ANDROID_PREFIX "aarch64-linux-android")
87+
set(ANDROID_TARGET "aarch64-none-linux-android${ANDROID_NATIVE_API_LEVEL}")
88+
set(CMAKE_SYSTEM_PROCESSOR "aarch64")
89+
set(CMAKE_C_FLAGS "-O3 -ffast-math -funroll-loops -funsafe-math-optimizations --target=${ANDROID_TARGET}")
90+
set(CMAKE_CXX_FLAGS "-O3 -ffast-math -funroll-loops -funsafe-math-optimizations --target=${ANDROID_TARGET}")
91+
elseif(ANDROID_ABI STREQUAL "x86")
92+
set(MACHINE "i686")
93+
set(ANDROID_PREFIX "i686-linux-android")
94+
set(ANDROID_TARGET "i686-none-linux-android${ANDROID_NATIVE_API_LEVEL}")
95+
set(CMAKE_SYSTEM_PROCESSOR "i686")
96+
set(CMAKE_C_FLAGS "-msse4.2 -mavx -O3 -ffast-math -funroll-loops")
97+
set(CMAKE_CXX_FLAGS "-msse4.2 -mavx -O3 -ffast-math -funroll-loops")
98+
elseif(ANDROID_ABI STREQUAL "x86_64")
99+
set(MACHINE "x86_64")
100+
set(ANDROID_PREFIX "x86_64-linux-android")
101+
set(ANDROID_TARGET "x86_64-none-linux-android${ANDROID_NATIVE_API_LEVEL}")
102+
set(CMAKE_SYSTEM_PROCESSOR "x86_64")
103+
set(CMAKE_C_FLAGS "-msse4.2 -mavx -O3 -ffast-math -funroll-loops --target=${ANDROID_TARGET}")
104+
set(CMAKE_CXX_FLAGS "-msse4.2 -mavx -O3 -ffast-math -funroll-loops --target=${ANDROID_TARGET}")
105+
else()
106+
message(FATAL_ERROR "Unsupported ANDROID_ABI: ${ANDROID_ABI}")
107+
endif()
108+
109+
message(STATUS "Configuring for ABI: ${ANDROID_ABI}")
110+
message(STATUS "Machine: ${MACHINE}")
111+
message(STATUS "Android Prefix: ${ANDROID_PREFIX}")
112+
113+
message(STATUS "CMAKE_C_COMPILER: ${TOOLCHAIN}/bin/${ANDROID_PREFIX}${CMAKE_ANDROID_API}${ANDROID_API}-clang")
114+
message(STATUS "CMAKE_CXX_COMPILER: ${TOOLCHAIN}/bin/${ANDROID_PREFIX}${CMAKE_ANDROID_API}${ANDROID_API}-clang++")
115+
116+
# Set compilers
117+
set(CMAKE_C_COMPILER "${TOOLCHAIN}/bin/${ANDROID_PREFIX}${CMAKE_ANDROID_API}${ANDROID_API}-clang")
118+
set(CMAKE_CXX_COMPILER "${TOOLCHAIN}/bin/${ANDROID_PREFIX}${CMAKE_ANDROID_API}${ANDROID_API}-clang++")
119+
set(CMAKE_LINKER "${TOOLCHAIN}/bin/ld.lld")
120+
121+
# Paths
122+
set(CMAKE_SYSROOT ${SYSROOT})
123+
set(CMAKE_FIND_ROOT_PATH ${SYSROOT})
124+
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
125+
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
126+
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
127+
128+
# Include and library paths
129+
set(CMAKE_INCLUDE_PATH "${SYSROOT}/usr/include")
130+
set(CMAKE_LIBRARY_PATH "${SYSROOT}/usr/lib/${ANDROID_PREFIX}/${CMAKE_ANDROID_API}")
131+
132+
# Compiler Binary
133+
set(BIN_PREFIX "${TOOLCHAIN_ROOT}/bin/")
134+
135+
#find_program(CMAKE_C_COMPILER clang PATHS "${TOOLCHAIN_ROOT}/bin/")
136+
##find_program(CMAKE_CXX_COMPILER clang++ PATHS "${TOOLCHAIN_ROOT}/bin/")
137+
#find_program(CMAKE_LINKER ld.lld PATHS "${TOOLCHAIN_ROOT}/bin/")
138+
find_program(CMAKE_AR llvm-ar PATHS "${TOOLCHAIN_ROOT}/bin/")
139+
find_program(CMAKE_NM llvm-nm PATHS "${TOOLCHAIN_ROOT}/bin/")
140+
find_program(CMAKE_RANLIB llvm-ranlib PATHS "${TOOLCHAIN_ROOT}/bin/")
141+
find_program(CMAKE_STRIP llvm-strip PATHS "${TOOLCHAIN_ROOT}/bin/")
142+
find_program(CMAKE_OBJCOPY llvm-objcopy PATHS "${TOOLCHAIN_ROOT}/bin/")
143+
find_program(CMAKE_OBJDUMP llvm-objdump PATHS "${TOOLCHAIN_ROOT}/bin/")
144+
145+
# Toolchain Debug Output
146+
message(STATUS "---Android TOOLCHAIN CONFIGURATION")
147+
message(STATUS "Host Platform: ${HOST_PLATFORM}")
148+
message(STATUS "ANDROID_NDK_ROOT : ${ANDROID_NDK_ROOT}")
149+
message(STATUS "Sysroot: ${SYSROOT}")
150+
message(STATUS "Toolchain: ${TOOLCHAIN}")
151+
message(STATUS "ABI: ${ANDROID_ABI}")
152+
message(STATUS "C Compiler: ${CMAKE_C_COMPILER}")
153+
message(STATUS "C++ Compiler: ${CMAKE_CXX_COMPILER}")
154+
message(STATUS "Linker: ${CMAKE_LINKER}")
155+
156+
# Finalize toolchain settings
157+
set(CMAKE_SYSTEM_NAME "Android")
158+
set(CMAKE_SYSTEM_VERSION ${CMAKE_ANDROID_API})
159+
set(CMAKE_ANDROID_NDK ${ANDROID_NDK_ROOT})
160+
161+
if(NOT EXISTS ${CMAKE_C_COMPILER})
162+
message(FATAL_ERROR "C Compiler not found: ${CMAKE_C_COMPILER}")
163+
endif()
164+
if(NOT EXISTS ${CMAKE_CXX_COMPILER})
165+
message(FATAL_ERROR "C++ Compiler not found: ${CMAKE_CXX_COMPILER}")
166+
endif()

0 commit comments

Comments
 (0)