OpenMC/CMakeLists.txt

318 lines
10 KiB
Text
Raw Normal View History

cmake_minimum_required(VERSION 3.3 FATAL_ERROR)
project(openmc C CXX)
2013-11-29 13:36:06 -05:00
# Setup output directories
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
# Set module path
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules)
2013-11-29 13:36:06 -05:00
#===============================================================================
# Command line options
#===============================================================================
2017-04-10 07:32:51 -05:00
option(openmp "Enable shared-memory parallelism with OpenMP" ON)
2013-11-29 13:36:06 -05:00
option(profile "Compile with profiling flags" OFF)
option(debug "Compile with debug flags" OFF)
option(optimize "Turn on all compiler optimization flags" OFF)
option(coverage "Compile with coverage analysis flags" OFF)
option(dagmc "Enable support for DAGMC (CAD) geometry" OFF)
2013-11-29 13:36:06 -05:00
#===============================================================================
# MPI for distributed-memory parallelism
2013-11-29 13:36:06 -05:00
#===============================================================================
set(MPI_ENABLED FALSE)
2019-02-21 15:49:58 -06:00
if($ENV{CXX} MATCHES "(mpi[^/]*|CC)$")
message(STATUS "Detected MPI wrapper: $ENV{CXX}")
set(MPI_ENABLED TRUE)
2013-11-29 13:36:06 -05:00
endif()
#===============================================================================
# DAGMC Geometry Support - need DAGMC/MOAB
#===============================================================================
if(dagmc)
find_package(DAGMC REQUIRED)
link_directories(${DAGMC_LIBRARY_DIRS})
endif()
#===============================================================================
# HDF5 for binary output
#===============================================================================
# Allow user to specify HDF5_ROOT
if (NOT (CMAKE_VERSION VERSION_LESS 3.12))
cmake_policy(SET CMP0074 NEW)
endif()
# Unfortunately FindHDF5.cmake will always prefer a serial HDF5 installation
# over a parallel installation if both appear on the user's PATH. To get around
# this, we check for the environment variable HDF5_ROOT and if it exists, use it
# to check whether its a parallel version.
if(NOT DEFINED HDF5_PREFER_PARALLEL)
if(DEFINED ENV{HDF5_ROOT} AND EXISTS $ENV{HDF5_ROOT}/bin/h5pcc)
set(HDF5_PREFER_PARALLEL TRUE)
else()
set(HDF5_PREFER_PARALLEL FALSE)
endif()
endif()
find_package(HDF5 REQUIRED COMPONENTS C HL)
if(HDF5_IS_PARALLEL)
if(NOT MPI_ENABLED)
message(FATAL_ERROR "Parallel HDF5 must be used with MPI.")
endif()
message(STATUS "Using parallel HDF5")
endif()
2013-11-29 13:36:06 -05:00
#===============================================================================
# Set compile/link flags based on which compiler is being used
#===============================================================================
if(openmp)
# Requires CMake 3.1+
find_package(OpenMP)
if(OPENMP_FOUND)
list(APPEND cxxflags ${OpenMP_CXX_FLAGS})
list(APPEND ldflags ${OpenMP_CXX_FLAGS})
endif()
endif()
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
list(APPEND cxxflags -O2)
2017-12-01 16:45:28 -05:00
if(debug)
list(REMOVE_ITEM cxxflags -O2)
list(APPEND cxxflags -g -O0)
endif()
if(profile)
2019-03-25 21:55:22 -05:00
list(APPEND cxxflags -g -fno-omit-frame-pointer)
2017-12-01 16:45:28 -05:00
endif()
if(optimize)
list(REMOVE_ITEM cxxflags -O2)
list(APPEND cxxflags -O3)
endif()
2017-04-10 07:26:48 -05:00
# Show flags being used
2019-03-25 21:55:22 -05:00
message(STATUS "OpenMC C++ flags: ${cxxflags}")
message(STATUS "OpenMC Linker flags: ${ldflags}")
2017-04-10 07:26:48 -05:00
2013-11-29 13:36:06 -05:00
#===============================================================================
2017-02-24 15:19:31 -06:00
# pugixml library
2013-11-29 13:36:06 -05:00
#===============================================================================
2018-06-20 10:56:28 -05:00
add_library(pugixml vendor/pugixml/pugixml.cpp)
target_include_directories(pugixml PUBLIC vendor/pugixml/)
2013-11-29 13:36:06 -05:00
#===============================================================================
# xtensor header-only library
#===============================================================================
add_subdirectory(vendor/xtl)
add_subdirectory(vendor/xtensor)
target_link_libraries(xtensor INTERFACE xtl)
#===============================================================================
# RPATH information
#===============================================================================
# This block of code ensures that dynamic libraries can be found via the RPATH
# whether the executable is the original one from the build directory or the
# installed one in CMAKE_INSTALL_PREFIX. Ref:
# https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/RPATH-handling
# use, i.e. don't skip the full RPATH for the build tree
set(CMAKE_SKIP_BUILD_RPATH FALSE)
# when building, don't use the install RPATH already
# (but later on when installing)
set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
# add the automatically determined parts of the RPATH
# which point to directories outside the build tree to the install RPATH
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
# the RPATH to be used when installing, but only if it's not a system directory
list(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/lib" isSystemDir)
if("${isSystemDir}" STREQUAL "-1")
2019-03-25 21:55:22 -05:00
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
endif()
2016-02-01 12:27:51 -06:00
#===============================================================================
# faddeeva library
2016-02-01 12:27:51 -06:00
#===============================================================================
add_library(faddeeva STATIC vendor/faddeeva/Faddeeva.cc)
target_include_directories(faddeeva PUBLIC vendor/faddeeva/)
target_compile_options(faddeeva PRIVATE ${cxxflags})
2016-02-01 12:27:51 -06:00
2013-11-29 13:36:06 -05:00
#===============================================================================
# libopenmc
2013-11-29 13:36:06 -05:00
#===============================================================================
add_library(libopenmc SHARED
2018-11-15 08:13:14 -06:00
src/bank.cpp
src/bremsstrahlung.cpp
src/dagmc.cpp
src/cell.cpp
2018-11-10 12:11:42 -05:00
src/cmfd_solver.cpp
src/cross_sections.cpp
src/distribution.cpp
2018-07-09 17:04:48 -05:00
src/distribution_angle.cpp
2018-07-09 14:47:08 -05:00
src/distribution_energy.cpp
src/distribution_multi.cpp
src/distribution_spatial.cpp
2018-08-30 14:22:55 -05:00
src/eigenvalue.cpp
src/endf.cpp
2018-10-10 07:50:30 -05:00
src/error.cpp
2018-04-20 06:38:16 -05:00
src/initialize.cpp
2018-04-26 07:03:40 -05:00
src/finalize.cpp
2018-08-14 16:22:40 -04:00
src/geometry.cpp
2018-05-11 17:20:25 -04:00
src/geometry_aux.cpp
src/hdf5_interface.cpp
2018-02-04 23:15:32 -05:00
src/lattice.cpp
2018-08-15 16:08:32 -04:00
src/material.cpp
src/math_functions.cpp
2018-08-28 06:59:39 -05:00
src/mesh.cpp
src/message_passing.cpp
src/mgxs.cpp
src/mgxs_interface.cpp
2018-07-17 06:43:35 -05:00
src/nuclide.cpp
2018-08-14 19:04:05 -04:00
src/output.cpp
src/particle.cpp
2019-02-14 12:43:05 -06:00
src/particle_restart.cpp
2018-11-15 15:55:05 -06:00
src/photon.cpp
2018-11-17 09:24:31 -06:00
src/physics.cpp
2018-10-07 07:18:29 -04:00
src/physics_common.cpp
src/physics_mg.cpp
src/plot.cpp
src/position.cpp
2018-10-29 18:02:00 -05:00
src/progress_bar.cpp
src/random_lcg.cpp
2018-07-11 07:01:54 -05:00
src/reaction.cpp
2018-07-10 22:49:37 -05:00
src/reaction_product.cpp
src/scattdata.cpp
2018-07-10 15:32:18 -05:00
src/secondary_correlated.cpp
2018-07-10 07:36:46 -05:00
src/secondary_kalbach.cpp
2018-07-09 23:26:05 -05:00
src/secondary_nbody.cpp
2018-07-09 23:02:27 -05:00
src/secondary_uncorrelated.cpp
2018-08-06 21:31:30 -05:00
src/settings.cpp
2018-04-12 07:45:47 -05:00
src/simulation.cpp
2018-07-17 06:43:35 -05:00
src/source.cpp
src/state_point.cpp
src/string_utils.cpp
src/summary.cpp
2018-01-23 22:26:48 -05:00
src/surface.cpp
2019-01-26 12:10:18 -05:00
src/tallies/derivative.cpp
src/tallies/filter.cpp
src/tallies/filter_azimuthal.cpp
src/tallies/filter_cellborn.cpp
src/tallies/filter_cellfrom.cpp
src/tallies/filter_cell.cpp
2018-10-28 15:52:01 -04:00
src/tallies/filter_delayedgroup.cpp
src/tallies/filter_distribcell.cpp
src/tallies/filter_energyfunc.cpp
src/tallies/filter_energy.cpp
src/tallies/filter_legendre.cpp
src/tallies/filter_material.cpp
src/tallies/filter_mesh.cpp
src/tallies/filter_meshsurface.cpp
src/tallies/filter_mu.cpp
2018-10-28 16:26:22 -04:00
src/tallies/filter_particle.cpp
src/tallies/filter_polar.cpp
src/tallies/filter_sph_harm.cpp
src/tallies/filter_sptl_legendre.cpp
src/tallies/filter_surface.cpp
src/tallies/filter_universe.cpp
src/tallies/filter_zernike.cpp
src/tallies/tally.cpp
src/tallies/tally_scoring.cpp
src/tallies/trigger.cpp
src/timer.cpp
src/thermal.cpp
2019-02-19 22:06:20 -06:00
src/track_output.cpp
src/urr.cpp
2019-02-06 21:47:08 -06:00
src/volume_calc.cpp
2018-12-26 07:24:21 -06:00
src/wmp.cpp
src/xml_interface.cpp
2018-12-26 07:24:21 -06:00
src/xsdata.cpp)
2018-04-24 06:42:43 -05:00
set_target_properties(libopenmc PROPERTIES
OUTPUT_NAME openmc)
target_include_directories(libopenmc
PUBLIC include ${HDF5_INCLUDE_DIRS})
2019-02-21 15:49:58 -06:00
# Set compile flags
target_compile_options(libopenmc PRIVATE ${cxxflags})
2017-12-01 16:45:28 -05:00
if (HDF5_IS_PARALLEL)
target_compile_definitions(libopenmc PRIVATE -DPHDF5)
endif()
if (MPI_ENABLED)
target_compile_definitions(libopenmc PUBLIC -DOPENMC_MPI)
endif()
# Set git SHA1 hash as a compile definition
execute_process(COMMAND git rev-parse HEAD
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
RESULT_VARIABLE GIT_SHA1_SUCCESS
OUTPUT_VARIABLE GIT_SHA1
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
if(GIT_SHA1_SUCCESS EQUAL 0)
target_compile_definitions(libopenmc PRIVATE -DGIT_SHA1="${GIT_SHA1}")
endif()
# target_link_libraries treats any arguments starting with - but not -l as
# linker flags. Thus, we can pass both linker flags and libraries together.
target_link_libraries(libopenmc ${ldflags} ${HDF5_LIBRARIES} ${HDF5_HL_LIBRARIES}
pugixml faddeeva xtensor)
if(dagmc)
target_compile_definitions(libopenmc PRIVATE DAGMC)
target_link_libraries(libopenmc ${DAGMC_LIBRARIES})
target_include_directories(libopenmc PRIVATE ${DAGMC_INCLUDE_DIRS})
endif()
#===============================================================================
# openmc executable
#===============================================================================
add_executable(openmc src/main.cpp)
target_compile_options(openmc PRIVATE ${cxxflags})
target_link_libraries(openmc libopenmc)
# Ensure C++14 standard is used. Starting with CMake 3.8, another way this could
# be done is using the cxx_std_14 compiler feature.
set_target_properties(
openmc libopenmc faddeeva pugixml
PROPERTIES CXX_STANDARD 14 CXX_EXTENSIONS OFF)
#===============================================================================
# Python package
#===============================================================================
add_custom_command(TARGET libopenmc POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
$<TARGET_FILE:libopenmc>
2017-09-14 12:52:37 -05:00
${CMAKE_CURRENT_SOURCE_DIR}/openmc/capi/$<TARGET_FILE_NAME:libopenmc>
COMMENT "Copying libopenmc to Python module directory")
#===============================================================================
# Install executable, scripts, manpage, license
#===============================================================================
install(TARGETS openmc libopenmc
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
2018-04-24 06:42:43 -05:00
ARCHIVE DESTINATION lib
)
install(DIRECTORY src/relaxng DESTINATION share/openmc)
install(FILES man/man1/openmc.1 DESTINATION share/man/man1)
install(FILES LICENSE DESTINATION "share/doc/openmc" RENAME copyright)
install(DIRECTORY include/ DESTINATION include)