206 lines
8.0 KiB
CMake
206 lines
8.0 KiB
CMake
# =============================================================================
|
||
# 顶层平台检测变量
|
||
# 这些变量可在整个项目中使用,用于条件编译和依赖选择
|
||
# =============================================================================
|
||
|
||
# 桌面平台检测
|
||
set(MIRAI_DESKTOP_PLATFORM OFF)
|
||
if(WIN32 OR (UNIX AND NOT ANDROID AND NOT IOS))
|
||
set(MIRAI_DESKTOP_PLATFORM ON)
|
||
endif()
|
||
|
||
# 移动平台检测
|
||
set(MIRAI_MOBILE_PLATFORM OFF)
|
||
if(ANDROID OR IOS)
|
||
set(MIRAI_MOBILE_PLATFORM ON)
|
||
endif()
|
||
|
||
# 各平台标志
|
||
set(MIRAI_PLATFORM_WINDOWS OFF)
|
||
set(MIRAI_PLATFORM_LINUX OFF)
|
||
set(MIRAI_PLATFORM_MACOS OFF)
|
||
set(MIRAI_PLATFORM_ANDROID OFF)
|
||
set(MIRAI_PLATFORM_IOS OFF)
|
||
|
||
if(WIN32)
|
||
set(MIRAI_PLATFORM_WINDOWS ON)
|
||
elseif(ANDROID)
|
||
set(MIRAI_PLATFORM_ANDROID ON)
|
||
elseif(IOS)
|
||
set(MIRAI_PLATFORM_IOS ON)
|
||
elseif(APPLE)
|
||
set(MIRAI_PLATFORM_MACOS ON)
|
||
elseif(UNIX)
|
||
set(MIRAI_PLATFORM_LINUX ON)
|
||
endif()
|
||
|
||
# =============================================================================
|
||
# 平台定义函数(为目标添加详细的平台宏)
|
||
# =============================================================================
|
||
|
||
# 定义一个函数,为指定的目标添加操作系统和架构相关的预处理器定义
|
||
function(add_os_definitions target)
|
||
# 检查 target 参数是否提供
|
||
if(NOT target)
|
||
message(FATAL_ERROR "函数 add_os_definitions 需要一个 target 参数。")
|
||
return()
|
||
endif()
|
||
|
||
# --- 阶段 1: 确定宏的值 ---
|
||
|
||
# 初始化所有平台、架构和特性宏的值为 0
|
||
set(mirai_def_windows 0)
|
||
set(mirai_def_macos 0)
|
||
set(mirai_def_linux 0)
|
||
set(mirai_def_freebsd 0)
|
||
set(mirai_def_ios 0)
|
||
set(mirai_def_android 0)
|
||
set(mirai_def_cygwin 0)
|
||
set(mirai_def_unix 0)
|
||
set(mirai_def_posix 0)
|
||
set(mirai_def_mobile 0)
|
||
set(mirai_def_arch_64bit 0)
|
||
set(mirai_def_arch_32bit 0)
|
||
set(mirai_def_x86 0)
|
||
set(mirai_def_arm 0)
|
||
set(mirai_def_riscv 0)
|
||
set(mirai_def_apple 0) # 用于 iOS 和 macOS 的通用定义
|
||
set(mirai_def_debug 0) # 当前是否处于调试模式
|
||
|
||
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||
set(mirai_def_debug 1)
|
||
endif ()
|
||
|
||
# -- 操作系统检测与赋值 --
|
||
# 注意检测顺序:优先检测更具体的平台
|
||
if(CYGWIN)
|
||
# Cygwin 环境比较特殊,它在 Windows 上模拟 Unix
|
||
set(mirai_def_windows 1) # 基础是 Windows
|
||
set(mirai_def_cygwin 1) # 明确是 Cygwin
|
||
set(mirai_def_unix 1) # 提供 Unix API
|
||
set(mirai_def_posix 1) # 提供 POSIX API
|
||
# message(STATUS "检测到 **Cygwin** 环境 (运行于 Windows)")
|
||
elseif(WIN32)
|
||
# 非 Cygwin 的 Windows 环境 (MSVC, MinGW, etc.)
|
||
set(mirai_def_windows 1)
|
||
# message(STATUS "检测到 **Windows** 操作系统 (非 Cygwin)")
|
||
elseif(ANDROID)
|
||
# Android 平台 (通常需要特定工具链设置 ANDROID 变量)
|
||
set(mirai_def_android 1)
|
||
set(mirai_def_unix 1) # Android NDK 基于 Unix
|
||
set(mirai_def_posix 1) # NDK 提供 POSIX API
|
||
set(mirai_def_mobile 1) # 移动平台
|
||
# message(STATUS "检测到 **Android** 操作系统")
|
||
elseif(IOS)
|
||
# iOS 平台 (通常需要特定工具链设置 IOS 变量)
|
||
# 需要在 APPLE 之前判断,因为 iOS 下 APPLE 也为 TRUE
|
||
set(mirai_def_ios 1)
|
||
set(mirai_def_unix 1) # iOS (Darwin) 基于 Unix
|
||
set(mirai_def_posix 1) # 提供 POSIX API
|
||
set(mirai_def_mobile 1) # 移动平台
|
||
set(mirai_def_apple 1) # iOS 是 Apple 生态的一部分
|
||
# message(STATUS "检测到 **iOS** 操作系统")
|
||
elseif(APPLE)
|
||
# 此时排除了 iOS,确定是 macOS
|
||
set(mirai_def_macos 1)
|
||
set(mirai_def_unix 1) # macOS (Darwin) 基于 Unix
|
||
set(mirai_def_posix 1) # 提供 POSIX API
|
||
set(mirai_def_apple 1) # macOS 是 Apple 生态的一部分
|
||
message(STATUS "检测到 **macOS** 操作系统")
|
||
elseif(UNIX)
|
||
# 此时排除了 Apple, Android, Cygwin 的其他 Unix-like 系统
|
||
set(mirai_def_unix 1)
|
||
set(mirai_def_posix 1)
|
||
if(CMAKE_SYSTEM_NAME MATCHES "Linux")
|
||
set(mirai_def_linux 1)
|
||
# message(STATUS "检测到 **Linux** 操作系统")
|
||
elseif(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
|
||
set(mirai_def_freebsd 1)
|
||
# message(STATUS "检测到 **FreeBSD** 操作系统")
|
||
else()
|
||
message(WARNING "检测到未知的 类Unix 操作系统: ${CMAKE_SYSTEM_NAME}")
|
||
endif()
|
||
else()
|
||
message(WARNING "检测到未知的操作系统: ${CMAKE_SYSTEM_NAME}")
|
||
endif()
|
||
|
||
# -- 架构检测与赋值 --
|
||
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||
set(mirai_def_arch_64bit 1)
|
||
set(mirai_def_arch_32bit 0) # 明确设置为 0
|
||
# message(STATUS "检测到 **64-bit** 架构")
|
||
elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
|
||
set(mirai_def_arch_64bit 0) # 明确设置为 0
|
||
set(mirai_def_arch_32bit 1)
|
||
# message(STATUS "检测到 **32-bit** 架构")
|
||
else()
|
||
# 对于未知或未定义的指针大小,两者都保持 0
|
||
message(WARNING "无法明确检测到 32-bit 或 64-bit 架构 (CMAKE_SIZEOF_VOID_P = ${CMAKE_SIZEOF_VOID_P})。将两者都设置为 0。")
|
||
endif()
|
||
|
||
# 检测特定架构类型
|
||
if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86|i386|i486|i586|i686|i786|x86_64|AMD64")
|
||
set(mirai_def_x86 1)
|
||
# message(STATUS "检测到 **x86/x64** 架构")
|
||
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "arm|aarch64|ARM64")
|
||
set(mirai_def_arm 1)
|
||
# message(STATUS "检测到 **ARM** 架构")
|
||
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "riscv|riscv64|riscv32")
|
||
set(mirai_def_riscv 1)
|
||
# message(STATUS "检测到 **RISC-V** 架构")
|
||
endif()
|
||
|
||
# --- 阶段 2: 组装定义列表 ---
|
||
set(definitions_list "") # 初始化空列表
|
||
|
||
# 添加平台定义
|
||
list(APPEND definitions_list "MIRAI_PLATFORM_WINDOWS=${mirai_def_windows}")
|
||
list(APPEND definitions_list "MIRAI_PLATFORM_MACOS=${mirai_def_macos}")
|
||
list(APPEND definitions_list "MIRAI_PLATFORM_LINUX=${mirai_def_linux}")
|
||
list(APPEND definitions_list "MIRAI_PLATFORM_FREEBSD=${mirai_def_freebsd}")
|
||
list(APPEND definitions_list "MIRAI_PLATFORM_IOS=${mirai_def_ios}")
|
||
list(APPEND definitions_list "MIRAI_PLATFORM_ANDROID=${mirai_def_android}")
|
||
list(APPEND definitions_list "MIRAI_PLATFORM_CYGWIN=${mirai_def_cygwin}")
|
||
list(APPEND definitions_list "MIRAI_PLATFORM_APPLE=${mirai_def_apple}") # 用于 iOS 和 macOS 的通用定义
|
||
|
||
# 添加架构定义
|
||
list(APPEND definitions_list "MIRAI_PLATFORM_ARCH_64BIT=${mirai_def_arch_64bit}")
|
||
list(APPEND definitions_list "MIRAI_PLATFORM_ARCH_32BIT=${mirai_def_arch_32bit}")
|
||
|
||
# 添加特性定义
|
||
list(APPEND definitions_list "MIRAI_PLATFORM_UNIX=${mirai_def_unix}")
|
||
list(APPEND definitions_list "MIRAI_PLATFORM_POSIX=${mirai_def_posix}")
|
||
list(APPEND definitions_list "MIRAI_PLATFORM_IS_MOBILE=${mirai_def_mobile}")
|
||
|
||
list(APPEND definitions_list "MIRAI_DEBUG=${mirai_def_debug}") # 当前是否处于调试模式
|
||
|
||
list(APPEND definitions_list "MIRAI_PLATFORM_X86=${mirai_def_x86}")
|
||
list(APPEND definitions_list "MIRAI_PLATFORM_ARM=${mirai_def_arm}")
|
||
list(APPEND definitions_list "MIRAI_PLATFORM_RISCV=${mirai_def_riscv}")
|
||
|
||
# --- 阶段 3: 应用所有定义 ---
|
||
# **关键:使用一次调用将所有定义添加到目标**
|
||
if(definitions_list) # 确保列表非空
|
||
get_target_property(target_type ${target} TYPE)
|
||
if(target_type STREQUAL "INTERFACE_LIBRARY")
|
||
target_compile_definitions(${target} INTERFACE ${definitions_list})
|
||
else()
|
||
target_compile_definitions(${target} PUBLIC ${definitions_list})
|
||
endif()
|
||
endif()
|
||
|
||
# 函数作用域结束时,mirai_def_* 变量会自动销毁,无需显式 unset
|
||
|
||
endfunction()
|
||
|
||
# --- 使用示例 ---
|
||
# project(MyProject)
|
||
# add_executable(my_app main.c)
|
||
#
|
||
# # 调用函数为 my_app 添加平台定义
|
||
# add_os_definitions(my_app)
|
||
#
|
||
# # 你也可以为库调用
|
||
# # add_library(my_lib STATIC my_lib.c)
|
||
# # add_os_definitions(my_lib)
|