@@ -22,3 +22,104 @@ set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING
2222 "Only do Release and Debug"
2323 FORCE
2424)
25+
26+ function (detect_system )
27+ message (STATUS "CMake Version: ${CMAKE_VERSION} " )
28+ message (STATUS "CMake System Name: ${CMAKE_SYSTEM_NAME} " )
29+ message (STATUS "CMake System Processor: ${CMAKE_SYSTEM_PROCESSOR} " )
30+
31+ string (TOLOWER "${CMAKE_SYSTEM_NAME} " DYNLIBUTILS_SYSTEM)
32+ string (TOLOWER "${CMAKE_SYSTEM_PROCESSOR} " DYNLIBUTILS_ARCH)
33+
34+ if (CMAKE_SYSTEM_NAME MATCHES "Linux" )
35+ set (LINUX TRUE PARENT_SCOPE )
36+
37+ # Check if /etc/os-release exists
38+ if (EXISTS "/etc/os-release" )
39+ file (STRINGS "/etc/os-release" OS_RELEASE_ID_LINE REGEX "^ID=" )
40+ string (REPLACE "ID=" "" OS_ID "${OS_RELEASE_ID_LINE} " )
41+ string (REGEX REPLACE "^\" (.*)\" $" "\\ 1" OS_ID "${OS_ID} " )
42+ string (TOLOWER "${OS_ID} " DYNLIBUTILS_SYSTEM)
43+ message (STATUS "Detected Linux distribution: ${OS_ID} " )
44+ else ()
45+ message (WARNING "Cannot detect Linux distribution: /etc/os-release not found" )
46+ endif ()
47+ endif ()
48+
49+ if (UNIX OR CYGWIN )
50+ set (POSIX TRUE PARENT_SCOPE )
51+ endif ()
52+
53+ if (APPLE AND NOT "${CMAKE_OSX_ARCHITECTURES} " STREQUAL "" )
54+ list (LENGTH CMAKE_OSX_ARCHITECTURES ARCH_COUNT)
55+ if (ARCH_COUNT GREATER 1)
56+ message (FATAL_ERROR "More than one architecture is not supported!" )
57+ endif ()
58+ list (GET CMAKE_OSX_ARCHITECTURES 0 ARCH_NAME)
59+ if (ARCH_NAME STREQUAL "x86_64" )
60+ message (STATUS "Building x86_64 MacOS binaries" )
61+ set (DYNLIBUTILS_ARCH "x64" )
62+ set (DYNLIBUTILS_CPU_ARCH_X64 TRUE PARENT_SCOPE )
63+ elseif (ARCH_NAME STREQUAL "arm64" )
64+ message (STATUS "Building ARM64 MacOS binaries" )
65+ set (DYNLIBUTILS_ARCH "arm64" )
66+ set (DYNLIBUTILS_CPU_ARCH_ARM64 TRUE PARENT_SCOPE )
67+ else ()
68+ message (FATAL_ERROR "Unknown architecture: ${CMAKE_OSX_ARCHITECTURES} " )
69+ endif ()
70+ elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "^(x86|i[3456]86)$" OR CMAKE_GENERATOR_PLATFORM MATCHES "^(x86|Win32)$" )
71+ message (STATUS "Building x86 binaries" )
72+ set (DYNLIBUTILS_ARCH "x86" )
73+ set (DYNLIBUTILS_CPU_ARCH_X86 TRUE PARENT_SCOPE )
74+ elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "^(x86_64|x64|amd64|AMD64)$" OR CMAKE_GENERATOR_PLATFORM STREQUAL "x64" ) # must be before arm64
75+ message (STATUS "Building x86_64 binaries" )
76+ set (DYNLIBUTILS_ARCH "x64" )
77+ set (DYNLIBUTILS_CPU_ARCH_X64 TRUE PARENT_SCOPE )
78+ elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64|arm64|armv8.?|ARM64)$" OR CMAKE_GENERATOR_PLATFORM STREQUAL "ARM64" )
79+ message (STATUS "Building ARM64 binaries" )
80+ set (DYNLIBUTILS_ARCH "arm64" )
81+ set (DYNLIBUTILS_CPU_ARCH_ARM64 TRUE PARENT_SCOPE )
82+ elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "^(arm|armv[34567]|ARM)$" )
83+ message (STATUS "Building ARM32 binaries" )
84+ set (DYNLIBUTILS_ARCH "arm32" )
85+ set (DYNLIBUTILS_CPU_ARCH_ARM32 TRUE PARENT_SCOPE )
86+ elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "^(riscv|riscv32|riscv64)$" )
87+ if (CMAKE_SIZEOF_VOID_P EQUAL 4)
88+ message (STATUS "Building RISC-V 32 binaries" )
89+ set (DYNLIBUTILS_ARCH "riscv32" )
90+ set (DYNLIBUTILS_CPU_ARCH_RISCV32 TRUE PARENT_SCOPE )
91+ elseif (CMAKE_SIZEOF_VOID_P EQUAL 8)
92+ message (STATUS "Building RISC-V 64 binaries" )
93+ set (DYNLIBUTILS_ARCH "riscv64" )
94+ set (DYNLIBUTILS_CPU_ARCH_RISCV64 TRUE PARENT_SCOPE )
95+ else ()
96+ message (FATAL_ERROR "Unknown sizeof void: ${CMAKE_SIZEOF_VOID_P} " )
97+ endif ()
98+ else ()
99+ message (FATAL_ERROR "Unknown architecture: ${CMAKE_SYSTEM_PROCESSOR} " )
100+ endif ()
101+
102+ set (DYNLIBUTILS_PLATFORM "${DYNLIBUTILS_SYSTEM} _${DYNLIBUTILS_ARCH} " PARENT_SCOPE )
103+ message (STATUS "Building for ${DYNLIBUTILS_SYSTEM} _${DYNLIBUTILS_ARCH} " )
104+ endfunction ()
105+
106+ function (detect_compiler )
107+ if (MSVC AND CMAKE_CXX_COMPILER_ID STREQUAL "Clang" )
108+ message (STATUS "Building with Clang-CL" )
109+ set (DYNLIBUTILS_COMPILER_CLANG_CL TRUE PARENT_SCOPE )
110+ elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" )
111+ message (STATUS "Building with Clang/LLVM" )
112+ set (DYNLIBUTILS_COMPILER_CLANG TRUE PARENT_SCOPE )
113+ elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" )
114+ message (STATUS "Building with GNU GCC" )
115+ set (DYNLIBUTILS_COMPILER_GCC TRUE PARENT_SCOPE )
116+ elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Intel" )
117+ message (STATUS "Building with Intel" )
118+ set (DYNLIBUTILS_COMPILER_INTEL TRUE PARENT_SCOPE )
119+ elseif (MSVC )
120+ message (STATUS "Building with MSVC" )
121+ set (DYNLIBUTILS_COMPILER_MSVC TRUE PARENT_SCOPE )
122+ else ()
123+ message (FATAL_ERROR "Unknown compiler: ${CMAKE_CXX_COMPILER_ID} " )
124+ endif ()
125+ endfunction ()
0 commit comments