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

Reply via email to