From d8ce07a6cc1ec0a9acf803bf73beb97c3bd58609 Mon Sep 17 00:00:00 2001 From: Priyanka Chowdhury Date: Tue, 5 Mar 2024 10:47:08 +0100 Subject: [PATCH 1/5] Fix CMake package discovery and streamline library setup. - Resolved CMake package discovery issue for external projects. - Refactored library setup for improved modularity and organization. - Enhanced installation process with proper targets. - Added support for C++17 features in the library. - Created a CMake export for the library interface to facilitate external use. --- CMakeLists.txt | 106 ++++++++++++++++++++++++++--------- cmake/gecode-config.cmake.in | 2 + 2 files changed, 81 insertions(+), 27 deletions(-) create mode 100644 cmake/gecode-config.cmake.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 3f7803ec30..84c78ce3aa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -341,11 +341,24 @@ foreach (lib support kernel search int set float set(sources ${sources} ${src}) endif () endforeach () - add_library(gecode${lib} ${sources} ${${libupper}HDR}) - target_include_directories(gecode${lib} - PUBLIC ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ) - list(APPEND GECODE_INSTALL_TARGETS gecode${lib}) + add_library(${lib} ${sources} ${${libupper}HDR}) + # target_include_directories(${lib} + # PUBLIC ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ) + target_include_directories(${lib} + PUBLIC + $ + $ + $ + ) + list(APPEND GECODE_INSTALL_TARGETS ${lib}) endif () + # Install the binaries + install(TARGETS ${lib} EXPORT gecode-targets + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + RUNTIME DESTINATION bin + ) + target_compile_features(${lib} PUBLIC cxx_std_17) endforeach () option(ENABLE_CPPROFILER "Enable cpprofiler tracer mode" ON) @@ -354,45 +367,55 @@ if(ENABLE_CPPROFILER) endif() find_package(Threads) -target_link_libraries(gecodesupport ${CMAKE_THREAD_LIBS_INIT}) -target_link_libraries(gecodekernel gecodesupport) -target_link_libraries(gecodesearch gecodekernel) -target_link_libraries(gecodeint 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) +target_link_libraries(support ${CMAKE_THREAD_LIBS_INIT}) +target_link_libraries(kernel support) +target_link_libraries(search kernel) +target_link_libraries(int kernel) +target_link_libraries(set int) +target_link_libraries(float int) +target_link_libraries(minimodel int set search) +target_link_libraries(driver int) +target_link_libraries(flatzinc minimodel driver) +message(STATUS "Qt5 Core found: ${Qt5Core_FOUND}") +message(STATUS "Qt5 Widgets found: ${Qt5Widgets_FOUND}") +message(STATUS "Qt5 Gui found: ${Qt5Gui_FOUND}") +message(STATUS "Qt5 PrintSupport found: ${Qt5PrintSupport_FOUND}") + +get_target_property(QT_CORE_LIB Qt5::Core LOCATION) +message(STATUS "Qt5::Core library: ${QT_CORE_LIB}") +get_target_property(FLATZINC_LINK_LIBRARIES flatzinc INTERFACE_LINK_LIBRARIES) +message(STATUS "gecode::flatzinc link libraries: ${FLATZINC_LINK_LIBRARIES}") if (GECODE_HAS_QT) if (Qt6_FOUND) - target_link_libraries(gecodegist Qt6::Widgets Qt6::Gui Qt6::PrintSupport) - target_link_libraries(gecodeflatzinc Qt6::Core) - target_link_libraries(gecodeflatzinc gecodegist) + target_link_libraries(gist Qt6::Widgets Qt6::Gui Qt6::PrintSupport) + target_link_libraries(flatzinc Qt6::Core) + target_link_libraries(flatzinc gist) + elseif (Qt5_FOUND) - target_link_libraries(gecodegist Qt5::Widgets Qt5::Gui Qt5::PrintSupport) - target_link_libraries(gecodeflatzinc Qt5::Core) - target_link_libraries(gecodeflatzinc gecodegist) + target_link_libraries(gist PUBLIC Qt5::Widgets Qt5::Gui Qt5::PrintSupport) + target_link_libraries(flatzinc Qt5::Core) + target_link_libraries(flatzinc gist) else() - target_link_libraries(gecodegist ${QT_LIBRARIES}) - target_link_libraries(gecodeflatzinc gecodegist ${QT_LIBRARIES}) + target_link_libraries(gist ${QT_LIBRARIES}) + target_link_libraries(flatzinc gist ${QT_LIBRARIES}) endif() endif () if (FLOATSRC) - target_link_libraries(gecodefloat gecodekernel) - target_link_libraries(gecodeminimodel gecodefloat) + target_link_libraries(float kernel) + target_link_libraries(minimodel float) if (MPFR_FOUND) - target_link_libraries(gecodefloat ${MPFR_LIBRARIES}) - target_include_directories(gecodefloat PRIVATE ${MPFR_INCLUDES}) + target_link_libraries(float ${MPFR_LIBRARIES}) + target_include_directories(float PRIVATE ${MPFR_INCLUDES}) endif () endif () add_executable(gecode-test EXCLUDE_FROM_ALL ${TESTSRC} ${TESTHDR}) -target_link_libraries(gecode-test gecodeflatzinc gecodeminimodel) +target_link_libraries(gecode-test flatzinc minimodel) add_executable(fzn-gecode ${FLATZINCEXESRC}) -target_link_libraries(fzn-gecode gecodeflatzinc gecodeminimodel gecodedriver) +target_link_libraries(fzn-gecode flatzinc minimodel driver) list(APPEND GECODE_INSTALL_TARGETS fzn-gecode) set(prefix ${CMAKE_INSTALL_PREFIX}) @@ -487,3 +510,32 @@ if (GECODE_HAS_GIST) DESTINATION share/minizinc/solvers ) endif() + + + # Export the library interface + install(EXPORT gecode-targets + NAMESPACE gecode:: + DESTINATION lib/cmake/gecode + ) + if(GECODE_HAS_GIST) + if (Qt6_FOUND) + set(QT_DEPENDENCY "find_package(Qt6 QUIET COMPONENTS Core Gui Widgets PrintSupport)") + elseif (Qt5_FOUND) + set(QT_DEPENDENCY "find_package(Qt5 QUIET COMPONENTS Core Gui Widgets PrintSupport)") + else() + set(QT_DEPENDENCY "find_package(Qt4)") + + endif() + endif() + + configure_file( + ${CMAKE_SOURCE_DIR}/cmake/gecode-config.cmake.in + ${CMAKE_BINARY_DIR}/gecode-config.cmake + @ONLY + ) + install( + FILES + ${CMAKE_BINARY_DIR}/gecode-config.cmake + DESTINATION + lib/cmake/gecode + ) \ No newline at end of file diff --git a/cmake/gecode-config.cmake.in b/cmake/gecode-config.cmake.in new file mode 100644 index 0000000000..afacc82734 --- /dev/null +++ b/cmake/gecode-config.cmake.in @@ -0,0 +1,2 @@ +@QT_DEPENDENCY@ +include("${CMAKE_CURRENT_LIST_DIR}/gecode-targets.cmake") From c6d4df0748a009af4c731e68b4d328f73489c9e4 Mon Sep 17 00:00:00 2001 From: Priyanka Chowdhury Date: Wed, 6 Mar 2024 12:40:35 +0100 Subject: [PATCH 2/5] remove global setting of CMAKE_CXX_STANDARD 17 --- CMakeLists.txt | 3 --- 1 file changed, 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 84c78ce3aa..c53a1c9235 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,9 +37,6 @@ cmake_minimum_required(VERSION 3.8.0) project(GECODE) -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED ON) - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin) list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/misc/cmake_modules) From 941dc90ce67e4551960ac20f9407b89d56670668 Mon Sep 17 00:00:00 2001 From: Priyanka Chowdhury Date: Thu, 14 Mar 2024 09:24:48 +0100 Subject: [PATCH 3/5] added set_target_properties --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index c53a1c9235..0e4f1893b3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -356,6 +356,7 @@ foreach (lib support kernel search int set float RUNTIME DESTINATION bin ) target_compile_features(${lib} PUBLIC cxx_std_17) + set_target_properties(${lib} PROPERTIES OUTPUT_NAME gecode_${lib}) endforeach () option(ENABLE_CPPROFILER "Enable cpprofiler tracer mode" ON) From d6e7d8c3e124b7eba5726a6335a631840755197d Mon Sep 17 00:00:00 2001 From: Priyanka Chowdhury Date: Fri, 15 Mar 2024 12:03:33 +0100 Subject: [PATCH 4/5] remove debugging outputs --- CMakeLists.txt | 9 --------- 1 file changed, 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0e4f1893b3..364198b6d1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -374,15 +374,6 @@ target_link_libraries(float int) target_link_libraries(minimodel int set search) target_link_libraries(driver int) target_link_libraries(flatzinc minimodel driver) -message(STATUS "Qt5 Core found: ${Qt5Core_FOUND}") -message(STATUS "Qt5 Widgets found: ${Qt5Widgets_FOUND}") -message(STATUS "Qt5 Gui found: ${Qt5Gui_FOUND}") -message(STATUS "Qt5 PrintSupport found: ${Qt5PrintSupport_FOUND}") - -get_target_property(QT_CORE_LIB Qt5::Core LOCATION) -message(STATUS "Qt5::Core library: ${QT_CORE_LIB}") -get_target_property(FLATZINC_LINK_LIBRARIES flatzinc INTERFACE_LINK_LIBRARIES) -message(STATUS "gecode::flatzinc link libraries: ${FLATZINC_LINK_LIBRARIES}") if (GECODE_HAS_QT) if (Qt6_FOUND) From 00f572f68faa7f7a51a05cf351a4ab2cd405fff8 Mon Sep 17 00:00:00 2001 From: Priyanka Chowdhury Date: Wed, 27 Mar 2024 12:13:38 +0100 Subject: [PATCH 5/5] adapted to requested changes --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 364198b6d1..56603dea78 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -356,7 +356,7 @@ foreach (lib support kernel search int set float RUNTIME DESTINATION bin ) target_compile_features(${lib} PUBLIC cxx_std_17) - set_target_properties(${lib} PROPERTIES OUTPUT_NAME gecode_${lib}) + set_target_properties(${lib} PROPERTIES OUTPUT_NAME gecode${lib}) endforeach () option(ENABLE_CPPROFILER "Enable cpprofiler tracer mode" ON)