diff --git a/.github/workflows/linux_build_test.yml b/.github/workflows/linux_build_test.yml index 2aaf9ec298..98202fe83f 100644 --- a/.github/workflows/linux_build_test.yml +++ b/.github/workflows/linux_build_test.yml @@ -50,6 +50,9 @@ jobs: 5.4.1, 5.5.1, ] + ddl_deps : [ + off, + ] geant4_version : [ 10.7.4, 11.1.2 @@ -58,6 +61,14 @@ jobs: off, v1.1.0, ] + include: + - ubuntu_version: 22.04 + compiler: gcc + hdf5_version: 1.14.3 + moab_version: 5.4.1 + ddl_deps: on + geant4_version: off + double_down_version: off container: image: ghcr.io/svalinn/dagmc-ci-ubuntu-${{ @@ -88,6 +99,7 @@ jobs: cmake ../ \ -DMOAB_DIR=${moab_install_dir} \ -DBUILD_GEANT4=$([ "${{ matrix.geant4_version }}" != "off" ] && echo "ON" || echo "OFF") \ + -DDDL_INSTALL_DEPS=$([ "${{ matrix.ddl_deps }}" != "on" ] && echo "OFF" || echo "ON -DHDF5_ROOT=${hdf5_install_dir}") \ -DGEANT4_DIR=${geant4_install_dir} \ -DBUILD_CI_TESTS=ON \ -DBUILD_MW_REG_TESTS=OFF \ diff --git a/cmake/DAGMC_macros.cmake b/cmake/DAGMC_macros.cmake index d5b2cd04e9..71fe2a07d0 100644 --- a/cmake/DAGMC_macros.cmake +++ b/cmake/DAGMC_macros.cmake @@ -253,6 +253,11 @@ macro (dagmc_install_library lib_name) EXPORT DAGMCTargets LIBRARY DESTINATION ${INSTALL_LIB_DIR} PUBLIC_HEADER DESTINATION ${INSTALL_INCLUDE_DIR}) + # Required to ensure that MOAB is built before DAGMC and to properly link against MOAB + if(DDL_INSTALL_DEPS) + add_dependencies(${lib_name}-shared MOAB) + target_link_libraries(${lib_name}-shared PUBLIC ${MOAB_LIBRARY_DIRS}/libMOAB${CMAKE_SHARED_LIBRARY_SUFFIX}) + endif() endif () if (BUILD_STATIC_LIBS) diff --git a/cmake/FindMOAB.cmake b/cmake/FindMOAB.cmake index 92602c8917..428ac24624 100644 --- a/cmake/FindMOAB.cmake +++ b/cmake/FindMOAB.cmake @@ -10,15 +10,29 @@ find_path(MOAB_CMAKE_CONFIG PATHS ${MOAB_SEARCH_DIRS} NO_DEFAULT_PATH ) -if (MOAB_CMAKE_CONFIG) + +# First check if we are forcing the download of MOAB +if (DDL_INSTALL_DEPS) + IF(DAGMC_BUILD_STATIC_LIBS) + message(FATAL_ERROR "DDL_INSTALL_DEPS is ONLY compatible with shared libraries.") + ENDIF() + IF(NOT MOAB_VERSION) + # SET(MOAB_VERSION "5.5.1") + SET(MOAB_VERSION "master") + ENDIF() + include(MOAB_PullAndMake) + moab_pull_make(${MOAB_VERSION}) + +# Back to normal behavior +elseif (MOAB_CMAKE_CONFIG) set(MOAB_CMAKE_CONFIG ${MOAB_CMAKE_CONFIG}/MOABConfig.cmake) + include(${MOAB_CMAKE_CONFIG}) message(STATUS "MOAB_CMAKE_CONFIG: ${MOAB_CMAKE_CONFIG}") else () message(FATAL_ERROR "Could not find MOAB. Set -DMOAB_DIR= when running cmake or use the $MOAB_DIR environment variable.") endif () # Find HDF5 -include(${MOAB_CMAKE_CONFIG}) set(ENV{PATH} "${HDF5_DIR}:$ENV{PATH}") set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_SHARED_LIBRARY_SUFFIX}) find_package(HDF5 REQUIRED) @@ -71,7 +85,9 @@ message(STATUS "MOAB_LIBRARY_DIRS: ${MOAB_LIBRARY_DIRS}") message(STATUS "MOAB_LIBRARIES_SHARED: ${MOAB_LIBRARIES_SHARED}") message(STATUS "MOAB_LIBRARIES_STATIC: ${MOAB_LIBRARIES_STATIC}") -if (MOAB_INCLUDE_DIRS AND (MOAB_LIBRARIES_SHARED OR NOT BUILD_SHARED_LIBS) AND +if(DDL_INSTALL_DEPS) + message(STATUS "MOAB will be downloaded and built at make time") +elseif (MOAB_INCLUDE_DIRS AND (MOAB_LIBRARIES_SHARED OR NOT BUILD_SHARED_LIBS) AND (MOAB_LIBRARIES_STATIC OR NOT BUILD_STATIC_LIBS)) message(STATUS "Found MOAB") else () diff --git a/cmake/MOAB_PullAndMake.cmake b/cmake/MOAB_PullAndMake.cmake new file mode 100644 index 0000000000..16c0594bf3 --- /dev/null +++ b/cmake/MOAB_PullAndMake.cmake @@ -0,0 +1,45 @@ +# this Macro sets up the download and build of MOAB using ExternalProject +# few tweak are done in src/dagmc/CMakeLists.txt and src/PyNE/CMakelists.txt +# to make sure that MOAB is built before DAGMC. +MACRO (moab_pull_make moab_version) + message(STATUS "MOAB will be downloaded and built") + include(ExternalProject) + message("HDF5_ROOT: ${HDF5_ROOT}") + SET(MOAB_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}/moab") + set(MOAB_ROOT "${CMAKE_BINARY_DIR}/moab") + set(MOAB_INCLUDE_DIRS "${MOAB_INSTALL_PREFIX}/include") + set(MOAB_LIBRARY_DIRS "${MOAB_INSTALL_PREFIX}/lib") + message("MOAB_LIBRARY_DIRS: ${MOAB_LIBRARY_DIRS}") + MEsSAGE("CMAKE_SHARED_LIBRARY_SUFFIX: ${CMAKE_SHARED_LIBRARY_SUFFIX}") + set(MOAB_LIBRARIES_SHARED "") + ExternalProject_Add(MOAB_ep + PREFIX ${MOAB_ROOT} + GIT_REPOSITORY https://bitbucket.org/fathomteam/moab.git + GIT_TAG ${moab_version} + CMAKE_ARGS + -DCMAKE_INSTALL_PREFIX:PATH= + -DBUILD_SHARED_LIBS:BOOL=ON + -DENABLE_HDF5:BOOL=ON + -DHDF5_ROOT:PATH=${HDF5_ROOT} + -DCMAKE_INSTALL_RPATH=${HDF5_ROOT}/lib:${MOAB_INSTALL_PREFIX}/lib + -DENABLE_BLASLAPACK:BOOL=OFF + -DENABLE_FORTRAN:BOOL=OFF + -DENABLE_PYMOAB:BOOL=OFF + DOWNLOAD_EXTRACT_TIMESTAMP true + BUILD_BYPRODUCTS "${MOAB_LIBRARY_DIRS}/*${CMAKE_SHARED_LIBRARY_SUFFIX}*" + INSTALL_DIR "${MOAB_INSTALL_PREFIX}" + ) + # Setup a interface library for MOAB based on ExternalProoject MOAB_EP + add_library(MOAB INTERFACE) + + target_include_directories(MOAB SYSTEM INTERFACE ${MOAB_INCLUDE_DIRS}) + target_link_libraries(MOAB INTERFACE ${MOAB_LIBRARY_DIRS}/libMOAB${CMAKE_SHARED_LIBRARY_SUFFIX}) + add_dependencies(MOAB MOAB_ep) + install(TARGETS MOAB LIBRARY DESTINATION ${MOAB_LIBRARY_DIRS} + PUBLIC_HEADER DESTINATION ${INSTALL_INCLUDE_DIR}) + include_directories(${MOAB_INCLUDE_DIRS}) + link_directories(${MOAB_LIBRARY_DIRS}) + find_package(Eigen3 REQUIRED NO_MODULE) + include_directories(${EIGEN3_INCLUDE_DIRS}) + +ENDMACRO(moab_pull_make) diff --git a/doc/CHANGELOG.rst b/doc/CHANGELOG.rst index 2a3cd5c061..60029e1a18 100644 --- a/doc/CHANGELOG.rst +++ b/doc/CHANGELOG.rst @@ -21,6 +21,7 @@ Next version * Update github actions to newer versions as necessary (#958) * CMake error message update (#960) * Updated documentation to build dependencies (#963) + * Allow download from cmake and compilation at build time of MOAB (#969) v3.2.3 ==================== diff --git a/src/mcnp/CMakeLists.txt b/src/mcnp/CMakeLists.txt index c4fe947503..7b4dd5f493 100644 --- a/src/mcnp/CMakeLists.txt +++ b/src/mcnp/CMakeLists.txt @@ -18,6 +18,11 @@ add_library(mcnp_funcs OBJECT mcnp_funcs.cpp) message(STATUS "Building object library: meshtal_funcs") add_library(meshtal_funcs OBJECT meshtal_funcs.cpp) +if(DDL_INSTALL_DEPS) + add_dependencies(mcnp_funcs MOAB) + add_dependencies(meshtal_funcs MOAB) +endif() + if (BUILD_MCNP5) add_subdirectory(mcnp5) endif ()