22# CMake build script for Gecode.
33#
44
5- cmake_minimum_required (VERSION 3.8.0 )
5+ cmake_minimum_required (VERSION 3.21 )
66
77project (GECODE LANGUAGES C CXX )
88
9- set (CMAKE_CXX_STANDARD 17)
10- set (CMAKE_CXX_STANDARD_REQUIRED ON )
119set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR } /bin)
1210list (APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR } /misc/cmake_modules)
1311
14- if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.11.0)
15- cmake_policy (SET CMP0072 NEW )
16- set (OpenGL_GL_PREFERENCE LEGACY)
17- endif ()
18- if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.17.0)
19- cmake_policy (SET CMP0100 NEW )
20- endif ()
12+ # Keep this preference to preserve existing Gist/OpenGL linkage behavior.
13+ set (OpenGL_GL_PREFERENCE LEGACY)
2114
2215# ---------------------------------------------------------------------------
2316# Build options (configure/autoconf parity-oriented)
@@ -46,9 +39,6 @@ option(GECODE_BUILD_STATIC "Build static libraries" OFF)
4639
4740option (GECODE_ENABLE_THREAD "Enable thread support" ON )
4841option (GECODE_ENABLE_QT "Enable Qt support" ON )
49- set (GECODE_QT_DETECTION "cmake" CACHE STRING
50- "Qt detection policy: cmake or autoconf" )
51- set_property (CACHE GECODE_QT_DETECTION PROPERTY STRINGS cmake autoconf)
5242option (GECODE_ENABLE_GIST "Enable Gist" ON )
5343option (GECODE_ENABLE_CPPROFILER "Enable CPProfiler support" ON )
5444option (GECODE_ENABLE_CBS "Enable counting-based search support" OFF )
@@ -67,6 +57,7 @@ option(GECODE_ENABLE_ALLOCATOR "Enable default allocator" ON)
6757option (GECODE_ENABLE_AUDIT "Enable audit code" OFF )
6858option (GECODE_ENABLE_GCC_VISIBILITY "Enable GCC visibility attributes" ON )
6959option (GECODE_ENABLE_OSX_UNFAIR_MUTEX "Enable macOS unfair mutexes" ON )
60+ option (GECODE_REGENERATE_VARIMP "Regenerate checked-in var-imp headers during build" OFF )
7061set (GECODE_FREELIST32_SIZE_MAX "" CACHE STRING "Max freelist size on 32-bit platforms" )
7162set (GECODE_FREELIST64_SIZE_MAX "" CACHE STRING "Max freelist size on 64-bit platforms" )
7263set (GECODE_WITH_VIS "" CACHE STRING "Additional .vis files (comma-separated)" )
@@ -116,88 +107,39 @@ if(GECODE_ENABLE_EXAMPLES)
116107endif ()
117108
118109include (CheckCXXCompilerFlag )
110+ set (GECODE_VISIBILITY_COMPILE_OPTION)
119111if (GECODE_ENABLE_GCC_VISIBILITY)
120112 check_cxx_compiler_flag (-fvisibility=hidden HAVE_VISIBILITY_HIDDEN_FLAG )
121113 if (HAVE_VISIBILITY_HIDDEN_FLAG)
122- add_compile_options ( -fvisibility=hidden )
114+ set (GECODE_VISIBILITY_COMPILE_OPTION -fvisibility=hidden)
123115 endif ()
124116endif ()
125117
126- find_package (Perl REQUIRED )
118+ if (GECODE_REGENERATE_VARIMP)
119+ find_package (Perl REQUIRED )
120+ endif ()
127121
128122if (GECODE_ENABLE_MPFR)
129123 find_package (MPFR )
130124endif ()
131125
132126set (GECODE_HAS_QT_RUNTIME FALSE )
133- string (TOLOWER "${GECODE_QT_DETECTION} " GECODE_QT_DETECTION_MODE)
134- if (NOT GECODE_QT_DETECTION_MODE STREQUAL "cmake"
135- AND NOT GECODE_QT_DETECTION_MODE STREQUAL "autoconf" )
136- message (FATAL_ERROR
137- "GECODE_QT_DETECTION must be one of: cmake, autoconf" )
138- endif ()
127+ set (GECODE_QT_CORE)
128+ set (GECODE_QT_WIDGETS)
139129if (GECODE_ENABLE_QT)
140- set (GECODE_QT_PROBE_ALLOWED TRUE )
141- if (GECODE_QT_DETECTION_MODE STREQUAL "autoconf" )
142- find_program (GECODE_QMAKE_EXECUTABLE NAMES qmake-qt4 qmake )
143- find_program (GECODE_MOC_EXECUTABLE NAMES moc-qt4 moc )
144- if (NOT GECODE_QMAKE_EXECUTABLE OR NOT GECODE_MOC_EXECUTABLE)
145- set (GECODE_QT_PROBE_ALLOWED FALSE )
146- message (STATUS
147- "GECODE_QT_DETECTION=autoconf: qmake or moc not found, disabling Qt" )
148- else ()
149- execute_process (
150- COMMAND "${GECODE_QMAKE_EXECUTABLE} " -query QT_VERSION
151- OUTPUT_VARIABLE GECODE_QMAKE_QT_VERSION
152- OUTPUT_STRIP_TRAILING_WHITESPACE
153- ERROR_QUIET
154- RESULT_VARIABLE GECODE_QMAKE_QT_VERSION_RESULT )
155- if (NOT GECODE_QMAKE_QT_VERSION_RESULT EQUAL 0)
156- set (GECODE_QT_PROBE_ALLOWED FALSE )
157- message (STATUS
158- "GECODE_QT_DETECTION=autoconf: unable to query Qt version from qmake, disabling Qt" )
159- elseif (NOT GECODE_QMAKE_QT_VERSION MATCHES "^([0-9]+)\\ .([0-9]+)" )
160- set (GECODE_QT_PROBE_ALLOWED FALSE )
161- message (STATUS
162- "GECODE_QT_DETECTION=autoconf: invalid Qt version from qmake, disabling Qt" )
163- else ()
164- set (GECODE_QT_MAJOR "${CMAKE_MATCH_1} " )
165- set (GECODE_QT_MINOR "${CMAKE_MATCH_2} " )
166- if (GECODE_QT_MAJOR LESS 4 OR
167- (GECODE_QT_MAJOR EQUAL 4 AND GECODE_QT_MINOR LESS 3))
168- set (GECODE_QT_PROBE_ALLOWED FALSE )
169- message (STATUS
170- "GECODE_QT_DETECTION=autoconf: Qt ${GECODE_QMAKE_QT_VERSION} is too old (< 4.3), disabling Qt" )
171- endif ()
172- endif ()
173- endif ()
130+ find_package (QT NAMES Qt6 Qt5 QUIET COMPONENTS Core Gui Widgets PrintSupport )
131+ if (QT_FOUND)
132+ find_package (Qt${QT_VERSION_MAJOR} QUIET COMPONENTS Core Gui Widgets PrintSupport )
174133 endif ()
175134
176- if (GECODE_QT_PROBE_ALLOWED)
177- find_package (Qt6 QUIET COMPONENTS Core Gui Widgets PrintSupport )
178- if (Qt6_FOUND)
179- set (GECODE_HAS_QT_RUNTIME TRUE )
180- set (GECODE_QT_CORE Qt6::Core)
181- set (GECODE_QT_WIDGETS Qt6::Widgets Qt6::Gui Qt6::PrintSupport)
182- set (CMAKE_AUTOMOC TRUE )
183- else ()
184- find_package (Qt5 QUIET COMPONENTS Core Gui Widgets PrintSupport )
185- if (Qt5_FOUND)
186- set (GECODE_HAS_QT_RUNTIME TRUE )
187- set (GECODE_QT_CORE Qt5::Core)
188- set (GECODE_QT_WIDGETS Qt5::Widgets Qt5::Gui Qt5::PrintSupport)
189- set (CMAKE_AUTOMOC TRUE )
190- else ()
191- find_package (Qt4 QUIET )
192- if (QT4_FOUND)
193- include (${QT_USE_FILE} )
194- set (GECODE_HAS_QT_RUNTIME TRUE )
195- set (GECODE_QT_CORE ${QT_LIBRARIES} )
196- set (GECODE_QT_WIDGETS ${QT_LIBRARIES} )
197- set (CMAKE_AUTOMOC TRUE )
198- endif ()
199- endif ()
200- endif ()
135+ if (TARGET Qt6::Core)
136+ set (GECODE_HAS_QT_RUNTIME TRUE )
137+ set (GECODE_QT_CORE Qt6::Core)
138+ set (GECODE_QT_WIDGETS Qt6::Widgets Qt6::Gui Qt6::PrintSupport)
139+ elseif (TARGET Qt5::Core)
140+ set (GECODE_HAS_QT_RUNTIME TRUE )
141+ set (GECODE_QT_CORE Qt5::Core)
142+ set (GECODE_QT_WIDGETS Qt5::Widgets Qt5::Gui Qt5::PrintSupport)
201143 endif ()
202144endif ()
203145
@@ -459,36 +401,46 @@ foreach(vis ${GECODE_VIS_FILES})
459401endforeach()
460402string (JOIN "||" GECODE_VIS_FILES_SERIALIZED ${GECODE_VIS_FILES_FOR_GEN} )
461403
462- set(GECODE_VAR_TYPE_HPP ${CMAKE_CURRENT_SOURCE_DIR } /gecode/kernel/var-type.hpp)
463- set(GECODE_VAR_IMP_HPP ${CMAKE_CURRENT_SOURCE_DIR } /gecode/kernel/var-imp.hpp)
464-
465- add_custom_command(
466- OUTPUT ${GECODE_VAR_TYPE_HPP}
467- COMMAND ${CMAKE_COMMAND }
468- -DPERL_EXECUTABLE=${PERL_EXECUTABLE}
469- -DGENVARIMP=${CMAKE_CURRENT_SOURCE_DIR } /misc/genvarimp.perl
470- -DMODE=-typehpp
471- -DOUT_FILE=${GECODE_VAR_TYPE_HPP}
472- -DVIS_FILES_SERIALIZED=${GECODE_VIS_FILES_SERIALIZED}
473- -P ${CMAKE_CURRENT_SOURCE_DIR } /cmake/GenerateVarImp.cmake
474- DEPENDS ${GECODE_VIS_DEPENDS} ${CMAKE_CURRENT_SOURCE_DIR } /misc/genvarimp.perl ${CMAKE_CURRENT_SOURCE_DIR } /CMakeLists.txt ${CMAKE_CURRENT_SOURCE_DIR } /configure.ac
475- WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR }
476- VERBATIM
477- )
478- add_custom_command(
479- OUTPUT ${GECODE_VAR_IMP_HPP}
480- COMMAND ${CMAKE_COMMAND }
481- -DPERL_EXECUTABLE=${PERL_EXECUTABLE}
482- -DGENVARIMP=${CMAKE_CURRENT_SOURCE_DIR } /misc/genvarimp.perl
483- -DMODE=-header
484- -DOUT_FILE=${GECODE_VAR_IMP_HPP}
485- -DVIS_FILES_SERIALIZED=${GECODE_VIS_FILES_SERIALIZED}
486- -P ${CMAKE_CURRENT_SOURCE_DIR } /cmake/GenerateVarImp.cmake
487- DEPENDS ${GECODE_VIS_DEPENDS} ${CMAKE_CURRENT_SOURCE_DIR } /misc/genvarimp.perl ${CMAKE_CURRENT_SOURCE_DIR } /CMakeLists.txt ${CMAKE_CURRENT_SOURCE_DIR } /configure.ac
488- WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR }
489- VERBATIM
490- )
491- add_custom_target(gecode-varimp-gen DEPENDS ${GECODE_VAR_TYPE_HPP} ${GECODE_VAR_IMP_HPP} )
404+ set(GECODE_VAR_TYPE_HPP_SOURCE ${CMAKE_CURRENT_SOURCE_DIR } /gecode/kernel/var-type.hpp)
405+ set(GECODE_VAR_IMP_HPP_SOURCE ${CMAKE_CURRENT_SOURCE_DIR } /gecode/kernel/var-imp.hpp)
406+ set(GECODE_VAR_TYPE_HPP ${GECODE_VAR_TYPE_HPP_SOURCE} )
407+ set(GECODE_VAR_IMP_HPP ${GECODE_VAR_IMP_HPP_SOURCE} )
408+
409+ if(GECODE_REGENERATE_VARIMP)
410+ set(GECODE_VAR_TYPE_HPP ${CMAKE_CURRENT_BINARY_DIR } /gecode/kernel/var-type.hpp)
411+ set(GECODE_VAR_IMP_HPP ${CMAKE_CURRENT_BINARY_DIR } /gecode/kernel/var-imp.hpp)
412+ file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR } /gecode/kernel" )
413+
414+ add_custom_command(
415+ OUTPUT ${GECODE_VAR_TYPE_HPP}
416+ COMMAND ${CMAKE_COMMAND }
417+ -DPERL_EXECUTABLE=${PERL_EXECUTABLE}
418+ -DGENVARIMP=${CMAKE_CURRENT_SOURCE_DIR } /misc/genvarimp.perl
419+ -DMODE=-typehpp
420+ -DOUT_FILE=${GECODE_VAR_TYPE_HPP}
421+ -DVIS_FILES_SERIALIZED=${GECODE_VIS_FILES_SERIALIZED}
422+ -P ${CMAKE_CURRENT_SOURCE_DIR } /cmake/GenerateVarImp.cmake
423+ DEPENDS ${GECODE_VIS_DEPENDS} ${CMAKE_CURRENT_SOURCE_DIR } /misc/genvarimp.perl ${CMAKE_CURRENT_SOURCE_DIR } /CMakeLists.txt ${CMAKE_CURRENT_SOURCE_DIR } /configure.ac
424+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR }
425+ VERBATIM
426+ )
427+ add_custom_command(
428+ OUTPUT ${GECODE_VAR_IMP_HPP}
429+ COMMAND ${CMAKE_COMMAND }
430+ -DPERL_EXECUTABLE=${PERL_EXECUTABLE}
431+ -DGENVARIMP=${CMAKE_CURRENT_SOURCE_DIR } /misc/genvarimp.perl
432+ -DMODE=-header
433+ -DOUT_FILE=${GECODE_VAR_IMP_HPP}
434+ -DVIS_FILES_SERIALIZED=${GECODE_VIS_FILES_SERIALIZED}
435+ -P ${CMAKE_CURRENT_SOURCE_DIR } /cmake/GenerateVarImp.cmake
436+ DEPENDS ${GECODE_VIS_DEPENDS} ${CMAKE_CURRENT_SOURCE_DIR } /misc/genvarimp.perl ${CMAKE_CURRENT_SOURCE_DIR } /CMakeLists.txt ${CMAKE_CURRENT_SOURCE_DIR } /configure.ac
437+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR }
438+ VERBATIM
439+ )
440+ add_custom_target(gecode-varimp-gen DEPENDS ${GECODE_VAR_TYPE_HPP} ${GECODE_VAR_IMP_HPP} )
441+ else()
442+ add_custom_target(gecode-varimp-gen)
443+ endif()
492444
493445# ---------------------------------------------------------------------------
494446# Target creation helpers
@@ -541,11 +493,15 @@ function(add_gecode_component_library lib)
541493 if(GECODE_BUILD_SHARED)
542494 add_library(gecode${lib} _shared SHARED ${sources} )
543495 target_compile_definitions(gecode${lib} _shared PRIVATE GECODE_BUILD_${libupper} )
496+ target_compile_features(gecode${lib} _shared PUBLIC cxx_std_17)
544497 target_include_directories(gecode${lib} _shared
545498 PUBLIC
546499 $<BUILD_INTERFACE :${CMAKE_CURRENT_BINARY_DIR } >
547500 $<BUILD_INTERFACE :${CMAKE_CURRENT_SOURCE_DIR } >
548501 $<INSTALL_INTERFACE :${CMAKE_INSTALL_INCLUDEDIR} >)
502+ if(GECODE_VISIBILITY_COMPILE_OPTION)
503+ target_compile_options(gecode${lib} _shared PRIVATE ${GECODE_VISIBILITY_COMPILE_OPTION} )
504+ endif()
549505 set_target_properties(gecode${lib} _shared PROPERTIES
550506 OUTPUT_NAME gecode${lib}
551507 VERSION ${GECODE_PROJECT_VERSION}
@@ -560,11 +516,15 @@ function(add_gecode_component_library lib)
560516 if(GECODE_BUILD_STATIC)
561517 add_library(gecode${lib} _static STATIC ${sources} )
562518 target_compile_definitions(gecode${lib} _static PRIVATE GECODE_BUILD_${libupper} )
519+ target_compile_features(gecode${lib} _static PUBLIC cxx_std_17)
563520 target_include_directories(gecode${lib} _static
564521 PUBLIC
565522 $<BUILD_INTERFACE :${CMAKE_CURRENT_BINARY_DIR } >
566523 $<BUILD_INTERFACE :${CMAKE_CURRENT_SOURCE_DIR } >
567524 $<INSTALL_INTERFACE :${CMAKE_INSTALL_INCLUDEDIR} >)
525+ if(GECODE_VISIBILITY_COMPILE_OPTION)
526+ target_compile_options(gecode${lib} _static PRIVATE ${GECODE_VISIBILITY_COMPILE_OPTION} )
527+ endif()
568528 set_target_properties(gecode${lib} _static PROPERTIES OUTPUT_NAME gecode${lib} )
569529 add_dependencies(gecode${lib} _static gecode-varimp-gen)
570530 list(APPEND GECODE_INSTALL_TARGETS gecode${lib} _static)
@@ -593,6 +553,12 @@ function(gecode_link_component comp)
593553 endforeach()
594554endfunction()
595555
556+ function(gecode_enable_automoc_if_exists target_name)
557+ if(TARGET ${target_name} )
558+ set_target_properties(${target_name} PROPERTIES AUTOMOC ON )
559+ endif()
560+ endfunction()
561+
596562foreach(component ${GECODE_LIBRARY_COMPONENTS} )
597563 add_gecode_component_library(${component} )
598564endforeach()
@@ -617,8 +583,12 @@ if(GECODE_ENABLE_FLOAT_VARS)
617583 if(GECODE_ENABLE_MPFR AND MPFR_FOUND)
618584 foreach(kind shared static)
619585 if(TARGET gecodefloat_${kind} )
620- target_link_libraries(gecodefloat_${kind} PUBLIC ${MPFR_LIBRARIES} )
621- target_include_directories(gecodefloat_${kind} PRIVATE ${MPFR_INCLUDES} )
586+ if(TARGET MPFR::MPFR)
587+ target_link_libraries(gecodefloat_${kind} PUBLIC MPFR::MPFR)
588+ else()
589+ target_link_libraries(gecodefloat_${kind} PUBLIC ${MPFR_LIBRARIES} )
590+ target_include_directories(gecodefloat_${kind} PRIVATE ${MPFR_INCLUDES} )
591+ endif()
622592 endif()
623593 endforeach()
624594 endif()
@@ -641,6 +611,8 @@ if(GECODE_ENABLE_DRIVER)
641611 gecode_link_component(driver ${driver_deps} )
642612endif()
643613if(GECODE_BUILD_GIST_TARGET)
614+ gecode_enable_automoc_if_exists(gecodegist_shared)
615+ gecode_enable_automoc_if_exists(gecodegist_static)
644616 foreach(kind shared static)
645617 if(TARGET gecodegist_${kind} )
646618 target_link_libraries(gecodegist_${kind} PUBLIC ${GECODE_QT_WIDGETS} )
@@ -806,6 +778,10 @@ install(DIRECTORY gecode
806778
807779install(FILES ${PROJECT_BINARY_DIR } /gecode/support/config.hpp
808780 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} /gecode/support/)
781+ if(GECODE_REGENERATE_VARIMP)
782+ install(FILES ${GECODE_VAR_TYPE_HPP} ${GECODE_VAR_IMP_HPP}
783+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} /gecode/kernel/)
784+ endif()
809785
810786if(GECODE_ENABLE_FLATZINC)
811787 install(DIRECTORY gecode/flatzinc/mznlib/
0 commit comments