147 lines
5.7 KiB
CMake
147 lines
5.7 KiB
CMake
# android-arm64.cmake - Intel x86_64 to ARM64 cross-compilation toolchain
|
|
|
|
# Set the system and processor for cross-compilation
|
|
set(CMAKE_SYSTEM_NAME Android)
|
|
set(CMAKE_SYSTEM_PROCESSOR aarch64)
|
|
|
|
# Flexible API level - can be overridden via command line or environment
|
|
if(NOT DEFINED ANDROID_NATIVE_API_LEVEL AND DEFINED ENV{ANDROID_VERSION})
|
|
set(ANDROID_NATIVE_API_LEVEL $ENV{ANDROID_VERSION})
|
|
elseif(NOT DEFINED ANDROID_NATIVE_API_LEVEL)
|
|
set(ANDROID_NATIVE_API_LEVEL 21) # Default API level
|
|
endif()
|
|
|
|
set(CMAKE_SYSTEM_VERSION ${ANDROID_NATIVE_API_LEVEL})
|
|
set(CMAKE_ANDROID_ARCH_ABI arm64-v8a)
|
|
|
|
# Flexible NDK path detection
|
|
if(NOT DEFINED CMAKE_ANDROID_NDK)
|
|
if(DEFINED ENV{ANDROID_NDK_ROOT})
|
|
set(CMAKE_ANDROID_NDK $ENV{ANDROID_NDK_ROOT})
|
|
elseif(DEFINED ENV{ANDROID_NDK_HOME})
|
|
set(CMAKE_ANDROID_NDK $ENV{ANDROID_NDK_HOME})
|
|
elseif(DEFINED ENV{ANDROID_NDK})
|
|
set(CMAKE_ANDROID_NDK $ENV{ANDROID_NDK})
|
|
else()
|
|
message(FATAL_ERROR "Android NDK not found. Please set ANDROID_NDK_ROOT, ANDROID_NDK_HOME, or ANDROID_NDK environment variable")
|
|
endif()
|
|
endif()
|
|
|
|
# Verify NDK exists
|
|
if(NOT EXISTS "${CMAKE_ANDROID_NDK}")
|
|
message(FATAL_ERROR "Android NDK directory does not exist: ${CMAKE_ANDROID_NDK}")
|
|
endif()
|
|
|
|
# Set Android STL
|
|
set(CMAKE_ANDROID_STL_TYPE c++_shared)
|
|
|
|
# Set NDK toolchain paths for Intel x86_64 host
|
|
set(NDK_TOOLCHAIN_PATH "${CMAKE_ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64")
|
|
|
|
# Check if the toolchain path exists
|
|
if(NOT EXISTS "${NDK_TOOLCHAIN_PATH}")
|
|
message(FATAL_ERROR "NDK toolchain path does not exist: ${NDK_TOOLCHAIN_PATH}")
|
|
endif()
|
|
|
|
# Set sysroot
|
|
set(CMAKE_SYSROOT "${NDK_TOOLCHAIN_PATH}/sysroot")
|
|
|
|
# Verify sysroot exists
|
|
if(NOT EXISTS "${CMAKE_SYSROOT}")
|
|
message(FATAL_ERROR "NDK sysroot does not exist: ${CMAKE_SYSROOT}")
|
|
endif()
|
|
|
|
# Use NDK compilers for cross-compilation
|
|
set(CMAKE_C_COMPILER "${NDK_TOOLCHAIN_PATH}/bin/aarch64-linux-android${ANDROID_NATIVE_API_LEVEL}-clang")
|
|
set(CMAKE_CXX_COMPILER "${NDK_TOOLCHAIN_PATH}/bin/aarch64-linux-android${ANDROID_NATIVE_API_LEVEL}-clang++")
|
|
set(CMAKE_AR "${NDK_TOOLCHAIN_PATH}/bin/llvm-ar")
|
|
set(CMAKE_STRIP "${NDK_TOOLCHAIN_PATH}/bin/llvm-strip")
|
|
set(CMAKE_RANLIB "${NDK_TOOLCHAIN_PATH}/bin/llvm-ranlib")
|
|
|
|
# Verify compilers exist
|
|
if(NOT EXISTS "${CMAKE_C_COMPILER}")
|
|
message(FATAL_ERROR "C compiler does not exist: ${CMAKE_C_COMPILER}")
|
|
endif()
|
|
|
|
if(NOT EXISTS "${CMAKE_CXX_COMPILER}")
|
|
message(FATAL_ERROR "C++ compiler does not exist: ${CMAKE_CXX_COMPILER}")
|
|
endif()
|
|
|
|
# Set cross-compilation flags
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC -march=armv8-a")
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -march=armv8-a -std=c++14")
|
|
|
|
# Set NDK library paths for linking
|
|
set(NDK_SYSROOT_LIB_PATH "${CMAKE_SYSROOT}/usr/lib/aarch64-linux-android/${ANDROID_NATIVE_API_LEVEL}")
|
|
set(NDK_TOOLCHAIN_LIB_PATH "${NDK_TOOLCHAIN_PATH}/lib64/clang/14.0.6/lib/linux")
|
|
|
|
# Linker flags
|
|
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--build-id=sha1")
|
|
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-rosegment")
|
|
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--fatal-warnings")
|
|
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--gc-sections")
|
|
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined")
|
|
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--build-id=sha1")
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--no-rosegment")
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--fatal-warnings")
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections")
|
|
|
|
# Additional Android-specific flags
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffunction-sections -fdata-sections")
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ffunction-sections -fdata-sections")
|
|
|
|
# Set the find root path for cross-compilation
|
|
set(CMAKE_FIND_ROOT_PATH "${CMAKE_SYSROOT}" "${CMAKE_ANDROID_NDK}")
|
|
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
|
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
|
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
|
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
|
|
|
|
# Configure for cross-compilation
|
|
set(CMAKE_CROSSCOMPILING TRUE)
|
|
set(CMAKE_CROSSCOMPILING_EMULATOR "")
|
|
|
|
# Android specific settings
|
|
set(ANDROID TRUE)
|
|
set(ANDROID_ABI "arm64-v8a")
|
|
set(ANDROID_PLATFORM "android-${ANDROID_NATIVE_API_LEVEL}")
|
|
set(ANDROID_STL "c++_shared")
|
|
|
|
# Debug information
|
|
message(STATUS "Cross-compiling from Intel x86_64 to ARM64")
|
|
message(STATUS "Android NDK: ${CMAKE_ANDROID_NDK}")
|
|
message(STATUS "Android API Level: ${ANDROID_NATIVE_API_LEVEL}")
|
|
message(STATUS "Android ABI: ${CMAKE_ANDROID_ARCH_ABI}")
|
|
message(STATUS "Android Sysroot: ${CMAKE_SYSROOT}")
|
|
message(STATUS "C Compiler: ${CMAKE_C_COMPILER}")
|
|
message(STATUS "C++ Compiler: ${CMAKE_CXX_COMPILER}")
|
|
message(STATUS "Toolchain Path: ${NDK_TOOLCHAIN_PATH}")
|
|
|
|
# Ensure we don't accidentally use host tools
|
|
set(CMAKE_C_COMPILER_WORKS 1)
|
|
set(CMAKE_CXX_COMPILER_WORKS 1)
|
|
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
|
|
|
|
# Set compiler identification to prevent issues
|
|
set(CMAKE_C_COMPILER_ID "Clang")
|
|
set(CMAKE_CXX_COMPILER_ID "Clang")
|
|
|
|
# Additional search paths for Android-specific libraries
|
|
if(EXISTS "${NDK_SYSROOT_LIB_PATH}")
|
|
set(CMAKE_LIBRARY_PATH "${CMAKE_LIBRARY_PATH}:${NDK_SYSROOT_LIB_PATH}")
|
|
endif()
|
|
|
|
if(EXISTS "${NDK_TOOLCHAIN_LIB_PATH}")
|
|
set(CMAKE_LIBRARY_PATH "${CMAKE_LIBRARY_PATH}:${NDK_TOOLCHAIN_LIB_PATH}")
|
|
endif()
|
|
|
|
# Set Android-specific preprocessor definitions
|
|
add_definitions(-DANDROID -D__ANDROID__ -D__ANDROID_API__=${ANDROID_NATIVE_API_LEVEL})
|
|
|
|
# Optimization flags for ARM64
|
|
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3 -DNDEBUG")
|
|
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -DNDEBUG")
|
|
|
|
|
|
message(STATUS "Android ARM64 cross-compilation toolchain configured successfully") |