Skip to content

Commit c70f923

Browse files
committed
Modernized CMake and removed contribs
1 parent d2aea37 commit c70f923

95 files changed

Lines changed: 600 additions & 19684 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/build.yml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ jobs:
4545
fail-fast: false
4646
matrix:
4747
os: [macos-latest, ubuntu-latest]
48-
qt_detection: [cmake, autoconf]
4948

5049
steps:
5150
- uses: actions/checkout@v4
@@ -66,7 +65,6 @@ jobs:
6665
run: >
6766
cmake $GITHUB_WORKSPACE
6867
-DCMAKE_BUILD_TYPE=$BUILD_TYPE
69-
-DGECODE_QT_DETECTION=${{ matrix.qt_detection }}
7068
7169
- name: Build
7270
working-directory: ${{github.workspace}}/build

CMakeLists.txt

Lines changed: 88 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,15 @@
22
# CMake build script for Gecode.
33
#
44

5-
cmake_minimum_required(VERSION 3.8.0)
5+
cmake_minimum_required(VERSION 3.21)
66

77
project(GECODE LANGUAGES C CXX)
88

9-
set(CMAKE_CXX_STANDARD 17)
10-
set(CMAKE_CXX_STANDARD_REQUIRED ON)
119
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)
1210
list(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

4740
option(GECODE_ENABLE_THREAD "Enable thread support" ON)
4841
option(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)
5242
option(GECODE_ENABLE_GIST "Enable Gist" ON)
5343
option(GECODE_ENABLE_CPPROFILER "Enable CPProfiler support" ON)
5444
option(GECODE_ENABLE_CBS "Enable counting-based search support" OFF)
@@ -67,6 +57,7 @@ option(GECODE_ENABLE_ALLOCATOR "Enable default allocator" ON)
6757
option(GECODE_ENABLE_AUDIT "Enable audit code" OFF)
6858
option(GECODE_ENABLE_GCC_VISIBILITY "Enable GCC visibility attributes" ON)
6959
option(GECODE_ENABLE_OSX_UNFAIR_MUTEX "Enable macOS unfair mutexes" ON)
60+
option(GECODE_REGENERATE_VARIMP "Regenerate checked-in var-imp headers during build" OFF)
7061
set(GECODE_FREELIST32_SIZE_MAX "" CACHE STRING "Max freelist size on 32-bit platforms")
7162
set(GECODE_FREELIST64_SIZE_MAX "" CACHE STRING "Max freelist size on 64-bit platforms")
7263
set(GECODE_WITH_VIS "" CACHE STRING "Additional .vis files (comma-separated)")
@@ -116,88 +107,39 @@ if(GECODE_ENABLE_EXAMPLES)
116107
endif()
117108

118109
include(CheckCXXCompilerFlag)
110+
set(GECODE_VISIBILITY_COMPILE_OPTION)
119111
if(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()
124116
endif()
125117

126-
find_package(Perl REQUIRED)
118+
if(GECODE_REGENERATE_VARIMP)
119+
find_package(Perl REQUIRED)
120+
endif()
127121

128122
if(GECODE_ENABLE_MPFR)
129123
find_package(MPFR)
130124
endif()
131125

132126
set(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)
139129
if(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()
202144
endif()
203145

@@ -459,36 +401,46 @@ foreach(vis ${GECODE_VIS_FILES})
459401
endforeach()
460402
string(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()
594554
endfunction()
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+
596562
foreach(component ${GECODE_LIBRARY_COMPONENTS})
597563
add_gecode_component_library(${component})
598564
endforeach()
@@ -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})
642612
endif()
643613
if(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

807779
install(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

810786
if(GECODE_ENABLE_FLATZINC)
811787
install(DIRECTORY gecode/flatzinc/mznlib/

0 commit comments

Comments
 (0)