Files
mirai/cmake/detect_os.cmake

206 lines
8.0 KiB
CMake
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# =============================================================================
# 顶层平台检测变量
# 这些变量可在整个项目中使用,用于条件编译和依赖选择
# =============================================================================
# 桌面平台检测
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)