# Shared detection of compiler, operating system, and architecture. # # This module centralizes environment detection so that other CMake modules can use the same variables instead of # repeating checks on CMAKE_* and built-in platform variables. # Only run once per configure step. include_guard(GLOBAL) # -------------------------------------------------------------------- # Compiler detection (C++) # -------------------------------------------------------------------- set(is_clang FALSE) set(is_gcc FALSE) set(is_msvc FALSE) set(is_xcode FALSE) if(CMAKE_CXX_COMPILER_ID MATCHES ".*Clang") # Clang or AppleClang set(is_clang TRUE) elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") set(is_gcc TRUE) elseif(MSVC) set(is_msvc TRUE) else() message(FATAL_ERROR "Unsupported C++ compiler: ${CMAKE_CXX_COMPILER_ID}") endif() # Xcode generator detection if(CMAKE_GENERATOR STREQUAL "Xcode") set(is_xcode TRUE) endif() # -------------------------------------------------------------------- # Operating system detection # -------------------------------------------------------------------- set(is_linux FALSE) set(is_windows FALSE) set(is_macos FALSE) if(CMAKE_SYSTEM_NAME STREQUAL "Linux") set(is_linux TRUE) elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows") set(is_windows TRUE) elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin") set(is_macos TRUE) endif() # -------------------------------------------------------------------- # Architecture # -------------------------------------------------------------------- set(is_amd64 FALSE) set(is_arm64 FALSE) if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|AMD64") set(is_amd64 TRUE) elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|arm64|ARM64") set(is_arm64 TRUE) else() message(FATAL_ERROR "Unknown architecture: ${CMAKE_SYSTEM_PROCESSOR}") endif() # -------------------------------------------------------------------- # Sanitizers # -------------------------------------------------------------------- # SANITIZERS is injected by the Conan toolchain when a sanitizer build is # requested (see conan/profiles/sanitizers). The flags are applied to the # 'common' target in XrplSanitizers; this flag lets other modules know a # sanitizer build is active without depending on that module. if(DEFINED SANITIZERS) set(SANITIZERS_ENABLED TRUE) else() set(SANITIZERS_ENABLED FALSE) endif()