Files
TheRock/rocm-systems/projects/rocprofiler-systems/external/timemory/cmake/Modules/FindCpuArch.cmake
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

674 lines
21 KiB
CMake

# ------------------------------------------------------------------------------#
#
# Finds CPU architecture information for configuring architecture specific compiler flags,
# e.g. enabling AVX-512 instructions
#
# Example:
#
# find_package(CpuArch REQUIRED COMPONENTS avx OPTIONAL_COMPONENTS fma avx2
# avx512f avx512pf avx512er avx512cd)
#
# add_library(${PROJECT_NAME}-arch INTERFACE) foreach(_ARCH ${CpuArch_FEATURES})
# target_compile_options(${PROJECT_NAME}-arch INTERFACE -m${_ARCH}) endforeach()
#
# ------------------------------------------------------------------------------#
include(CMakeParseArguments)
# always display find package message
unset(FIND_PACKAGE_MESSAGE_DETAILS_${CMAKE_FIND_PACKAGE_NAME} CACHE)
option(CpuArch_DEBUG "Enable verbose messages and failure if something not found" OFF)
mark_as_advanced(CpuArch_DEBUG)
# ----------------------------------------------------------------------------------------#
#
# For reference -- common cpu architecture flags
#
if(MSVC)
set(CpuArch_AVAILABLE_COMPONENTS
sse sse2 avx avx2 avx512
CACHE STRING "Possible CPU flags (for reference, may be incomplete)")
else()
set(CpuArch_AVAILABLE_COMPONENTS
3dnowprefetch
abm
acpi
adx
aes
altivec
aperfmperf
apic
arat
arch_perfmon
avx
avx1.0
avx2
avx512f
avx512pf
avx512er
avx512cd
bmi1
bmi2
bts
cat_l3
cdp_l3
clflush
clfsh
clfsopt
cmov
constant_tsc
cpuid
cpuid_fault
cqm
cqm_llc
cqm_mbm_local
cqm_mbm_total
cqm_occup_llc
cx16
cx8
dca
de
ds
ds_cpl
dscpl
dtes64
dtherm
dts
epb
ept
erms
est
f16c
flexpriority
flush_l1d
fma
fpu
fpu_csds
fsgsbase
fxsr
hle
ht
htt
ibpb
ibrs
ida
intel_ppin
intel_pt
invpcid
invpcid_single
ipt
l1df
lahf_lm
lm
mca
mce
md_clear
mdclear
mmx
mon
monitor
movbe
mpx
msr
mtrr
nonstop_tsc
nopl
nx
osxsave
pae
pat
pbe
pcid
pclmulqdq
pdcm
pdpe1gb
pebs
pge
pln
pni
popcnt
pse
pse36
pti
pts
rdrand
rdseed
rdt_a
rdtscp
rdwrfsgs
rep_good
rtm
sdbg
seglim64
sep
sgx
sgxlc
smap
smep
smx
ss
ssbd
sse
sse2
sse3
sse4_1
sse4_2
ssse3
stibp
syscall
tm
tm2
tpr
tpr_shadow
tsc
tsc_adjust
tsc_deadline_timer
tsc_thread_offset
tsctmr
tsxfa
vme
vmx
vnmi
vpid
x2apic
xsave
xsaveopt
xtopology
xtp
CACHE STRING "Possible CPU flags (for reference, may be incomplete)")
endif()
mark_as_advanced(CpuArch_AVAILABLE_COMPONENTS)
# ----------------------------------------------------------------------------------------#
# If no components specified, configure a default set
#
set(CpuArch_FIND_DEFAULT OFF)
# if target changed
if(DEFINED CpuArch_TARGET_LAST AND NOT "${CpuArch_TARGET_LAST}" STREQUAL
"${CpuArch_TARGET}")
# if features did not change when target changed
if(DEFINED CpuArch_FEATURES_LAST AND "${CpuArch_FEATURES_LAST}" STREQUAL
"${CpuArch_FEATURES}")
unset(CpuArch_FEATURES CACHE)
endif()
endif()
# if features are defined, set those as components
if(DEFINED CpuArch_FEATURES)
set(CpuArch_FIND_COMPONENTS ${CpuArch_FEATURES})
# if features were set explicitly, require them unless already set
foreach(_COMP ${CpuArch_FIND_COMPONENTS})
if(NOT DEFINED CpuArch_FIND_REQUIRED_${_COMP})
set(CpuArch_FIND_REQUIRED_${_COMP} ON)
set(CpuArch_FIND_REQUIRED ON)
endif()
endforeach()
endif()
# if no components are specified, configure default set
if(NOT CpuArch_FIND_COMPONENTS)
set(CpuArch_FIND_DEFAULT ON)
if(MSVC)
set(CpuArch_FIND_COMPONENTS sse sse2 avx avx2 avx512)
else()
set(CpuArch_FIND_COMPONENTS
sse
sse2
sse3
ssse3
sse4
sse4_1
sse4_2
fma
avx
avx2
avx512f
avx512pf
avx512er
avx512cd
altivec)
endif()
foreach(_COMP ${CpuArch_FIND_COMPONENTS})
set(CpuArch_FIND_REQUIRED_${_COMP} ${CpuArch_FIND_REQUIRED})
endforeach()
endif()
# ----------------------------------------------------------------------------------------#
#
# CpuArch_INPUT Input /proc/cpuinfo file for Linux
#
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
set(CpuArch_INPUT
"/proc/cpuinfo"
CACHE INTERNAL "File used to get CpuArch features")
mark_as_advanced(CpuArch_INPUT)
endif()
# ----------------------------------------------------------------------------------------#
#
# Detects host architecture flags such as AVX instruction support, etc.
#
function(DETECT_HOST_FEATURES _CPU_FLAGS_VAR)
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
file(READ "${CpuArch_INPUT}" _cpuinfo)
string(REGEX REPLACE ".*flags[ \t]*:[ \t]+([^\n]+).*" "\\1" _cpu_flags
"${_cpuinfo}")
if("${_cpu_flags}" STREQUAL "${_cpuinfo}")
string(REPLACE "," " " _cpuinfo "${_cpuinfo}")
string(
REGEX
REPLACE
".*cpu[ \t]*:[ \t]+[a-zA-Z0-9_-]+[ \t]+([a-zA-Z0-9_-]+)[ \t]+supported.*"
"\\1"
_cpu_flags
"${_cpuinfo}")
endif()
elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
execute_process(
COMMAND /usr/sbin/sysctl -n machdep.cpu.features
OUTPUT_VARIABLE _cpu_flags
OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(
COMMAND /usr/sbin/sysctl -n machdep.cpu.leaf7_features
OUTPUT_VARIABLE _cpu_leaf7_flags
OUTPUT_STRIP_TRAILING_WHITESPACE)
set(_cpu_flags "${_cpu_flags} ${_cpu_leaf7_flags}")
string(TOLOWER "${_cpu_flags}" _cpu_flags)
string(REPLACE "." "_" _cpu_flags "${_cpu_flags}")
endif()
if(CpuArch_DEBUG)
if("${_cpu_flags}" STREQUAL "${_cpuinfo}")
message(FATAL_ERROR "CPU flags could not be found in:\n${_cpu_info}")
else()
message(STATUS "")
message(STATUS "CPU FLAGS : ${_cpu_flags}")
message(STATUS "")
endif()
endif()
string(REPLACE " " ";" _cpu_flags "${_cpu_flags}")
set(_TMP ${_cpu_flags})
set(${_CPU_FLAGS_VAR}
"${_TMP}"
PARENT_SCOPE)
endfunction()
# ----------------------------------------------------------------------------------------#
#
# Detects host architecture values: - architecture name - cpu vendor - cpu family - cpu
# model
#
function(DETECT_HOST_ARCHITECTURE _CPU_ARCH_VAR)
cmake_parse_arguments(DETECT "VENDOR;FAMILY;MODEL" "" "" ${ARGN})
set(_vendor_id)
set(_cpu_family)
set(_cpu_model)
set(TARGET_ARCHITECTURE "generic")
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
file(READ "${CpuArch_INPUT}" _cpuinfo)
string(REGEX REPLACE ".*vendor_id[ \t]*:[ \t]+([a-zA-Z0-9_-]+).*" "\\1"
_vendor_id "${_cpuinfo}")
string(REGEX REPLACE ".*cpu family[ \t]*:[ \t]+([a-zA-Z0-9_-]+).*" "\\1"
_cpu_family "${_cpuinfo}")
string(REGEX REPLACE ".*model[ \t]*:[ \t]+([a-zA-Z0-9_-]+).*" "\\1" _cpu_model
"${_cpuinfo}")
# if no matches anywhere, expect an IBM PowerPC based on experiences with Summit
if("${_vendor_id}" STREQUAL "${_cpu_family}")
string(REGEX REPLACE ".*cpu[ \t]*:[ \t]+([a-zA-Z0-9_-]+).*" "\\1" _cpu
"${_cpuinfo}")
string(REGEX REPLACE "([a-zA-Z]+).*" "\\1" _cpu_family "${_cpu}")
string(REGEX REPLACE "[a-zA-Z]+([0-9]+).*" "\\1" _cpu_model "${_cpu}")
if("${_cpu_family}" STREQUAL "POWER")
set(_vendor_id "IBM")
endif()
string(TOLOWER "${_cpu}" TARGET_ARCHITECTURE)
endif()
elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
execute_process(
COMMAND /usr/sbin/sysctl -n machdep.cpu.vendor
OUTPUT_VARIABLE _vendor_id
OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(
COMMAND /usr/sbin/sysctl -n machdep.cpu.model
OUTPUT_VARIABLE _cpu_model
OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(
COMMAND /usr/sbin/sysctl -n machdep.cpu.family
OUTPUT_VARIABLE _cpu_family
OUTPUT_STRIP_TRAILING_WHITESPACE)
elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows")
set(_cpu_id
"$ENV{PROCESSOR_IDENTIFIER}"
CACHE INTERNAL "Cpu info")
string(REGEX REPLACE ".*, ([A-Za-z]+)$" "\\1" _vendor_id "${_cpu_id}")
string(REGEX REPLACE ".* Family ([0-9]+) .*" "\\1" _cpu_family "${_cpu_id}")
string(REGEX REPLACE ".* Model ([0-9]+) .*" "\\1" _cpu_model "${_cpu_id}")
endif()
if(_vendor_id STREQUAL "GenuineIntel")
#
if(_cpu_family EQUAL 6)
# taken from the Intel ORM
# http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html
# CPUID Signature Values of Of Recent Intel Microarchitectures 4E 5E |
# Skylake microarchitecture 3D 47 56 | Broadwell microarchitecture 3C 45 46
# 3F | Haswell microarchitecture 3A 3E | Ivy Bridge microarchitecture 2A
# 2D | Sandy Bridge microarchitecture 25 2C 2F | Intel
# microarchitecture Westmere 1A 1E 1F 2E | Intel microarchitecture Nehalem 17
# 1D | Enhanced Intel Core microarchitecture 0F | Intel Core
# microarchitecture
#
# Intel SDM Vol. 3C 35-1 / December 2016: 57 | Xeon Phi 3200, 5200,
# 7200 [Knights Landing] 85 | Future Xeon Phi 8E 9E | 7th gen.
# Core [Kaby Lake] 55 | Future Xeon [Skylake w/ AVX512]
# 4E 5E | 6th gen. Core / E3 v5 [Skylake w/o AVX512] 56 |
# Xeon D-1500 [Broadwell] 4F | Xeon E5 v4, E7 v4,
# i7-69xx [Broadwell] 47 | 5th gen. Core / Xeon E3 v4 [Broadwell] 3D
# | M-5xxx / 5th gen. [Broadwell] 3F | Xeon E5 v3, E7 v3, i7-59xx
# [Haswell-E] 3C 45 46 | 4th gen. Core, Xeon E3 v3 [Haswell] 3E |
# Xeon E5 v2, E7 v2, i7-49xx [Ivy Bridge-E] 3A | 3rd gen. Core, Xeon E3 v2
# [Ivy Bridge] 2D | Xeon E5, i7-39xx [Sandy Bridge] 2F |
# Xeon E7 2A | Xeon E3, 2nd gen. Core [Sandy Bridge] 2E |
# Xeon 7500, 6500 series 25 2C | Xeon 3600, 5600 series, Core i7, i5 and
# i3
#
# Values from the Intel SDE: 5C | Goldmont 5A | Silvermont 57 | Knights
# Landing 66 | Cannonlake 55 | Skylake Server 4E | Skylake Client 3C |
# Broadwell (likely a bug in the SDE) 3C | Haswell
function(issue_message _family _model _use)
set(_msg "Your CPU (family ${_family}, model ${_model}) is not known.")
set(_msg "${_msg} Auto-detection of optimization flags failed and will")
set(_msg "${_msg} use the ${_use} settings.")
message(WARNING "${_msg}")
unset(_msg)
endfunction()
if(_cpu_model EQUAL 87) # 57
set(TARGET_ARCHITECTURE "knl") # Knights Landing
elseif(_cpu_model EQUAL 92)
set(TARGET_ARCHITECTURE "goldmont")
elseif(_cpu_model EQUAL 90 OR _cpu_model EQUAL 76)
set(TARGET_ARCHITECTURE "silvermont")
elseif(_cpu_model EQUAL 102)
set(TARGET_ARCHITECTURE "cannonlake")
elseif(_cpu_model EQUAL 125 OR _cpu_model EQUAL 126)
set(TARGET_ARCHITECTURE "icelake")
elseif(_cpu_model EQUAL 106 OR _cpu_model EQUAL 108)
set(TARGET_ARCHITECTURE "icelake-server")
elseif(_cpu_model EQUAL 142 OR _cpu_model EQUAL 158) # 8E, 9E
set(TARGET_ARCHITECTURE "kaby-lake")
elseif(_cpu_model EQUAL 85) # 55
set(TARGET_ARCHITECTURE "skylake-avx512")
elseif(
_cpu_model EQUAL 78
OR _cpu_model EQUAL 94
OR _cpu_model EQUAL 165) # 4E, 5E
set(TARGET_ARCHITECTURE "skylake")
elseif(
_cpu_model EQUAL 61
OR _cpu_model EQUAL 71
OR _cpu_model EQUAL 79
OR _cpu_model EQUAL 86) # 3D, 47, 4F, 56
set(TARGET_ARCHITECTURE "broadwell")
elseif(
_cpu_model EQUAL 60
OR _cpu_model EQUAL 69
OR _cpu_model EQUAL 70
OR _cpu_model EQUAL 63)
set(TARGET_ARCHITECTURE "haswell")
elseif(_cpu_model EQUAL 58 OR _cpu_model EQUAL 62)
set(TARGET_ARCHITECTURE "ivy-bridge")
elseif(_cpu_model EQUAL 42 OR _cpu_model EQUAL 45)
set(TARGET_ARCHITECTURE "sandy-bridge")
elseif(
_cpu_model EQUAL 37
OR _cpu_model EQUAL 44
OR _cpu_model EQUAL 47)
set(TARGET_ARCHITECTURE "westmere")
elseif(
_cpu_model EQUAL 26
OR _cpu_model EQUAL 30
OR _cpu_model EQUAL 31
OR _cpu_model EQUAL 46)
set(TARGET_ARCHITECTURE "nehalem")
elseif(_cpu_model EQUAL 23 OR _cpu_model EQUAL 29)
set(TARGET_ARCHITECTURE "penryn")
elseif(_cpu_model EQUAL 15)
set(TARGET_ARCHITECTURE "merom")
elseif(_cpu_model EQUAL 28)
set(TARGET_ARCHITECTURE "atom")
elseif(_cpu_model EQUAL 14)
set(TARGET_ARCHITECTURE "core")
elseif(_cpu_model LESS 14)
issue_message(${_cpu_family} ${_cpu_model} "generic CPU w/ SSE2")
set(TARGET_ARCHITECTURE "generic")
else()
message(WARNING)
issue_message(${_cpu_family} ${_cpu_model} "65nm Core 2 CPU")
set(TARGET_ARCHITECTURE "merom")
endif()
elseif(_cpu_family EQUAL 7) # Itanium (not supported)
message(
WARNING
"Your CPU (Itanium: family ${_cpu_family}, model ${_cpu_model}) is not supported."
)
elseif(_cpu_family EQUAL 15) # NetBurst
list(APPEND _available_vector_units_list "sse" "sse2")
if(_cpu_model GREATER 2) # Not sure whether this must be 3 or even 4 instead
list(APPEND _available_vector_units_list "sse" "sse2" "sse3")
endif(_cpu_model GREATER 2)
endif()
#
elseif(_vendor_id STREQUAL "AuthenticAMD")
#
if(_cpu_family EQUAL 23)
set(TARGET_ARCHITECTURE "zen")
elseif(_cpu_family EQUAL 22) # 16h
set(TARGET_ARCHITECTURE "AMD 16h")
elseif(_cpu_family EQUAL 21) # 15h
if(_cpu_model LESS 2)
set(TARGET_ARCHITECTURE "bulldozer")
else()
set(TARGET_ARCHITECTURE "piledriver")
endif()
elseif(_cpu_family EQUAL 20) # 14h
set(TARGET_ARCHITECTURE "AMD 14h")
elseif(_cpu_family EQUAL 18) # 12h
elseif(_cpu_family EQUAL 16) # 10h
set(TARGET_ARCHITECTURE "barcelona")
elseif(_cpu_family EQUAL 15)
set(TARGET_ARCHITECTURE "k8")
if(_cpu_model GREATER 64)
set(TARGET_ARCHITECTURE "k8-sse3")
endif(_cpu_model GREATER 64)
endif()
#
endif()
if(CpuArch_DEBUG)
function(CpuArch_DEBUG_OUTPUT LABEL VARIABLE INFO)
if("${${VARIABLE}}" STREQUAL "${INFO}" AND NOT "${INFO}" STREQUAL "")
message(
FATAL_ERROR "${VARIABLE} (${LABEL}) could not be found in:\n${INFO}")
else()
message(STATUS "${LABEL} : ${${VARIABLE}}")
endif()
endfunction()
message(STATUS "")
cpuarch_debug_output("VENDOR ID " _vendor_id "${_cpuinfo}")
cpuarch_debug_output("CPU FAMILY " _cpu_family "${_cpuinfo}")
cpuarch_debug_output("CPU MODEL " _cpu_model "${_cpuinfo}")
cpuarch_debug_output("ARCHITECTURE" TARGET_ARCHITECTURE "${_cpuinfo}")
message(STATUS "")
endif()
if(DETECT_VENDOR)
set(${_CPU_ARCH_VAR}
"${_vendor_id}"
PARENT_SCOPE)
elseif(DETECT_FAMILY)
set(${_CPU_ARCH_VAR}
"${_cpu_family}"
PARENT_SCOPE)
elseif(DETECT_MODEL)
set(${_CPU_ARCH_VAR}
"${_cpu_model}"
PARENT_SCOPE)
else()
set(${_CPU_ARCH_VAR}
"${TARGET_ARCHITECTURE}"
PARENT_SCOPE)
endif()
# temporary variables
set(CpuArch_VENDOR_ID
"${_vendor_id}"
PARENT_SCOPE)
set(CpuArch_CPU_FAMILY
"${_cpu_family}"
PARENT_SCOPE)
set(CpuArch_CPU_MODEL
"${_cpu_model}"
PARENT_SCOPE)
endfunction()
# ----------------------------------------------------------------------------------------#
#
# Find the request cpu features from the available flags and/or append the highest known
# flag if possible
#
function(GET_CPU_FEATURES _OUTVAR)
# parse args
cmake_parse_arguments(_CPU "" "TARGET" "VALID;CANDIDATES" ${ARGN})
if("${_CPU_CANDIDATES}" STREQUAL "")
message(STATUS "No CpuArch_COMPONENTS found")
return()
endif()
if("${_CPU_VALID}" STREQUAL "")
message(STATUS "No valid features")
return()
endif()
if(MSVC)
return()
endif()
string(REPLACE "_" "." _CPU_VALID "${_CPU_VALID}")
foreach(_CANDIDATE ${_CPU_CANDIDATES})
if("${_CANDIDATE}" IN_LIST _CPU_VALID)
list(APPEND _FEATURES ${_CANDIDATE})
list(REMOVE_DUPLICATES _FEATURES)
endif()
list(APPEND _MISSING ${_CANDIDATE})
set(CpuArch_${_CANDIDATE}_FOUND
OFF
PARENT_SCOPE)
endforeach()
set(OFA_map_knl "MIC-AVX512")
set(OFA_map_cannonlake "CORE-AVX512")
set(OFA_map_skylake-avx512 "CORE-AVX512")
set(OFA_map_skylake "CORE-AVX2")
set(OFA_map_broadwell "CORE-AVX2")
set(OFA_map_haswell "CORE-AVX2")
set(OFA_map_ivybridge "CORE-AVX-I")
set(OFA_map_sandybridge "AVX")
set(OFA_map_westmere "SSE4.2")
set(OFA_map_nehalem "SSE4.2")
set(OFA_map_penryn "SSSE3")
set(OFA_map_merom "SSSE3")
set(OFA_map_core2 "SSE3")
set(OFA_map_kaby-lake "AVX2")
set(OFA_map_power9 "ALTIVEC")
list(APPEND _FEATURES "${OFA_map_${_CPU_TARGET}}")
if("${_FEATURES}" STREQUAL "")
list(APPEND _FEATURES "HOST")
endif()
string(TOLOWER "${_FEATURES}" _FEATURES)
if(NOT "${_FEATURES}" STREQUAL "")
list(REMOVE_DUPLICATES _FEATURES)
endif()
string(REPLACE "_" "." _FEATURES "${_FEATURES}")
set(_TMP ${_FEATURES})
foreach(_VAR ${_TMP})
list(APPEND _FOUND ${_VAR})
list(REMOVE_ITEM _MISSING ${_VAR})
set(CpuArch_${_VAR}_FOUND
ON
PARENT_SCOPE)
endforeach()
set(CpuArch_FOUND_COMPONENTS
${_FOUND}
PARENT_SCOPE)
set(CpuArch_MISSING_COMPONENTS
${_MISSING}
PARENT_SCOPE)
set(${_OUTVAR}
"${_TMP}"
PARENT_SCOPE)
endfunction()
# ----------------------------------------------------------------------------------------#
#
detect_host_architecture(TARGET_ARCH)
set(CpuArch_TARGET
"${TARGET_ARCH}"
CACHE STRING "CPU architecture target")
set(CpuArch_TARGET_LAST
"${CpuArch_TARGET}"
CACHE INTERNAL "CPU architecture target" FORCE)
# get the target features
detect_host_features(TARGET_FEATURES)
# check the components against the available features
get_cpu_features(
_FEATURES
TARGET ${CpuArch_TARGET}
VALID ${TARGET_FEATURES}
CANDIDATES ${CpuArch_FIND_COMPONENTS})
set(CpuArch_FEATURES
"${_FEATURES}"
CACHE STRING "CPU architecture features")
set(CpuArch_FEATURES_LAST
"${CpuArch_FEATURES}"
CACHE INTERNAL "CPU architecture features" FORCE)
# if we populated w/ default set, don't report as missing and don't require them
if(CpuArch_FIND_DEFAULT)
foreach(_MISSING ${CpuArch_MISSING_COMPONENTS})
list(REMOVE_ITEM CpuArch_FIND_COMPONENTS ${_MISSING})
set(CpuArch_FIND_REQUIRED_${_MISSING} OFF)
endforeach()
endif()
# ----------------------------------------------------------------------------------------#
#
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(
CpuArch
FOUND_VAR CpuArch_FOUND
REQUIRED_VARS CpuArch_TARGET
HANDLE_COMPONENTS)