1#*************************************************************************** 2# _ _ ____ _ 3# Project ___| | | | _ \| | 4# / __| | | | |_) | | 5# | (__| |_| | _ <| |___ 6# \___|\___/|_| \_\_____| 7# 8# Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al. 9# 10# This software is licensed as described in the file COPYING, which 11# you should have received as part of this distribution. The terms 12# are also available at https://curl.se/docs/copyright.html. 13# 14# You may opt to use, copy, modify, merge, publish, distribute and/or sell 15# copies of the Software, and permit persons to whom the Software is 16# furnished to do so, under the terms of the COPYING file. 17# 18# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 19# KIND, either express or implied. 20# 21# SPDX-License-Identifier: curl 22# 23########################################################################### 24# Find the ngtcp2 library 25# 26# This module accepts optional COMPONENTS to control the crypto library (these are 27# mutually exclusive): 28# 29# - quictls: Use `libngtcp2_crypto_quictls`. (choose this for LibreSSL) 30# - BoringSSL: Use `libngtcp2_crypto_boringssl`. (choose this for AWS-LC) 31# - wolfSSL: Use `libngtcp2_crypto_wolfssl`. 32# - GnuTLS: Use `libngtcp2_crypto_gnutls`. 33# 34# Input variables: 35# 36# - `NGTCP2_INCLUDE_DIR`: The ngtcp2 include directory. 37# - `NGTCP2_LIBRARY`: Path to `ngtcp2` library. 38# 39# Result variables: 40# 41# - `NGTCP2_FOUND`: System has ngtcp2. 42# - `NGTCP2_INCLUDE_DIRS`: The ngtcp2 include directories. 43# - `NGTCP2_LIBRARIES`: The ngtcp2 library names. 44# - `NGTCP2_VERSION`: Version of ngtcp2. 45 46if(CURL_USE_PKGCONFIG) 47 find_package(PkgConfig QUIET) 48 pkg_check_modules(PC_NGTCP2 "libngtcp2") 49endif() 50 51find_path(NGTCP2_INCLUDE_DIR NAMES "ngtcp2/ngtcp2.h" 52 HINTS 53 ${PC_NGTCP2_INCLUDEDIR} 54 ${PC_NGTCP2_INCLUDE_DIRS} 55) 56 57find_library(NGTCP2_LIBRARY NAMES "ngtcp2" 58 HINTS 59 ${PC_NGTCP2_LIBDIR} 60 ${PC_NGTCP2_LIBRARY_DIRS} 61) 62 63if(PC_NGTCP2_VERSION) 64 set(NGTCP2_VERSION ${PC_NGTCP2_VERSION}) 65elseif(NGTCP2_INCLUDE_DIR AND EXISTS "${NGTCP2_INCLUDE_DIR}/ngtcp2/version.h") 66 set(_version_regex "#[\t ]*define[\t ]+NGTCP2_VERSION[\t ]+\"([^\"]*)\"") 67 file(STRINGS "${NGTCP2_INCLUDE_DIR}/ngtcp2/version.h" _version_str REGEX "${_version_regex}") 68 string(REGEX REPLACE "${_version_regex}" "\\1" _version_str "${_version_str}") 69 set(NGTCP2_VERSION "${_version_str}") 70 unset(_version_regex) 71 unset(_version_str) 72endif() 73 74if(NGTCP2_FIND_COMPONENTS) 75 set(_ngtcp2_crypto_backend "") 76 foreach(_component IN LISTS NGTCP2_FIND_COMPONENTS) 77 if(_component MATCHES "^(BoringSSL|quictls|wolfSSL|GnuTLS)") 78 if(_ngtcp2_crypto_backend) 79 message(FATAL_ERROR "NGTCP2: Only one crypto library can be selected") 80 endif() 81 set(_ngtcp2_crypto_backend ${_component}) 82 endif() 83 endforeach() 84 85 if(_ngtcp2_crypto_backend) 86 string(TOLOWER "ngtcp2_crypto_${_ngtcp2_crypto_backend}" _crypto_library) 87 88 if(CURL_USE_PKGCONFIG) 89 pkg_check_modules(PC_${_crypto_library} "lib${_crypto_library}") 90 endif() 91 92 get_filename_component(_ngtcp2_library_dir "${NGTCP2_LIBRARY}" DIRECTORY) 93 find_library(${_crypto_library}_LIBRARY NAMES ${_crypto_library} 94 HINTS 95 ${_ngtcp2_library_dir} 96 ${PC_${_crypto_library}_LIBDIR} 97 ${PC_${_crypto_library}_LIBRARY_DIRS} 98 ) 99 100 if(${_crypto_library}_LIBRARY) 101 set(NGTCP2_${_ngtcp2_crypto_backend}_FOUND TRUE) 102 set(NGTCP2_CRYPTO_LIBRARY ${${_crypto_library}_LIBRARY}) 103 endif() 104 endif() 105endif() 106 107include(FindPackageHandleStandardArgs) 108find_package_handle_standard_args(NGTCP2 109 REQUIRED_VARS 110 NGTCP2_INCLUDE_DIR 111 NGTCP2_LIBRARY 112 VERSION_VAR 113 NGTCP2_VERSION 114 HANDLE_COMPONENTS 115) 116 117if(NGTCP2_FOUND) 118 set(NGTCP2_INCLUDE_DIRS ${NGTCP2_INCLUDE_DIR}) 119 set(NGTCP2_LIBRARIES ${NGTCP2_LIBRARY} ${NGTCP2_CRYPTO_LIBRARY}) 120endif() 121 122mark_as_advanced(NGTCP2_INCLUDE_DIR NGTCP2_LIBRARY NGTCP2_CRYPTO_LIBRARY) 123