aorii/cmake/detect_os.cmake
2025-02-04 19:25:09 +08:00

74 lines
2.6 KiB
CMake

# DetectOS.cmake
function(add_os_definitions target)
# 初始化所有平台宏为 0
set(PLATFORMS WINDOWS MACOS LINUX FREEBSD IOS ANDROID)
# 检测操作系统并设置相应的宏为 1
if(WIN32)
target_compile_definitions(${target} PRIVATE WINDOWS=1)
message(STATUS "Detected Windows operating system")
list(REMOVE_ITEM PLATFORMS WINDOWS)
elseif(APPLE AND UNIX)
target_compile_definitions(${target} PRIVATE MACOS=1)
message(STATUS "Detected macOS operating system")
list(REMOVE_ITEM PLATFORMS MACOS)
elseif(UNIX)
if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
target_compile_definitions(${target} PRIVATE LINUX=1)
message(STATUS "Detected Linux operating system")
list(REMOVE_ITEM PLATFORMS LINUX)
elseif(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
target_compile_definitions(${target} PRIVATE FREEBSD=1)
message(STATUS "Detected FreeBSD operating system")
list(REMOVE_ITEM PLATFORMS FREEBSD)
else()
message(WARNING "Detected unknown Unix-like operating system")
endif()
elseif(ANDROID)
target_compile_definitions(${target} PRIVATE ANDROID=1)
message(STATUS "Detected Android operating system")
list(REMOVE_ITEM PLATFORMS ANDROID)
elseif(IOS)
target_compile_definitions(${target} PRIVATE IOS=1)
message(STATUS "Detected iOS operating system")
list(REMOVE_ITEM PLATFORMS IOS)
else()
message(WARNING "Unknown operating system")
endif()
foreach(PLATFORM ${PLATFORMS})
target_compile_definitions(${target} PRIVATE ${PLATFORM}=0)
endforeach()
# 检测并设置架构宏
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
target_compile_definitions(${target} PRIVATE ARCH_64BIT=1 ARCH_32BIT=0)
message(STATUS "Detected 64-bit architecture")
else()
target_compile_definitions(${target} PRIVATE ARCH_64BIT=0 ARCH_32BIT=1)
message(STATUS "Detected 32-bit architecture")
endif()
# 设置通用的 UNIX 宏
if(UNIX)
target_compile_definitions(${target} PRIVATE UNIX=1)
else()
target_compile_definitions(${target} PRIVATE UNIX=0)
endif()
# 设置通用的 POSIX 宏
if(UNIX OR APPLE)
target_compile_definitions(${target} PRIVATE POSIX=1)
else()
target_compile_definitions(${target} PRIVATE POSIX=0)
endif()
# 设置IS_MOBILE宏
if(ANDROID OR IOS)
target_compile_definitions(${target} PRIVATE IS_MOBILE=1)
else()
target_compile_definitions(${target} PRIVATE IS_MOBILE=0)
endif()
endfunction()