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 users@gecode.org https://www.gecode.org/mailman/listinfo/gecode-users