
# 定义一个函数，为指定的目标添加操作系统和架构相关的预处理器定义
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)
