add upnp/natpmp support

Change-Id: I4945a7df3a30cb39d81a33fc7a32e9fea600bdff
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4a72860..b27b0f3 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -30,6 +30,9 @@
 
 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DMSGPACK_NO_BOOST -DMSGPACK_DISABLE_LEGACY_NIL -DMSGPACK_DISABLE_LEGACY_CONVERT")
 
+option(DHTNET_PUPNP "Enable UPnP support" ON)
+option(DHTNET_NATPMP "Enable NAT-PMP support" ON)
+
 # Sources
 list (APPEND dhtnet_SOURCES
     src/connectionmanager.cpp
@@ -48,8 +51,6 @@
     src/upnp/upnp_context.cpp
     src/upnp/upnp_control.cpp
     src/upnp/protocol/mapping.cpp
-    src/upnp/upnp_context.cpp
-    src/upnp/upnp_control.cpp
     src/upnp/protocol/igd.cpp
 )
 
@@ -70,6 +71,37 @@
     include/upnp/upnp_control.h
 )
 
+if (DHTNET_PUPNP)
+    pkg_search_module (upnp IMPORTED_TARGET upnp libupnp)
+    if (NOT upnp_FOUND)
+        message("libupnp not found: disabling")
+        set(DHTNET_PUPNP Off)
+    else()
+        list (APPEND dhtnet_SOURCES
+            src/upnp/protocol/pupnp/pupnp.cpp
+            src/upnp/protocol/pupnp/upnp_igd.cpp
+        )
+    endif()
+endif()
+if (DHTNET_NATPMP)
+    pkg_search_module (natpmp IMPORTED_TARGET natpmp)
+    if (NOT natpmp_FOUND)
+        find_library(natpmp_LIBRARIES natpmp)
+        if (NOT natpmp_LIBRARIES)
+            message("NAT-PMP not found: disabling")
+            set(DHTNET_NATPMP Off)
+        else()
+            message("NAT-PMP found: ${natpmp_LIBRARIES}")
+        endif()
+    endif()
+    if (DHTNET_NATPMP)
+        list (APPEND dhtnet_SOURCES
+            src/upnp/protocol/natpmp/nat_pmp.cpp
+            src/upnp/protocol/natpmp/pmp_igd.cpp
+        )
+    endif()
+endif()
+
 add_library(dhtnet ${dhtnet_SOURCES})
 target_link_libraries(dhtnet PUBLIC PkgConfig::opendht PkgConfig::pjproject fmt::fmt ${MSGPACK_LIB})
 if (APPLE)
@@ -80,6 +112,14 @@
     $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
     $<INSTALL_INTERFACE:include>
 )
+if (DHTNET_PUPNP)
+    target_compile_definitions(dhtnet PRIVATE HAVE_LIBUPNP)
+    target_link_libraries(dhtnet PRIVATE PkgConfig::upnp)
+endif()
+if (DHTNET_NATPMP)
+    target_compile_definitions(dhtnet PRIVATE HAVE_LIBNATPMP)
+    target_link_libraries(dhtnet PRIVATE ${natpmp_LIBRARIES})
+endif()
 if (BUILD_TESTING)
     target_compile_definitions(dhtnet PUBLIC DHTNET_TESTABLE)
 endif()