FindHWY.cmake (2643B)
1 # Copyright (c) the JPEG XL Project Authors. All rights reserved. 2 # 3 # Use of this source code is governed by a BSD-style 4 # license that can be found in the LICENSE file. 5 6 find_package(PkgConfig QUIET) 7 if (PkgConfig_FOUND) 8 pkg_check_modules(PC_HWY QUIET libhwy) 9 set(HWY_VERSION ${PC_HWY_VERSION}) 10 endif () 11 12 find_path(HWY_INCLUDE_DIR 13 NAMES hwy/base.h hwy/highway.h 14 HINTS ${PC_HWY_INCLUDEDIR} ${PC_HWY_INCLUDE_DIRS} 15 ) 16 17 find_library(HWY_LIBRARY 18 NAMES ${HWY_NAMES} hwy 19 HINTS ${PC_HWY_LIBDIR} ${PC_HWY_LIBRARY_DIRS} 20 ) 21 22 # If version not found using pkg-config, try extracting it from header files 23 if (HWY_INCLUDE_DIR AND NOT HWY_VERSION) 24 set(HWY_VERSION "") 25 set(HWY_POSSIBLE_HEADERS "${HWY_INCLUDE_DIR}/hwy/base.h" "${HWY_INCLUDE_DIR}/hwy/highway.h") 26 foreach(HWY_HEADER_FILE IN LISTS HWY_POSSIBLE_HEADERS) 27 if (EXISTS "${HWY_HEADER_FILE}") 28 file(READ "${HWY_HEADER_FILE}" HWY_VERSION_CONTENT) 29 30 string(REGEX MATCH "#define HWY_MAJOR +([0-9]+)" _sink "${HWY_VERSION_CONTENT}") 31 set(HWY_VERSION_MAJOR "${CMAKE_MATCH_1}") 32 33 string(REGEX MATCH "#define +HWY_MINOR +([0-9]+)" _sink "${HWY_VERSION_CONTENT}") 34 set(HWY_VERSION_MINOR "${CMAKE_MATCH_1}") 35 36 string(REGEX MATCH "#define +HWY_PATCH +([0-9]+)" _sink "${HWY_VERSION_CONTENT}") 37 set(HWY_VERSION_PATCH "${CMAKE_MATCH_1}") 38 if (NOT HWY_VERSION_MAJOR STREQUAL "" AND NOT HWY_VERSION_MINOR STREQUAL "" AND NOT HWY_VERSION_PATCH STREQUAL "") 39 set(HWY_VERSION "${HWY_VERSION_MAJOR}.${HWY_VERSION_MINOR}.${HWY_VERSION_PATCH}") 40 break() 41 endif() 42 endif () 43 endforeach () 44 if (NOT HWY_VERSION) 45 message(WARNING "Highway version not found.") 46 endif() 47 endif () 48 49 include(FindPackageHandleStandardArgs) 50 find_package_handle_standard_args(HWY 51 FOUND_VAR HWY_FOUND 52 REQUIRED_VARS HWY_LIBRARY HWY_INCLUDE_DIR 53 VERSION_VAR HWY_VERSION 54 ) 55 56 if (HWY_LIBRARY AND NOT TARGET hwy) 57 add_library(hwy INTERFACE IMPORTED GLOBAL) 58 59 if(CMAKE_VERSION VERSION_LESS "3.13.5") 60 set_property(TARGET hwy PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${HWY_INCLUDE_DIR}) 61 target_link_libraries(hwy INTERFACE ${HWY_LIBRARY}) 62 set_property(TARGET hwy PROPERTY INTERFACE_COMPILE_OPTIONS ${PC_HWY_CFLAGS_OTHER}) 63 else() 64 target_include_directories(hwy INTERFACE ${HWY_INCLUDE_DIR}) 65 target_link_libraries(hwy INTERFACE ${HWY_LIBRARY}) 66 target_link_options(hwy INTERFACE ${PC_HWY_LDFLAGS_OTHER}) 67 target_compile_options(hwy INTERFACE ${PC_HWY_CFLAGS_OTHER}) 68 endif() 69 endif() 70 71 mark_as_advanced(HWY_INCLUDE_DIR HWY_LIBRARY) 72 73 if (HWY_FOUND) 74 set(HWY_LIBRARIES ${HWY_LIBRARY}) 75 set(HWY_INCLUDE_DIRS ${HWY_INCLUDE_DIR}) 76 endif ()