From ec77cdd23bc2cde57d3abbf06ce3d51d6a0ea746 Mon Sep 17 00:00:00 2001 From: Ahnaf Tahmid Chowdhury Date: Mon, 24 Nov 2025 13:09:29 +0600 Subject: [PATCH 1/6] use CMakePackageConfigHelpers --- CMakeLists.txt | 24 ++++++++++++++++------ cmake/OpenMCConfig.cmake.in | 33 ++++++++++++++++-------------- cmake/OpenMCConfigVersion.cmake.in | 11 ---------- 3 files changed, 36 insertions(+), 32 deletions(-) delete mode 100644 cmake/OpenMCConfigVersion.cmake.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 87b8789d101..a8d29a50cd5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -580,9 +580,7 @@ add_custom_command(TARGET libopenmc POST_BUILD #=============================================================================== # Install executable, scripts, manpage, license #=============================================================================== - -configure_file(cmake/OpenMCConfig.cmake.in "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/OpenMCConfig.cmake" @ONLY) -configure_file(cmake/OpenMCConfigVersion.cmake.in "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/OpenMCConfigVersion.cmake" @ONLY) +include(CMakePackageConfigHelpers) set(INSTALL_CONFIGDIR ${CMAKE_INSTALL_LIBDIR}/cmake/OpenMC) install(TARGETS openmc libopenmc @@ -596,10 +594,24 @@ install(EXPORT openmc-targets NAMESPACE OpenMC:: DESTINATION ${INSTALL_CONFIGDIR}) +configure_package_config_file( + "cmake/OpenMCConfig.cmake.in" + "${CMAKE_BINARY_DIR}/OpenMCConfig.cmake" + INSTALL_DESTINATION ${INSTALL_CONFIGDIR} +) + +write_basic_package_version_file( + "${CMAKE_BINARY_DIR}/OpenMCConfigVersion.cmake" + VERSION ${PROJECT_VERSION} + COMPATIBILITY AnyNewerVersion +) + install(FILES - "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/OpenMCConfig.cmake" - "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/OpenMCConfigVersion.cmake" - DESTINATION ${INSTALL_CONFIGDIR}) + "${CMAKE_BINARY_DIR}/OpenMCConfig.cmake" + "${CMAKE_BINARY_DIR}/OpenMCConfigVersion.cmake" + DESTINATION "${INSTALL_CONFIGDIR}" +) + install(FILES man/man1/openmc.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) install(FILES LICENSE DESTINATION "${CMAKE_INSTALL_DOCDIR}" RENAME copyright) install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) diff --git a/cmake/OpenMCConfig.cmake.in b/cmake/OpenMCConfig.cmake.in index 837a39c7833..5302309bd6e 100644 --- a/cmake/OpenMCConfig.cmake.in +++ b/cmake/OpenMCConfig.cmake.in @@ -1,14 +1,17 @@ -get_filename_component(OpenMC_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" DIRECTORY) +@PACKAGE_INIT@ -# Compute the install prefix from this file's location -get_filename_component(_OPENMC_PREFIX "${OpenMC_CMAKE_DIR}/../../.." ABSOLUTE) +include("${CMAKE_CURRENT_LIST_DIR}/OpenMCConfigVersion.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/OpenMCTargets.cmake") -find_package(fmt CONFIG REQUIRED HINTS ${_OPENMC_PREFIX}) -find_package(pugixml CONFIG REQUIRED HINTS ${_OPENMC_PREFIX}) -find_package(xtl CONFIG REQUIRED HINTS ${_OPENMC_PREFIX}) -find_package(xtensor CONFIG REQUIRED HINTS ${_OPENMC_PREFIX}) +include(CMakeFindDependencyMacro) + +get_filename_component(_OPENMC_PREFIX "${CMAKE_CURRENT_LIST_DIR}/../../.." ABSOLUTE) +find_dependency(fmt CONFIG REQUIRED HINTS ${_OPENMC_PREFIX}) +find_dependency(pugixml CONFIG REQUIRED HINTS ${_OPENMC_PREFIX}) +find_dependency(xtl CONFIG REQUIRED HINTS ${_OPENMC_PREFIX}) +find_dependency(xtensor CONFIG REQUIRED HINTS ${_OPENMC_PREFIX}) if(@OPENMC_USE_DAGMC@) - find_package(DAGMC REQUIRED HINTS @DAGMC_DIR@) + find_dependency(DAGMC REQUIRED HINTS @DAGMC_DIR@) endif() if(@OPENMC_USE_LIBMESH@) @@ -18,20 +21,20 @@ if(@OPENMC_USE_LIBMESH@) pkg_check_modules(LIBMESH REQUIRED @LIBMESH_PC_FILE@>=1.7.0 IMPORTED_TARGET) endif() -find_package(PNG) - -if(NOT TARGET OpenMC::libopenmc) - include("${OpenMC_CMAKE_DIR}/OpenMCTargets.cmake") -endif() +find_dependency(PNG) if(@OPENMC_USE_MPI@) - find_package(MPI REQUIRED) + find_dependency(MPI REQUIRED) endif() if(@OPENMC_USE_OPENMP@) - find_package(OpenMP REQUIRED) + find_dependency(OpenMP REQUIRED) endif() if(@OPENMC_USE_UWUW@ AND NOT ${DAGMC_BUILD_UWUW}) message(FATAL_ERROR "UWUW is enabled in OpenMC but the DAGMC installation discovered was not configured with UWUW.") endif() + +if(NOT OpenMC_FIND_QUIETLY) + message(STATUS "Found OpenMC: ${PACKAGE_VERSION} (found in ${_OPENMC_PREFIX})") +endif() \ No newline at end of file diff --git a/cmake/OpenMCConfigVersion.cmake.in b/cmake/OpenMCConfigVersion.cmake.in deleted file mode 100644 index 90d345de441..00000000000 --- a/cmake/OpenMCConfigVersion.cmake.in +++ /dev/null @@ -1,11 +0,0 @@ -set(PACKAGE_VERSION "@OPENMC_VERSION@") - -# Check whether the requested PACKAGE_FIND_VERSION is compatible -if("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}") - set(PACKAGE_VERSION_COMPATIBLE FALSE) -else() - set(PACKAGE_VERSION_COMPATIBLE TRUE) - if ("${PACKAGE_VERSION}" VERSION_EQUAL "${PACKAGE_FIND_VERSION}") - set(PACKAGE_VERSION_EXACT TRUE) - endif() -endif() From 179a5914661036691beb86220697a9f20b12f1cc Mon Sep 17 00:00:00 2001 From: Ahnaf Tahmid Chowdhury Date: Mon, 24 Nov 2025 13:46:04 +0600 Subject: [PATCH 2/6] OPENMC_VERSION --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a8d29a50cd5..19581c305e1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -602,7 +602,7 @@ configure_package_config_file( write_basic_package_version_file( "${CMAKE_BINARY_DIR}/OpenMCConfigVersion.cmake" - VERSION ${PROJECT_VERSION} + VERSION ${OPENMC_VERSION} COMPATIBILITY AnyNewerVersion ) From 813a46678bd33922254714bd8cd89057301725b3 Mon Sep 17 00:00:00 2001 From: Ahnaf Tahmid Chowdhury Date: Mon, 24 Nov 2025 15:55:27 +0600 Subject: [PATCH 3/6] NOT TARGET OpenMC::libopenmc --- cmake/OpenMCConfig.cmake.in | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cmake/OpenMCConfig.cmake.in b/cmake/OpenMCConfig.cmake.in index 5302309bd6e..c83f5d83582 100644 --- a/cmake/OpenMCConfig.cmake.in +++ b/cmake/OpenMCConfig.cmake.in @@ -1,7 +1,9 @@ @PACKAGE_INIT@ include("${CMAKE_CURRENT_LIST_DIR}/OpenMCConfigVersion.cmake") -include("${CMAKE_CURRENT_LIST_DIR}/OpenMCTargets.cmake") +if(NOT TARGET OpenMC::libopenmc) + include("${CMAKE_CURRENT_LIST_DIR}/OpenMCTargets.cmake") +endif() include(CMakeFindDependencyMacro) From 75dc169f3f26dc252591768e0c3754b6ebf6775a Mon Sep 17 00:00:00 2001 From: Ahnaf Tahmid Chowdhury Date: Mon, 24 Nov 2025 20:15:55 +0600 Subject: [PATCH 4/6] fix paths --- CMakeLists.txt | 8 ++++---- cmake/OpenMCConfig.cmake.in | 4 +--- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 19581c305e1..59e35fd9ecb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -596,19 +596,19 @@ install(EXPORT openmc-targets configure_package_config_file( "cmake/OpenMCConfig.cmake.in" - "${CMAKE_BINARY_DIR}/OpenMCConfig.cmake" + "${CMAKE_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/OpenMCConfig.cmake" INSTALL_DESTINATION ${INSTALL_CONFIGDIR} ) write_basic_package_version_file( - "${CMAKE_BINARY_DIR}/OpenMCConfigVersion.cmake" + "${CMAKE_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/OpenMCConfigVersion.cmake" VERSION ${OPENMC_VERSION} COMPATIBILITY AnyNewerVersion ) install(FILES - "${CMAKE_BINARY_DIR}/OpenMCConfig.cmake" - "${CMAKE_BINARY_DIR}/OpenMCConfigVersion.cmake" + "${CMAKE_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/OpenMCConfig.cmake" + "${CMAKE_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/OpenMCConfigVersion.cmake" DESTINATION "${INSTALL_CONFIGDIR}" ) diff --git a/cmake/OpenMCConfig.cmake.in b/cmake/OpenMCConfig.cmake.in index c83f5d83582..5302309bd6e 100644 --- a/cmake/OpenMCConfig.cmake.in +++ b/cmake/OpenMCConfig.cmake.in @@ -1,9 +1,7 @@ @PACKAGE_INIT@ include("${CMAKE_CURRENT_LIST_DIR}/OpenMCConfigVersion.cmake") -if(NOT TARGET OpenMC::libopenmc) - include("${CMAKE_CURRENT_LIST_DIR}/OpenMCTargets.cmake") -endif() +include("${CMAKE_CURRENT_LIST_DIR}/OpenMCTargets.cmake") include(CMakeFindDependencyMacro) From dac5a41468dec9777442f302140d7d0956bd973c Mon Sep 17 00:00:00 2001 From: Ahnaf Tahmid Chowdhury Date: Tue, 25 Nov 2025 15:08:08 +0600 Subject: [PATCH 5/6] move target last --- cmake/OpenMCConfig.cmake.in | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/cmake/OpenMCConfig.cmake.in b/cmake/OpenMCConfig.cmake.in index 5302309bd6e..796816f2ae6 100644 --- a/cmake/OpenMCConfig.cmake.in +++ b/cmake/OpenMCConfig.cmake.in @@ -1,15 +1,12 @@ @PACKAGE_INIT@ include("${CMAKE_CURRENT_LIST_DIR}/OpenMCConfigVersion.cmake") -include("${CMAKE_CURRENT_LIST_DIR}/OpenMCTargets.cmake") - include(CMakeFindDependencyMacro) -get_filename_component(_OPENMC_PREFIX "${CMAKE_CURRENT_LIST_DIR}/../../.." ABSOLUTE) -find_dependency(fmt CONFIG REQUIRED HINTS ${_OPENMC_PREFIX}) -find_dependency(pugixml CONFIG REQUIRED HINTS ${_OPENMC_PREFIX}) -find_dependency(xtl CONFIG REQUIRED HINTS ${_OPENMC_PREFIX}) -find_dependency(xtensor CONFIG REQUIRED HINTS ${_OPENMC_PREFIX}) +find_dependency(fmt CONFIG REQUIRED HINTS ${PACKAGE_PREFIX_DIR}) +find_dependency(pugixml CONFIG REQUIRED HINTS ${PACKAGE_PREFIX_DIR}) +find_dependency(xtl CONFIG REQUIRED HINTS ${PACKAGE_PREFIX_DIR}) +find_dependency(xtensor CONFIG REQUIRED HINTS ${PACKAGE_PREFIX_DIR}) if(@OPENMC_USE_DAGMC@) find_dependency(DAGMC REQUIRED HINTS @DAGMC_DIR@) endif() @@ -35,6 +32,8 @@ if(@OPENMC_USE_UWUW@ AND NOT ${DAGMC_BUILD_UWUW}) message(FATAL_ERROR "UWUW is enabled in OpenMC but the DAGMC installation discovered was not configured with UWUW.") endif() +include("${CMAKE_CURRENT_LIST_DIR}/OpenMCTargets.cmake") + if(NOT OpenMC_FIND_QUIETLY) - message(STATUS "Found OpenMC: ${PACKAGE_VERSION} (found in ${_OPENMC_PREFIX})") + message(STATUS "Found OpenMC: ${PACKAGE_VERSION} (found in ${PACKAGE_PREFIX_DIR})") endif() \ No newline at end of file From 03a0f02f9d3e8e78cf031f346741a35f49dd0c28 Mon Sep 17 00:00:00 2001 From: Ahnaf Tahmid Chowdhury Date: Sun, 30 Nov 2025 18:00:52 +0600 Subject: [PATCH 6/6] better handle vendor --- CMakeLists.txt | 33 +++++++++++++++++++++++++++++++++ cmake/OpenMCConfig.cmake.in | 30 ++++++++++++++++++++++++------ 2 files changed, 57 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 59e35fd9ecb..c49546e2f94 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -124,6 +124,7 @@ endmacro() if(OPENMC_USE_DAGMC) find_package(DAGMC REQUIRED PATH_SUFFIXES lib/cmake) + set(OPENMC_DAGMC_DIR ${DAGMC_DIR}) if (${DAGMC_VERSION} VERSION_LESS 3.2.0) message(FATAL_ERROR "Discovered DAGMC Version: ${DAGMC_VERSION}." "Please update DAGMC to version 3.2.0 or greater.") @@ -149,6 +150,7 @@ endif() #=============================================================================== find_package(PNG) +set(OPENMC_USE_PNG ${PNG_FOUND}) #=============================================================================== # HDF5 for binary output @@ -243,11 +245,18 @@ endif() if(OPENMC_FORCE_VENDORED_LIBS) add_subdirectory(vendor/pugixml) set_target_properties(pugixml PROPERTIES CXX_STANDARD 14 CXX_EXTENSIONS OFF) + set(OPENMC_USES_VENDORED_PUGIXML TRUE) + set(OPENMC_PUGIXML_DIR "") else() find_package_write_status(pugixml) if (NOT pugixml_FOUND) add_subdirectory(vendor/pugixml) set_target_properties(pugixml PROPERTIES CXX_STANDARD 14 CXX_EXTENSIONS OFF) + set(OPENMC_USES_VENDORED_PUGIXML TRUE) + set(OPENMC_PUGIXML_DIR "") + else() + set(OPENMC_USES_VENDORED_PUGIXML FALSE) + set(OPENMC_PUGIXML_DIR "${pugixml_DIR}") endif() endif() @@ -258,11 +267,18 @@ endif() if(OPENMC_FORCE_VENDORED_LIBS) set(FMT_INSTALL ON CACHE BOOL "Generate the install target.") add_subdirectory(vendor/fmt) + set(OPENMC_USES_VENDORED_FMT TRUE) + set(OPENMC_FMT_DIR "") else() find_package_write_status(fmt) if (NOT fmt_FOUND) set(FMT_INSTALL ON CACHE BOOL "Generate the install target.") add_subdirectory(vendor/fmt) + set(OPENMC_USES_VENDORED_FMT TRUE) + set(OPENMC_FMT_DIR "") + else() + set(OPENMC_USES_VENDORED_FMT FALSE) + set(OPENMC_FMT_DIR "${fmt_DIR}") endif() endif() @@ -274,12 +290,29 @@ if(OPENMC_FORCE_VENDORED_LIBS) add_subdirectory(vendor/xtl) set(xtl_DIR ${CMAKE_CURRENT_BINARY_DIR}/vendor/xtl) add_subdirectory(vendor/xtensor) + set(OPENMC_USES_VENDORED_XTENSOR TRUE) + set(OPENMC_XTENSOR_DIR "") + set(OPENMC_XTL_DIR "") else() find_package_write_status(xtensor) if (NOT xtensor_FOUND) add_subdirectory(vendor/xtl) set(xtl_DIR ${CMAKE_CURRENT_BINARY_DIR}/vendor/xtl) add_subdirectory(vendor/xtensor) + set(OPENMC_USES_VENDORED_XTENSOR TRUE) + set(OPENMC_XTENSOR_DIR "") + set(OPENMC_XTL_DIR "") + else() + set(OPENMC_USES_VENDORED_XTENSOR FALSE) + set(OPENMC_XTENSOR_DIR "${xtensor_DIR}") + # xtl is a dependency of xtensor, so its DIR should be available too + if(DEFINED xtl_DIR) + set(OPENMC_XTL_DIR "${xtl_DIR}") + else() + # If xtl_DIR isn't set, it's likely in the same prefix as xtensor. + # We'll rely on the xtensor hint to find it. + set(OPENMC_XTL_DIR "${xtensor_DIR}") + endif() endif() endif() diff --git a/cmake/OpenMCConfig.cmake.in b/cmake/OpenMCConfig.cmake.in index 796816f2ae6..c6498676b3c 100644 --- a/cmake/OpenMCConfig.cmake.in +++ b/cmake/OpenMCConfig.cmake.in @@ -3,12 +3,28 @@ include("${CMAKE_CURRENT_LIST_DIR}/OpenMCConfigVersion.cmake") include(CMakeFindDependencyMacro) -find_dependency(fmt CONFIG REQUIRED HINTS ${PACKAGE_PREFIX_DIR}) -find_dependency(pugixml CONFIG REQUIRED HINTS ${PACKAGE_PREFIX_DIR}) -find_dependency(xtl CONFIG REQUIRED HINTS ${PACKAGE_PREFIX_DIR}) -find_dependency(xtensor CONFIG REQUIRED HINTS ${PACKAGE_PREFIX_DIR}) +if (@OPENMC_USES_VENDORED_FMT@) + find_dependency(fmt CONFIG REQUIRED HINTS "${PACKAGE_PREFIX_DIR}") +else() + find_dependency(fmt CONFIG REQUIRED HINTS "@OPENMC_FMT_DIR@") +endif() +if (@OPENMC_USES_VENDORED_PUGIXML@) + find_dependency(pugixml CONFIG REQUIRED HINTS "${PACKAGE_PREFIX_DIR}") +else() + find_dependency(pugixml CONFIG REQUIRED HINTS "@OPENMC_PUGIXML_DIR@") +endif() +if (@OPENMC_USES_VENDORED_XTENSOR@) + find_dependency(xtl CONFIG REQUIRED HINTS "${PACKAGE_PREFIX_DIR}") +else() + find_dependency(xtl CONFIG REQUIRED HINTS "@OPENMC_XTL_DIR@") +endif() +if (@OPENMC_USES_VENDORED_XTENSOR@) + find_dependency(xtensor CONFIG REQUIRED HINTS "${PACKAGE_PREFIX_DIR}") +else() + find_dependency(xtensor CONFIG REQUIRED HINTS "@OPENMC_XTENSOR_DIR@") +endif() if(@OPENMC_USE_DAGMC@) - find_dependency(DAGMC REQUIRED HINTS @DAGMC_DIR@) + find_dependency(DAGMC REQUIRED HINTS @OPENMC_DAGMC_DIR@) endif() if(@OPENMC_USE_LIBMESH@) @@ -18,7 +34,9 @@ if(@OPENMC_USE_LIBMESH@) pkg_check_modules(LIBMESH REQUIRED @LIBMESH_PC_FILE@>=1.7.0 IMPORTED_TARGET) endif() -find_dependency(PNG) +if(@OPENMC_USE_PNG@) + find_dependency(PNG) +endif() if(@OPENMC_USE_MPI@) find_dependency(MPI REQUIRED)