# 定义一个函数,为指定的目标添加操作系统和架构相关的预处理器定义 function(add_os_definitions target) # 检查 target 参数是否提供 if(NOT target) message(FATAL_ERROR "函数 add_os_definitions 需要一个 target 参数。") return() endif() # --- 阶段 1: 确定宏的值 --- # 初始化所有平台、架构和特性宏的值为 0 set(mirage_def_windows 0) set(mirage_def_macos 0) set(mirage_def_linux 0) set(mirage_def_freebsd 0) set(mirage_def_ios 0) set(mirage_def_android 0) set(mirage_def_cygwin 0) set(mirage_def_unix 0) set(mirage_def_posix 0) set(mirage_def_mobile 0) set(mirage_def_arch_64bit 0) set(mirage_def_arch_32bit 0) # -- 操作系统检测与赋值 -- # 注意检测顺序:优先检测更具体的平台 if(CYGWIN) # Cygwin 环境比较特殊,它在 Windows 上模拟 Unix set(mirage_def_windows 1) # 基础是 Windows set(mirage_def_cygwin 1) # 明确是 Cygwin set(mirage_def_unix 1) # 提供 Unix API set(mirage_def_posix 1) # 提供 POSIX API message(STATUS "检测到 **Cygwin** 环境 (运行于 Windows)") elseif(WIN32) # 非 Cygwin 的 Windows 环境 (MSVC, MinGW, etc.) set(mirage_def_windows 1) message(STATUS "检测到 **Windows** 操作系统 (非 Cygwin)") elseif(ANDROID) # Android 平台 (通常需要特定工具链设置 ANDROID 变量) set(mirage_def_android 1) set(mirage_def_unix 1) # Android NDK 基于 Unix set(mirage_def_posix 1) # NDK 提供 POSIX API set(mirage_def_mobile 1) # 移动平台 message(STATUS "检测到 **Android** 操作系统") elseif(IOS) # iOS 平台 (通常需要特定工具链设置 IOS 变量) # 需要在 APPLE 之前判断,因为 iOS 下 APPLE 也为 TRUE set(mirage_def_ios 1) set(mirage_def_unix 1) # iOS (Darwin) 基于 Unix set(mirage_def_posix 1) # 提供 POSIX API set(mirage_def_mobile 1) # 移动平台 message(STATUS "检测到 **iOS** 操作系统") elseif(APPLE) # 此时排除了 iOS,确定是 macOS set(mirage_def_macos 1) set(mirage_def_unix 1) # macOS (Darwin) 基于 Unix set(mirage_def_posix 1) # 提供 POSIX API message(STATUS "检测到 **macOS** 操作系统") elseif(UNIX) # 此时排除了 Apple, Android, Cygwin 的其他 Unix-like 系统 set(mirage_def_unix 1) set(mirage_def_posix 1) if(CMAKE_SYSTEM_NAME MATCHES "Linux") set(mirage_def_linux 1) message(STATUS "检测到 **Linux** 操作系统") elseif(CMAKE_SYSTEM_NAME MATCHES "FreeBSD") set(mirage_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(mirage_def_arch_64bit 1) set(mirage_def_arch_32bit 0) # 明确设置为 0 message(STATUS "检测到 **64-bit** 架构") elseif(CMAKE_SIZEOF_VOID_P EQUAL 4) set(mirage_def_arch_64bit 0) # 明确设置为 0 set(mirage_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() # --- 阶段 2: 组装定义列表 --- set(definitions_list "") # 初始化空列表 # 添加平台定义 list(APPEND definitions_list "MIRAGE_PLATFORM_WINDOWS=${mirage_def_windows}") list(APPEND definitions_list "MIRAGE_PLATFORM_MACOS=${mirage_def_macos}") list(APPEND definitions_list "MIRAGE_PLATFORM_LINUX=${mirage_def_linux}") list(APPEND definitions_list "MIRAGE_PLATFORM_FREEBSD=${mirage_def_freebsd}") list(APPEND definitions_list "MIRAGE_PLATFORM_IOS=${mirage_def_ios}") list(APPEND definitions_list "MIRAGE_PLATFORM_ANDROID=${mirage_def_android}") list(APPEND definitions_list "MIRAGE_PLATFORM_CYGWIN=${mirage_def_cygwin}") # 添加架构定义 list(APPEND definitions_list "MIRAGE_PLATFORM_ARCH_64BIT=${mirage_def_arch_64bit}") list(APPEND definitions_list "MIRAGE_PLATFORM_ARCH_32BIT=${mirage_def_arch_32bit}") # 添加特性定义 list(APPEND definitions_list "MIRAGE_PLATFORM_UNIX=${mirage_def_unix}") list(APPEND definitions_list "MIRAGE_PLATFORM_POSIX=${mirage_def_posix}") list(APPEND definitions_list "MIRAGE_PLATFORM_IS_MOBILE=${mirage_def_mobile}") # --- 阶段 3: 应用所有定义 --- # **关键:使用一次调用将所有定义添加到目标** if(definitions_list) # 确保列表非空 target_compile_definitions(${target} PUBLIC ${definitions_list}) endif() # 函数作用域结束时,mirage_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)