sdrangel/liquiddsp/cmake/Modules/CheckCPUID.cmake

50 lines
2.0 KiB
CMake

# example usage: CHECK_CPUID("mmx" HAVE_MMX [TRUE|FALSE])
macro(CHECK_CPUID CHARACTERISTIC VARIABLE)
if (${ARGC} GREATER 2)
set(_CPUID_FORCE ${ARGV2})
else ()
unset(_CPUID_FORCE)
endif ()
message("-- Checking for CPU characteristic ${CHARACTERISTIC}")
if (DEFINED _CPUID_FORCE AND _CPUID_FORCE)
set(_CPUID_CHARACTERISTIC_FOUND ${_CPUID_FORCE})
set(_FORCED "(forced)")
else ()
if (CMAKE_CROSSCOMPILING)
# When cross compiling, we need to test each characteristic.
try_compile(CPUID_COMPILE_RESULT
${CMAKE_CURRENT_BINARY_DIR}
SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/cmcpuid.c
COMPILE_DEFINITIONS "-DCROSS_COMPILING" "-DTEST_${CHARACTERISTIC}"
OUTPUT_VARIABLE CPUID_COMPILE_OUTPUT
)
set(_CPUID_CHARACTERISTIC_FOUND ${CPUID_COMPILE_RESULT})
else ()
if (NOT _CPUID_CHARACTERISTICS)
try_run(CPUID_RUN_RESULT CPUID_COMPILE_RESULT
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/cmcpuid.c
RUN_OUTPUT_VARIABLE CPUID_CHARACTERISTICS
)
set(_CPUID_CHARACTERISTICS "${CPUID_CHARACTERISTICS}" CACHE INTERNAL "CPU Characteristics")
endif ()
if (${_CPUID_CHARACTERISTICS} MATCHES "@${CHARACTERISTIC}@")
set(_CPUID_CHARACTERISTIC_FOUND TRUE)
else ()
set(_CPUID_CHARACTERISTIC_FOUND FALSE)
endif ()
endif ()
unset(_FORCED)
endif ()
if (_CPUID_CHARACTERISTIC_FOUND)
message("-- Checking for CPU characteristic ${CHARACTERISTIC} - found ${_FORCED}")
else ()
message("-- Checking for CPU characteristic ${CHARACTERISTIC} - not found")
endif ()
set(${VARIABLE} ${_CPUID_CHARACTERISTIC_FOUND} CACHE INTERNAL "Check for CPU characteristic ${CHARACTERISTIC}" FORCE)
endmacro()