From 1cf6d523fd99d378394dc2a0dfb88047e86ef926 Mon Sep 17 00:00:00 2001 From: Mark Vejvoda Date: Fri, 27 May 2011 06:37:43 +0000 Subject: [PATCH] - updated cmake system to support using NON EMBEDDED versions of libircclient and miniupnpc for proper build in Debian --- mk/cmake/Modules/FindIrcclient.cmake | 64 +++++++++++++++++++ mk/cmake/Modules/FindMiniupnpc.cmake | 50 +++++++++++++++ source/shared_lib/CMakeLists.txt | 35 +++++++++- .../include/platform/miniupnpc/miniupnpc.h | 2 + .../sources/platform/posix/socket.cpp | 16 +++++ 5 files changed, 164 insertions(+), 3 deletions(-) create mode 100644 mk/cmake/Modules/FindIrcclient.cmake create mode 100644 mk/cmake/Modules/FindMiniupnpc.cmake diff --git a/mk/cmake/Modules/FindIrcclient.cmake b/mk/cmake/Modules/FindIrcclient.cmake new file mode 100644 index 00000000..4adb7deb --- /dev/null +++ b/mk/cmake/Modules/FindIrcclient.cmake @@ -0,0 +1,64 @@ +# Locate ircclient library +# This module defines +# IRCCLIENT_FOUND, if false, do not try to link to IRCCLIENT +# IRCCLIENT_LIBRARY, the libircclient variant +# IRCCLIENT_INCLUDE_DIR, where to find libircclient.h and family) +# +# Note that the expected include convention is +# #include "libircclient.h" +# and not +# #include +# This is because, the ircclient location is not standardized and may exist +# in locations other than libircclient/ + +#============================================================================= +# Copyright 2011 Mark Vejvoda +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distributed this file outside of CMake, substitute the full +# License text for the above reference.) + +FIND_PATH(IRCCLIENT_INCLUDE_DIR libircclient.h + HINTS + $ENV{IRCCLIENTDIR} + PATH_SUFFIXES include/libircclient include + PATHS + ~/Library/Frameworks + /Library/Frameworks + /usr/local + /usr + /sw # Fink + /opt/local # DarwinPorts + /opt/csw # Blastwave + /opt +) + +FIND_LIBRARY(IRCCLIENT_LIBRARY + NAMES ircclient + HINTS + $ENV{IRCCLIENTDIR} + PATH_SUFFIXES lib64 lib libs64 libs libs/Win32 libs/Win64 + PATHS + ~/Library/Frameworks + /Library/Frameworks + /usr/local + /usr + /sw + /opt/local + /opt/csw + /opt +) + + +# handle the QUIETLY and REQUIRED arguments and set IRCCLIENT_FOUND to TRUE if +# all listed variables are TRUE +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(IRCCLIENT DEFAULT_MSG IRCCLIENT_LIBRARY IRCCLIENT_INCLUDE_DIR) + +MARK_AS_ADVANCED(IRCCLIENT_LIBRARY IRCCLIENT_INCLUDE_DIR) diff --git a/mk/cmake/Modules/FindMiniupnpc.cmake b/mk/cmake/Modules/FindMiniupnpc.cmake new file mode 100644 index 00000000..75e00ab6 --- /dev/null +++ b/mk/cmake/Modules/FindMiniupnpc.cmake @@ -0,0 +1,50 @@ +# Locate miniupnp library +# This module defines +# MINIUPNP_FOUND, if false, do not try to link to miniupnp +# MINIUPNP_LIBRARY, the miniupnp variant +# MINIUPNP_INCLUDE_DIR, where to find miniupnpc.h and family) +# +# Note that the expected include convention is +# #include "miniupnpc.h" +# and not +# #include +# This is because, the miniupnpc location is not standardized and may exist +# in locations other than miniupnpc/ + +#============================================================================= +# Copyright 2011 Mark Vejvoda +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distributed this file outside of CMake, substitute the full +# License text for the above reference.) + +if (MINIUPNP_INCLUDE_DIR AND MINIUPNP_LIBRARY) + # Already in cache, be silent + set(MINIUPNP_FIND_QUIETLY TRUE) +endif (MINIUPNP_INCLUDE_DIR AND MINIUPNP_LIBRARY) + +find_path(MINIUPNP_INCLUDE_DIR miniupnpc.h + PATH_SUFFIXES miniupnpc) +find_library(MINIUPNP_LIBRARY miniupnpc) + +if (MINIUPNP_INCLUDE_DIR AND MINIUPNP_LIBRARY) + set (MINIUPNP_FOUND TRUE) +endif () + +if (MINIUPNP_FOUND) + if (NOT MINIUPNP_FIND_QUIETLY) + message (STATUS "Found the miniupnpc libraries at ${MINIUPNP_LIBRARY}") + message (STATUS "Found the miniupnpc headers at ${MINIUPNP_INCLUDE_DIR}") + endif (NOT MINIUPNP_FIND_QUIETLY) +else () + message (STATUS "Could not find miniupnp") +endif () + +MARK_AS_ADVANCED(MINIUPNP_INCLUDE_DIR MINIUPNP_LIBRARY) + diff --git a/source/shared_lib/CMakeLists.txt b/source/shared_lib/CMakeLists.txt index 6a9929b2..755c57b7 100644 --- a/source/shared_lib/CMakeLists.txt +++ b/source/shared_lib/CMakeLists.txt @@ -132,7 +132,6 @@ SET(DIRS_WITH_SRC lua map platform/common - platform/miniupnpc sound sound/openal streflop @@ -140,6 +139,22 @@ SET(DIRS_WITH_SRC util xml) +IF(NOT WANT_STATIC_LIBS) + MESSAGE(STATUS "*** Searching for miniupnpc since WANT_STATIC_LIBS is off ...") + FIND_PACKAGE(Miniupnpc) +ENDIF() + +if(NOT MINIUPNP_FOUND) + MESSAGE(STATUS "*** Using EMBEDDED miniupnpc since dev system does not have it... MINIUPNP_FOUND [${MINIUPNP_FOUND}]") + + SET(DIRS_WITH_SRC ${DIRS_WITH_SRC} platform/miniupnpc) +else() + MESSAGE(STATUS "*** Using SHARED miniupnpc found in [${MINIUPNP_INCLUDE_DIR}] MINIUPNP_FOUND [${MINIUPNP_FOUND}] MINIUPNP_LIBRARY [${MINIUPNP_LIBRARY}]") + + INCLUDE_DIRECTORIES(${MINIUPNP_INCLUDE_DIR}) + SET(EXTERNAL_LIBS ${EXTERNAL_LIBS} ${MINIUPNP_LIBRARY}) +endif() + IF(APPLE) SET(DIRS_WITH_SRC ${DIRS_WITH_SRC} platform/sdl) SET(DIRS_WITH_SRC ${DIRS_WITH_SRC} platform/posix) @@ -160,8 +175,22 @@ SET(MG_INCLUDE_FILES "") SET(MG_SOURCE_FILES "") INCLUDE_DIRECTORIES( ${MG_INCLUDES_ROOT}platform/sdl ) -SET(MG_SOURCE_FILES ${MG_SOURCE_FILES} ${PROJECT_SOURCE_DIR}/source/shared_lib/sources/libircclient/src/libircclient.c) -INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/source/shared_lib/include/libircclient/include) +IF(NOT WANT_STATIC_LIBS) + MESSAGE(STATUS "*** Searching for libircclient since WANT_STATIC_LIBS is off ...") + FIND_PACKAGE(Ircclient) +ENDIF() + +if(NOT IRCCLIENT_FOUND) + MESSAGE(STATUS "*** Using EMBEDDED libircclient since dev system does not have it... IRCCLIENT_FOUND [${IRCCLIENT_FOUND}]") + + SET(MG_SOURCE_FILES ${MG_SOURCE_FILES} ${PROJECT_SOURCE_DIR}/source/shared_lib/sources/libircclient/src/libircclient.c) + INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/source/shared_lib/include/libircclient/include) +else() + MESSAGE(STATUS "*** Using SHARED libircclient found in [${IRCCLIENT_INCLUDE_DIR}] IRCCLIENT_FOUND [${IRCCLIENT_FOUND}] IRCCLIENT_LIBRARY [${IRCCLIENT_LIBRARY}]") + + INCLUDE_DIRECTORIES(${IRCCLIENT_INCLUDE_DIR}) + SET(EXTERNAL_LIBS ${EXTERNAL_LIBS} ${IRCCLIENT_LIBRARY}) +endif() IF(WIN32) SET(MG_SOURCE_FILES ${MG_SOURCE_FILES} ${PROJECT_SOURCE_DIR}/source/shared_lib/sources/platform/posix/socket.cpp) diff --git a/source/shared_lib/include/platform/miniupnpc/miniupnpc.h b/source/shared_lib/include/platform/miniupnpc/miniupnpc.h index 457489b5..9a619e6b 100644 --- a/source/shared_lib/include/platform/miniupnpc/miniupnpc.h +++ b/source/shared_lib/include/platform/miniupnpc/miniupnpc.h @@ -8,6 +8,8 @@ #ifndef __MINIUPNPC_H__ #define __MINIUPNPC_H__ +#define MEGAGLEST_EMBEDDED_MINIUPNPC + #include "declspec.h" #include "igd_desc_parse.h" diff --git a/source/shared_lib/sources/platform/posix/socket.cpp b/source/shared_lib/sources/platform/posix/socket.cpp index 4086f1da..142c3d15 100644 --- a/source/shared_lib/sources/platform/posix/socket.cpp +++ b/source/shared_lib/sources/platform/posix/socket.cpp @@ -2142,7 +2142,11 @@ int UPNP_Tools::upnp_init(void *param) { } char externalIP[16] = ""; +#ifndef MEGAGLEST_EMBEDDED_MINIUPNPC + UPNP_GetExternalIPAddress(urls.controlURL, data.first.servicetype, externalIP); +#else UPNP_GetExternalIPAddress(urls.controlURL, data.servicetype, externalIP); +#endif if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"UPnP device found at: [%s] callback [%p]\n",externalIP,callback); //UPNP_Tools::NETaddRedirects(ports); @@ -2182,12 +2186,20 @@ bool UPNP_Tools::upnp_add_redirect(int ports[2]) { if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] upnp_add_redir(%d : %d)\n",__FILE__,__FUNCTION__,__LINE__,ports[0],ports[1]); +#ifndef MEGAGLEST_EMBEDDED_MINIUPNPC + UPNP_GetExternalIPAddress(urls.controlURL, data.first.servicetype, externalIP); +#else UPNP_GetExternalIPAddress(urls.controlURL, data.servicetype, externalIP); +#endif sprintf(ext_port_str, "%d", ports[0]); sprintf(int_port_str, "%d", ports[1]); +#ifndef MEGAGLEST_EMBEDDED_MINIUPNPC + r = UPNP_AddPortMapping(urls.controlURL, data.first.servicetype,ext_port_str, int_port_str, lanaddr, "MegaGlest - www.megaglest.org", "TCP", 0); +#else r = UPNP_AddPortMapping(urls.controlURL, data.servicetype,ext_port_str, int_port_str, lanaddr, "MegaGlest - www.megaglest.org", "TCP", 0); +#endif if (r != UPNPCOMMAND_SUCCESS) { if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] AddPortMapping(%s, %s, %s) failed\n",__FILE__,__FUNCTION__,__LINE__,ext_port_str, int_port_str, lanaddr); return false; @@ -2202,7 +2214,11 @@ void UPNP_Tools::upnp_rem_redirect(int ext_port) { char ext_port_str[16]=""; sprintf(ext_port_str, "%d", ext_port); +#ifndef MEGAGLEST_EMBEDDED_MINIUPNPC + UPNP_DeletePortMapping(urls.controlURL, data.first.servicetype, ext_port_str, "TCP", 0); +#else UPNP_DeletePortMapping(urls.controlURL, data.servicetype, ext_port_str, "TCP", 0); +#endif } void UPNP_Tools::NETaddRedirects(std::vector UPNPPortForwardList) {