FindMiniUPnPc.cmake raw

   1  # Copyright (c) 2023-present The Limenka developers
   2  # Distributed under the MIT software license, see the accompanying
   3  # file COPYING or https://opensource.org/license/mit/.
   4  
   5  if(NOT MSVC)
   6    find_package(PkgConfig REQUIRED)
   7    pkg_check_modules(PC_MiniUPnPc QUIET miniupnpc)
   8  endif()
   9  
  10  find_path(MiniUPnPc_INCLUDE_DIR
  11    NAMES miniupnpc/miniupnpc.h
  12    PATHS ${PC_MiniUPnPc_INCLUDE_DIRS}
  13  )
  14  
  15  if(MiniUPnPc_INCLUDE_DIR)
  16    file(
  17      STRINGS "${MiniUPnPc_INCLUDE_DIR}/miniupnpc/miniupnpc.h" version_strings
  18      REGEX "^#define[\t ]+MINIUPNPC_API_VERSION[\t ]+[0-9]+"
  19    )
  20    string(REGEX REPLACE "^#define[\t ]+MINIUPNPC_API_VERSION[\t ]+([0-9]+)" "\\1" MiniUPnPc_API_VERSION "${version_strings}")
  21  
  22    # The minimum supported miniUPnPc API version is set to 17. This excludes
  23    # versions with known vulnerabilities.
  24    if(MiniUPnPc_API_VERSION GREATER_EQUAL 17)
  25      set(MiniUPnPc_API_VERSION_OK TRUE)
  26    endif()
  27  endif()
  28  
  29  if(MSVC)
  30    cmake_path(GET MiniUPnPc_INCLUDE_DIR PARENT_PATH MiniUPnPc_IMPORTED_PATH)
  31    find_library(MiniUPnPc_LIBRARY_DEBUG
  32      NAMES miniupnpc PATHS ${MiniUPnPc_IMPORTED_PATH}/debug/lib
  33      NO_DEFAULT_PATH
  34    )
  35    find_library(MiniUPnPc_LIBRARY_RELEASE
  36      NAMES miniupnpc PATHS ${MiniUPnPc_IMPORTED_PATH}/lib
  37      NO_DEFAULT_PATH
  38    )
  39    set(MiniUPnPc_required MiniUPnPc_IMPORTED_PATH)
  40  else()
  41    find_library(MiniUPnPc_LIBRARY
  42      NAMES miniupnpc
  43      PATHS ${PC_MiniUPnPc_LIBRARY_DIRS}
  44    )
  45    set(MiniUPnPc_required MiniUPnPc_LIBRARY)
  46  endif()
  47  
  48  include(FindPackageHandleStandardArgs)
  49  find_package_handle_standard_args(MiniUPnPc
  50    REQUIRED_VARS ${MiniUPnPc_required} MiniUPnPc_INCLUDE_DIR MiniUPnPc_API_VERSION_OK
  51  )
  52  
  53  if(MiniUPnPc_FOUND AND NOT TARGET MiniUPnPc::MiniUPnPc)
  54    add_library(MiniUPnPc::MiniUPnPc UNKNOWN IMPORTED)
  55    set_target_properties(MiniUPnPc::MiniUPnPc PROPERTIES
  56      INTERFACE_INCLUDE_DIRECTORIES "${MiniUPnPc_INCLUDE_DIR}"
  57    )
  58    if(MSVC)
  59      if(MiniUPnPc_LIBRARY_DEBUG)
  60        set_property(TARGET MiniUPnPc::MiniUPnPc APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
  61        set_target_properties(MiniUPnPc::MiniUPnPc PROPERTIES
  62          IMPORTED_LOCATION_DEBUG "${MiniUPnPc_LIBRARY_DEBUG}"
  63        )
  64      endif()
  65      if(MiniUPnPc_LIBRARY_RELEASE)
  66        set_property(TARGET MiniUPnPc::MiniUPnPc APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
  67        set_target_properties(MiniUPnPc::MiniUPnPc PROPERTIES
  68          IMPORTED_LOCATION_RELEASE "${MiniUPnPc_LIBRARY_RELEASE}"
  69        )
  70      endif()
  71    else()
  72      set_target_properties(MiniUPnPc::MiniUPnPc PROPERTIES
  73        IMPORTED_LOCATION "${MiniUPnPc_LIBRARY}"
  74      )
  75    endif()
  76    set_property(TARGET MiniUPnPc::MiniUPnPc PROPERTY
  77      INTERFACE_COMPILE_DEFINITIONS USE_UPNP=1 $<$<PLATFORM_ID:Windows>:MINIUPNP_STATICLIB>
  78    )
  79  endif()
  80  
  81  mark_as_advanced(
  82    MiniUPnPc_INCLUDE_DIR
  83    MiniUPnPc_LIBRARY
  84  )
  85