Hello,
Please find attached a patch which implements the following changes to the
CMake build configuration:
* Set the output directory for runtime target files (executables and DLLs)
to bin/ subdirectory of the project's binary directory to avoid collisions
when Gecode is used as a subproject.
* Improve suppression of warnings.
* Add GECODE_USE_QT variable which specifies whether to use Qt. Qt is used
if GECODE_USE_QT is TRUE or unset.
* Prevent linker warnings on MSVC.
* Use per-target instead of global include directories. This simplifies use
of Gecode as a subproject because add_target_libraries(<target>
<gecode-lib>) now sets the necessary include directories for <target> in
addition to link dependencies.
* Fix by Tony Kelman to fully link internal dependencies needed for
creating DLLs: https://github.com/ampl/gecode/pull/2
Best regards,
Victor
Index: CMakeLists.txt
===================================================================
--- CMakeLists.txt (revision 14214)
+++ CMakeLists.txt (working copy)
@@ -41,26 +41,21 @@
project(GECODE)
-include_directories(${CMAKE_CURRENT_BINARY_DIR})
-include_directories(${CMAKE_CURRENT_SOURCE_DIR})
+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)
include(CheckCXXCompilerFlag)
if (GECODE_DISABLE_WARNINGS)
- if (CMAKE_COMPILER_IS_GNUCXX)
- add_definitions(-Wno-overloaded-virtual)
- add_definitions(-Wno-switch)
- add_definitions(-Wno-unused-parameter)
- check_cxx_compiler_flag(
- -Wno-unused-but-set-variable HAVE_WNO_UNUSED_BUT_SET_VARIABLE_FLAG)
- if (HAVE_WNO_UNUSED_BUT_SET_VARIABLE_FLAG)
- add_definitions(-Wno-unused-but-set-variable)
+ if (MSVC)
+ add_definitions(/wd4244 /wd4267 /wd4345 /wd4355 /wd4800)
+ else ()
+ foreach (flag -Wextra -Wall -pedantic)
+ string(REPLACE ${flag} "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
+ endforeach ()
+ if (CMAKE_COMPILER_IS_GNUCXX)
+ add_definitions(-Wno-overloaded-virtual)
+ elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
+ add_definitions(-Wno-constant-logical-operand -Wno-switch)
endif ()
- elseif (MSVC)
- foreach (flag_var
- CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
- CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
- string(REPLACE "/W3" "/w" ${flag_var} "${${flag_var}}")
- endforeach()
endif ()
endif ()
@@ -207,22 +202,25 @@
set(GECODE_THREADS_PTHREADS 1)
endif ()
-find_package(Qt5 QUIET COMPONENTS Core Gui Widgets PrintSupport)
-if (Qt5_FOUND)
- set(GECODE_HAS_QT "/**/")
- set(GECODE_HAS_GIST "/**/")
- set(EXTRA_LIBS gist)
- set(CMAKE_AUTOMOC TRUE)
-else()
- find_package(Qt4)
- if (QT4_FOUND)
- set(GECODE_HAS_QT "/**/")
- set(GECODE_HAS_GIST "/**/")
- set(EXTRA_LIBS gist)
- set(CMAKE_AUTOMOC TRUE)
- include(${QT_USE_FILE})
+# Don't use Qt if GECODE_USE_QT is set to FALSE.
+if (NOT DEFINED GECODE_USE_QT OR GECODE_USE_QT)
+ find_package(Qt5 QUIET COMPONENTS Core Gui Widgets PrintSupport)
+ if (Qt5_FOUND)
+ set(GECODE_HAS_QT "/**/")
+ set(GECODE_HAS_GIST "/**/")
+ set(EXTRA_LIBS gist)
+ set(CMAKE_AUTOMOC TRUE)
+ else()
+ find_package(Qt4)
+ if (QT4_FOUND)
+ set(GECODE_HAS_QT "/**/")
+ set(GECODE_HAS_GIST "/**/")
+ set(EXTRA_LIBS gist)
+ set(CMAKE_AUTOMOC TRUE)
+ include(${QT_USE_FILE})
+ endif()
endif()
-endif()
+endif ()
include(CheckSymbolExists)
check_symbol_exists(getpagesize unistd.h HAVE_GETPAGESIZE)
@@ -362,11 +360,18 @@
string(TOUPPER ${lib} libupper)
endif ()
if (${libupper}SRC)
- set(sources ${${libupper}SRC})
- if (${libupper}_GENSRC)
- set(sources ${sources} ${${libupper}_GENSRC})
- endif()
+ set(sources )
+ foreach (src ${${libupper}SRC} ${${libupper}_GENSRC})
+ if ((src STREQUAL "gecode/support/thread/pthreads.cpp" AND MSVC) OR
+ src STREQUAL "gecode/float/rounding.cpp")
+ # ignore empty source files to prevent linker warnings
+ else ()
+ set(sources ${sources} ${src})
+ endif ()
+ endforeach ()
add_library(gecode${lib} ${sources} ${${libupper}HDR})
+ target_include_directories(gecode${lib}
+ PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
endif ()
endforeach ()
@@ -375,8 +380,11 @@
target_link_libraries(gecodekernel gecodesupport)
target_link_libraries(gecodesearch gecodekernel)
target_link_libraries(gecodeint gecodekernel)
-target_link_libraries(gecodeset gecodekernel)
+target_link_libraries(gecodeset gecodeint)
+target_link_libraries(gecodefloat gecodeint)
target_link_libraries(gecodeminimodel gecodeint gecodeset gecodesearch)
+target_link_libraries(gecodedriver gecodeint)
+target_link_libraries(gecodeflatzinc gecodeminimodel gecodedriver)
if (GECODE_HAS_QT)
if (Qt5_FOUND)
_______________________________________________
Gecode users mailing list
[email protected]
https://www.gecode.org/mailman/listinfo/gecode-users