diff --git a/cmake/finders/FindSIMDe.cmake b/cmake/finders/FindSIMDe.cmake new file mode 100644 index 000000000..c2fbc5411 --- /dev/null +++ b/cmake/finders/FindSIMDe.cmake @@ -0,0 +1,100 @@ +#[=======================================================================[.rst +FindSIMDe +--------- + +FindModule for SIMD Everywhere + +Imported Targets +^^^^^^^^^^^^^^^^ + +.. versionadded:: 3.0 + +This module defines the :prop_tgt:`IMPORTED` target ``SIMDe::SIMDe``. + +Result Variables +^^^^^^^^^^^^^^^^ + +This module sets the following variables: + +``SIMDe_FOUND`` + True, if headers were found. +``SIMDe_VERSION`` + Detected version of found SIMDe Everywhere. + +Cache variables +^^^^^^^^^^^^^^^ + +The following cache variables may also be set: + +``SIMDe_INCLUDE_DIR`` + Directory containing ``simde/simde-common.h``. + +#]=======================================================================] + +include(FindPackageHandleStandardArgs) + +find_package(PkgConfig QUIET) +if(PKG_CONFIG_FOUND) + pkg_search_module(PC_SIMDe QUIET simde) +endif() + +find_path( + SIMDe_INCLUDE_DIR + NAMES simde/simde-common.h + HINTS ${PC_SIMDe_INCLUDE_DIRS} + PATHS /usr/include /usr/local/include + DOC "SIMD Everywhere include directory" +) + +if(EXISTS "${SIMDe_INCLUDE_DIR}/simde/simde-common.h") + file( + STRINGS + "${SIMDe_INCLUDE_DIR}/simde/simde-common.h" + _version_string + REGEX "^.*VERSION_(MAJOR|MINOR|MICRO)[ \t]+[0-9]+[ \t]*$" + ) + + string(REGEX REPLACE ".*VERSION_MAJOR[ \t]+([0-9]+).*" "\\1" _version_major "${_version_string}") + string(REGEX REPLACE ".*VERSION_MINOR[ \t]+([0-9]+).*" "\\1" _version_minor "${_version_string}") + string(REGEX REPLACE ".*VERSION_MICRO[ \t]+([0-9]+).*" "\\1" _version_release "${_version_string}") + + set(SIMDe_VERSION "${_version_major}.${_version_minor}.${_version_release}") + unset(_version_major) + unset(_version_minor) + unset(_version_release) +else() + if(NOT SIMDe_FIND_QUIETLY) + message(AUTHOR_WARNING "Failed to find SIMD Everywhere version.") + endif() + set(SIMDe_VERSION 0.0.0) +endif() + +if(CMAKE_HOST_SYSTEM_NAME MATCHES "Darwin|Windows") + set(SIMDe_ERROR_REASON "Ensure that obs-deps is provided as part of CMAKE_PREFIX_PATH.") +elseif(CMAKE_HOST_SYSTEM_NAME MATCHES "Linux|FreeBSD") + set(SIMDe_ERROR_REASON "Ensure SIMD Everywhere is available in local library paths.") +endif() + +find_package_handle_standard_args( + SIMDe + REQUIRED_VARS SIMDe_INCLUDE_DIR + VERSION_VAR SIMDe_VERSION + REASON_FAILURE_MESSAGE "${SIMDe_ERROR_REASON}" +) +mark_as_advanced(SIMDe_INCLUDE_DIR) +unset(SIMDe_ERROR_REASON) + +if(SIMDe_FOUND) + if(NOT TARGET SIMDe::SIMDe) + add_library(SIMDe::SIMDe INTERFACE IMPORTED) + set_target_properties(SIMDe::SIMDe PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${SIMDe_INCLUDE_DIR}") + endif() +endif() + +include(FeatureSummary) +set_package_properties( + SIMDe + PROPERTIES + URL "https://github.com/simd-everywhere/simde" + DESCRIPTION "Implementations of SIMD instruction sets for systems which don't natively support them." +)