|
| 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