Fix UPnP auto-detection

Auto-detecting UPnP might fail when CMake was invoked multiple times.
This would result in a broken build because the compiler would not find
<natupnp.h>.
issue1247
Nicolas Hake 2015-01-07 20:32:49 +01:00
parent 0ecd30ad9e
commit 804bf41c92
2 changed files with 40 additions and 33 deletions

View File

@ -1,6 +1,6 @@
# OpenClonk, http://www.openclonk.org # OpenClonk, http://www.openclonk.org
# #
# Copyright (c) 2009-2014, The OpenClonk Team and contributors # Copyright (c) 2009-2015, The OpenClonk Team and contributors
# #
# Distributed under the terms of the ISC license; see accompanying file # Distributed under the terms of the ISC license; see accompanying file
# "COPYING" for details. # "COPYING" for details.
@ -63,6 +63,8 @@ option(USE_SYSTEM_TINYXML "Use system tinyxml library" OFF)
unset(OC_BUILD_MULTIPROCESSOR CACHE) unset(OC_BUILD_MULTIPROCESSOR CACHE)
unset(USE_APPLE_CLANG CACHE) unset(USE_APPLE_CLANG CACHE)
unset(HAVE_NATUPNP_H CACHE)
############################################################################ ############################################################################
# Check for compiler quirks and features # Check for compiler quirks and features
############################################################################ ############################################################################
@ -774,11 +776,6 @@ if(USE_CONSOLE)
CHECK_INCLUDE_FILE_CXX(readline.h HAVE_READLINE_H) CHECK_INCLUDE_FILE_CXX(readline.h HAVE_READLINE_H)
CHECK_INCLUDE_FILE_CXX(readline/readline.h HAVE_READLINE_READLINE_H) CHECK_INCLUDE_FILE_CXX(readline/readline.h HAVE_READLINE_READLINE_H)
endif() endif()
CHECK_INCLUDE_FILE_CXX(natupnp.h HAVE_NATUPNP_H)
if(WIN32 AND NOT HAVE_NATUPNP_H)
include_directories(thirdparty/natupnp)
set(HAVE_NATUPNP_H TRUE CACHE BOOL "natupnp.h available" FORCE)
endif()
CHECK_INCLUDE_FILES_CXX("X11/Xlib.h;X11/extensions/Xrandr.h" HAVE_X11_EXTENSIONS_XRANDR_H) CHECK_INCLUDE_FILES_CXX("X11/Xlib.h;X11/extensions/Xrandr.h" HAVE_X11_EXTENSIONS_XRANDR_H)
CHECK_INCLUDE_FILES_CXX("X11/Xlib.h;X11/keysym.h" HAVE_X11_KEYSYM_H) CHECK_INCLUDE_FILES_CXX("X11/Xlib.h;X11/keysym.h" HAVE_X11_KEYSYM_H)
@ -844,22 +841,19 @@ if(HAVE_EXECINFO_H)
endif() endif()
endif() endif()
if(HAVE_NATUPNP_H) find_package(Upnp)
if(NOT UPNP_FOUND)
list(APPEND OC_SYSTEM_SOURCES
src/network/C4Network2UPnPDummy.cpp
)
elseif(UPNP_STYLE STREQUAL "Win32")
list(APPEND OC_SYSTEM_SOURCES list(APPEND OC_SYSTEM_SOURCES
src/network/C4Network2UPnPWin32.cpp src/network/C4Network2UPnPWin32.cpp
) )
else() elseif(UPNP_STYLE STREQUAL "libupnp")
FIND_PACKAGE(Upnp) list(APPEND OC_SYSTEM_SOURCES
SET(HAVE_UPNP ${UPNP_FOUND}) src/network/C4Network2UPnPLinux.cpp
if(UPNP_FOUND) )
list(APPEND OC_SYSTEM_SOURCES
src/network/C4Network2UPnPLinux.cpp
)
else()
list(APPEND OC_SYSTEM_SOURCES
src/network/C4Network2UPnPDummy.cpp
)
endif()
endif() endif()
if(USE_CONSOLE) if(USE_CONSOLE)
@ -1369,7 +1363,7 @@ if (WIN32)
endif() endif()
endif() endif()
if(HAVE_UPNP) if(UPNP_FOUND)
include_directories(${UPNP_INCLUDE_DIR}) include_directories(${UPNP_INCLUDE_DIR})
target_link_libraries(openclonk ${UPNP_LIBRARIES}) target_link_libraries(openclonk ${UPNP_LIBRARIES})
endif() endif()

View File

@ -1,6 +1,6 @@
# OpenClonk, http://www.openclonk.org # OpenClonk, http://www.openclonk.org
# #
# Copyright (c) 2012-2013, The OpenClonk Team and contributors # Copyright (c) 2012-2015, The OpenClonk Team and contributors
# #
# Distributed under the terms of the ISC license; see accompanying file # Distributed under the terms of the ISC license; see accompanying file
# "COPYING" for details. # "COPYING" for details.
@ -20,20 +20,33 @@
# TODO: Use pkg-config if available # TODO: Use pkg-config if available
find_path(UPNP_INCLUDE_DIR NAMES upnp.h PATH_SUFFIXES upnp) if(WIN32)
set(UPNP_NAMES ${UPNP_NAMES} upnp) CHECK_INCLUDE_FILE_CXX(natupnp.h HAVE_NATIVE_NATUPNP)
set(THREADUTIL_NAMES ${THREADUTIL_NAMES} threadutil) if(NOT HAVE_NATIVE_NATUPNP)
set(IXML_NAMES ${IXML_NAMES} ixml) SET(UPNP_INCLUDE_DIR "thirdparty/natupnp")
find_library(UPNP_LIBRARY NAMES ${UPNP_NAMES}) else()
find_library(THREADUTIL_LIBRARY NAMES ${THREADUTIL_NAMES}) SET(UPNP_INCLUDE_DIR)
find_library(IXML_LIBRARY NAMES ${IXML_NAMES}) endif()
SET(UPNP_LIBRARIES)
SET(UPNP_FOUND TRUE)
SET(UPNP_STYLE "Win32")
else()
find_path(UPNP_INCLUDE_DIR NAMES upnp.h PATH_SUFFIXES upnp)
set(UPNP_NAMES ${UPNP_NAMES} upnp)
set(THREADUTIL_NAMES ${THREADUTIL_NAMES} threadutil)
set(IXML_NAMES ${IXML_NAMES} ixml)
find_library(UPNP_LIBRARY NAMES ${UPNP_NAMES})
find_library(THREADUTIL_LIBRARY NAMES ${THREADUTIL_NAMES})
find_library(IXML_LIBRARY NAMES ${IXML_NAMES})
include(FindPackageHandleStandardArgs) include(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(UPNP DEFAULT_MSG UPNP_LIBRARY THREADUTIL_LIBRARY IXML_LIBRARY UPNP_INCLUDE_DIR) FIND_PACKAGE_HANDLE_STANDARD_ARGS(UPNP DEFAULT_MSG UPNP_LIBRARY THREADUTIL_LIBRARY IXML_LIBRARY UPNP_INCLUDE_DIR)
if(UPNP_FOUND) if(UPNP_FOUND)
set(UPNP_LIBRARIES ${UPNP_LIBRARY} ${THREADUTIL_LIBRARY} ${IXML_LIBRARY}) set(UPNP_LIBRARIES ${UPNP_LIBRARY} ${THREADUTIL_LIBRARY} ${IXML_LIBRARY})
set(UPNP_INCLUDE_DIR ${UPNP_INCLUDE_DIR}) set(UPNP_INCLUDE_DIR ${UPNP_INCLUDE_DIR})
set(UPNP_STYLE "libupnp")
endif()
endif() endif()
mark_as_advanced(UPNP_LIBRARY IXML_LIBRARY UPNP_INCLUDE_DIR) mark_as_advanced(UPNP_LIBRARY IXML_LIBRARY UPNP_INCLUDE_DIR)