2019-10-10 20:54:53 +08:00
|
|
|
######################################################################
|
|
|
|
# CMake version and policies
|
|
|
|
######################################################################
|
2021-08-26 13:25:32 +08:00
|
|
|
cmake_minimum_required(VERSION 3.15.0)
|
2019-10-10 20:54:53 +08:00
|
|
|
|
2019-11-08 03:07:02 +08:00
|
|
|
# CMP0074: CMake find_package will use <PackageName>_ROOT CMake variable
|
2019-10-17 03:58:42 +08:00
|
|
|
# and environment variable in search path.
|
|
|
|
# various Find<Package>.cmake modules may not follow this policy
|
2019-11-08 03:07:02 +08:00
|
|
|
# CMP0075: check_include_file_cxx and other follow CMAKE_REQUIRED_LIBRARIES
|
|
|
|
# when doing link check
|
2020-11-05 09:12:08 +08:00
|
|
|
cmake_policy(SET CMP0074 NEW)
|
|
|
|
cmake_policy(SET CMP0075 NEW)
|
2013-12-18 04:00:01 +08:00
|
|
|
|
2005-11-18 01:29:59 +08:00
|
|
|
######################################################################
|
2021-08-26 13:39:25 +08:00
|
|
|
# QMCPACK project
|
2005-11-18 01:29:59 +08:00
|
|
|
######################################################################
|
2021-06-06 02:36:41 +08:00
|
|
|
project(
|
|
|
|
qmcpack
|
|
|
|
VERSION 3.11.9
|
|
|
|
LANGUAGES C CXX)
|
2005-11-03 06:23:38 +08:00
|
|
|
|
2021-08-26 12:58:31 +08:00
|
|
|
#--------------------------------------------------------------------
|
|
|
|
# Directory where customize cmake files reside
|
|
|
|
#--------------------------------------------------------------------
|
|
|
|
set(PROJECT_CMAKE ${qmcpack_SOURCE_DIR}/CMake)
|
|
|
|
list(APPEND CMAKE_MODULE_PATH ${PROJECT_CMAKE})
|
|
|
|
include(macros)
|
|
|
|
|
2014-11-14 05:21:32 +08:00
|
|
|
######################################################################
|
2021-08-26 12:58:31 +08:00
|
|
|
# Build and install options
|
2014-11-14 05:21:32 +08:00
|
|
|
######################################################################
|
2021-08-26 12:58:31 +08:00
|
|
|
|
|
|
|
#--------------------------------------------------------------------
|
|
|
|
# Set C++ standard
|
|
|
|
#--------------------------------------------------------------------
|
2021-08-26 11:42:51 +08:00
|
|
|
set(QMC_CXX_STANDARD
|
|
|
|
17
|
|
|
|
CACHE STRING "QMCPACK C++ language standard")
|
|
|
|
if(NOT QMC_CXX_STANDARD EQUAL 17)
|
|
|
|
message(WARNING "C++17 is the only language standard officially supported by this QMCPACK version. "
|
|
|
|
"Using other versions of the C++ standard is unsupported and done entirely at user's own risk.")
|
2021-06-06 02:36:41 +08:00
|
|
|
endif()
|
2017-02-10 04:25:41 +08:00
|
|
|
|
2021-08-26 12:58:31 +08:00
|
|
|
#--------------------------------------------------------------------
|
2021-08-26 11:42:51 +08:00
|
|
|
# Programmind model related build options
|
|
|
|
# MPI, OpenMP, GPU acceleration
|
2021-08-26 12:58:31 +08:00
|
|
|
#--------------------------------------------------------------------
|
|
|
|
include(CMakeDependentOption)
|
2021-08-26 11:42:51 +08:00
|
|
|
option(QMC_MPI "Enable/disable MPI" ON)
|
|
|
|
option(QMC_OMP "Enable/disable OpenMP" ON)
|
|
|
|
option(QMC_COMPLEX "Build for complex binary" OFF)
|
|
|
|
option(QMC_CUDA "Build with GPU support through CUDA" OFF)
|
|
|
|
option(
|
|
|
|
ENABLE_CUDA
|
|
|
|
"Build with the second generation of GPU support through CUDA (production quality for AFQMC, experimental for real space)"
|
|
|
|
OFF)
|
|
|
|
option(QMC_CUDA2HIP "Map all CUDA kernels and library calls to HIP" OFF)
|
|
|
|
if(QMC_CUDA2HIP)
|
|
|
|
set(ENABLE_ROCM ON) # option(ENABLE_ROCM) will be no-op
|
2021-06-06 02:36:41 +08:00
|
|
|
endif()
|
2021-08-26 11:42:51 +08:00
|
|
|
# explicit HIP source codes only exist in AFQMC.
|
|
|
|
option(ENABLE_HIP "Build with with GPU support through explicit HIP source code" OFF)
|
|
|
|
option(ENABLE_ROCM "Build with with GPU support through ROCM libraries" OFF)
|
|
|
|
option(ENABLE_OFFLOAD "Enable OpenMP offload" OFF)
|
|
|
|
# Use CMake object library targets to workaround clang linker not being able to handle fat
|
|
|
|
# binary archives which contain both host and device codes, for example OpenMP offload regions.
|
|
|
|
# CMake does not propagate indirect object files by design.
|
|
|
|
# So the dependency must be explicitly specified with USE_OBJECT_TARGET.
|
|
|
|
cmake_dependent_option(USE_OBJECT_TARGET "Use CMake object library target" OFF "ENABLE_OFFLOAD" OFF)
|
2020-01-11 01:11:21 +08:00
|
|
|
|
2021-08-26 11:42:51 +08:00
|
|
|
if(ENABLE_CUDA AND QMC_CUDA)
|
|
|
|
message(FATAL_ERROR "ENABLE_CUDA=ON and QMC_CUDA=ON can not be set together!")
|
|
|
|
endif(ENABLE_CUDA AND QMC_CUDA)
|
2020-01-11 01:11:21 +08:00
|
|
|
|
2021-08-26 12:58:31 +08:00
|
|
|
#--------------------------------------------------------------------
|
|
|
|
# Set compiler-time parameters
|
2020-01-24 05:33:50 +08:00
|
|
|
# WALKER_MAX_PROPERTIES max number of observables + 12 or so standard
|
2021-09-01 00:14:21 +08:00
|
|
|
# properties. Properties such forces are per particle so you may need this
|
|
|
|
# to be rather large. Each property increases walker size by
|
2020-01-24 05:33:50 +08:00
|
|
|
# sizeof(FULLPRECREALTYPE)
|
2006-11-24 07:00:56 +08:00
|
|
|
# OHMMS_DIM = dimension of the problem
|
|
|
|
# OHMMS_INDEXTYPE = type of index
|
|
|
|
# OHMMS_PRECISION = base precision, float, double etc
|
2016-10-07 01:57:10 +08:00
|
|
|
# OHMMS_PRECISION_FULL = full precision, double etc
|
2021-08-26 12:58:31 +08:00
|
|
|
#--------------------------------------------------------------------
|
2021-06-06 02:36:41 +08:00
|
|
|
set(WALKER_MAX_PROPERTIES
|
|
|
|
2048
|
|
|
|
CACHE STRING "Maximum number of properties tracked by walkers")
|
|
|
|
mark_as_advanced(WALKER_MAX_PROPERTIES)
|
|
|
|
set(OHMMS_DIM
|
|
|
|
3
|
|
|
|
CACHE STRING "Select physical dimension")
|
|
|
|
set(OHMMS_INDEXTYPE int)
|
|
|
|
set(OHMMS_PRECISION_FULL double)
|
|
|
|
|
2021-08-26 13:25:32 +08:00
|
|
|
if(QMC_VERBOSE_CONFIGURATION)
|
|
|
|
message(WARNING "QMC_VERBOSE_CONFIGURATION option has been removed. Use --log-level=VERBOSE cmake option instead.")
|
|
|
|
endif()
|
2021-08-26 11:42:51 +08:00
|
|
|
|
2021-08-26 12:58:31 +08:00
|
|
|
#--------------------------------------------------------------------
|
|
|
|
message(STATUS "Defining the float point precision")
|
|
|
|
#--------------------------------------------------------------------
|
2021-06-06 02:36:41 +08:00
|
|
|
if(QMC_CUDA)
|
2021-08-26 12:58:31 +08:00
|
|
|
option(QMC_MIXED_PRECISION "Enable/disable mixed precision" ON)
|
2021-06-06 02:36:41 +08:00
|
|
|
set(OHMMS_PRECISION double)
|
|
|
|
set(CUDA_PRECISION_FULL double)
|
|
|
|
if(QMC_MIXED_PRECISION)
|
|
|
|
set(CUDA_PRECISION float)
|
|
|
|
else(QMC_MIXED_PRECISION)
|
|
|
|
set(CUDA_PRECISION double)
|
|
|
|
endif(QMC_MIXED_PRECISION)
|
|
|
|
message(" Base precision = ${OHMMS_PRECISION}")
|
|
|
|
message(" Full precision = ${OHMMS_PRECISION_FULL}")
|
|
|
|
message(" CUDA base precision = ${CUDA_PRECISION}")
|
|
|
|
message(" CUDA full precision = ${CUDA_PRECISION_FULL}")
|
|
|
|
else(QMC_CUDA)
|
2021-08-26 12:58:31 +08:00
|
|
|
option(QMC_MIXED_PRECISION "Enable/disable mixed precision" OFF)
|
2021-06-06 02:36:41 +08:00
|
|
|
if(QMC_MIXED_PRECISION)
|
|
|
|
set(OHMMS_PRECISION float)
|
2021-08-26 12:58:31 +08:00
|
|
|
set(MIXED_PRECISION ON)
|
2021-06-06 02:36:41 +08:00
|
|
|
else(QMC_MIXED_PRECISION)
|
|
|
|
set(OHMMS_PRECISION double)
|
|
|
|
endif(QMC_MIXED_PRECISION)
|
|
|
|
message(" Base precision = ${OHMMS_PRECISION}")
|
|
|
|
message(" Full precision = ${OHMMS_PRECISION_FULL}")
|
|
|
|
endif(QMC_CUDA)
|
2008-04-11 11:04:10 +08:00
|
|
|
|
2021-08-26 12:58:31 +08:00
|
|
|
#--------------------------------------------------------------------
|
|
|
|
# Set debug printout
|
2012-02-18 01:37:16 +08:00
|
|
|
# DEBUG_PSIBUFFER_ON keep track buffer's locator
|
2021-08-26 12:58:31 +08:00
|
|
|
#--------------------------------------------------------------------
|
|
|
|
option(PRINT_DEBUG "Enable/disable debug printing" OFF)
|
|
|
|
option(DEBUG_PSIBUFFER_ON "Debug messages for PSIBUFFER locator" OFF)
|
2021-06-06 02:36:41 +08:00
|
|
|
mark_as_advanced(DEBUG_PSIBUFFER_ON)
|
2021-08-26 12:58:31 +08:00
|
|
|
option(DEBUG_PER_STEP_ACCEPT_REJECT "Print accepts and rejects at each step" OFF)
|
2021-06-06 02:36:41 +08:00
|
|
|
mark_as_advanced(DEBUG_PER_STEP_ACCEPT_REJECT)
|
2005-11-17 11:38:21 +08:00
|
|
|
|
2021-08-26 12:58:31 +08:00
|
|
|
#--------------------------------------------------------------------
|
|
|
|
# Set build feature options
|
|
|
|
#--------------------------------------------------------------------
|
|
|
|
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_TOOLCHAIN_FILE)
|
|
|
|
set(CMAKE_BUILD_TYPE Release)
|
|
|
|
endif()
|
|
|
|
string(TOUPPER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE)
|
|
|
|
message(STATUS "CMAKE_BUILD_TYPE is ${CMAKE_BUILD_TYPE}")
|
2008-05-13 22:48:20 +08:00
|
|
|
|
2021-08-26 12:58:31 +08:00
|
|
|
option(QMC_BUILD_SANDBOX_ONLY "Build only applications in Sandbox directory" OFF)
|
|
|
|
option(ENABLE_GCOV "Enable code coverage" OFF)
|
2021-06-06 02:36:41 +08:00
|
|
|
option(BUILD_UNIT_TESTS "Build unit tests" ON)
|
|
|
|
option(BUILD_MICRO_BENCHMARKS "Build micro benchmarks" ON)
|
|
|
|
option(BUILD_LMYENGINE_INTERFACE "Build LMY engine" ON)
|
|
|
|
if(QMC_CUDA AND BUILD_LMYENGINE_INTERFACE)
|
|
|
|
message(STATUS "LMY engine is not compatible with CUDA build! Disabling LMY engine")
|
|
|
|
set(BUILD_LMYENGINE_INTERFACE OFF)
|
|
|
|
endif()
|
|
|
|
if(MIXED_PRECISION AND BUILD_LMYENGINE_INTERFACE)
|
|
|
|
message(STATUS "LMY engine is not compatible with CPU mixed precision build! Disabling LMY engine")
|
|
|
|
set(BUILD_LMYENGINE_INTERFACE OFF)
|
|
|
|
endif()
|
|
|
|
option(BUILD_AFQMC "Build with AFQMC" OFF)
|
|
|
|
option(BUILD_AFQMC_WITH_NCCL "Build AFQMC with NCCL library." OFF)
|
2019-03-28 11:39:50 +08:00
|
|
|
# AFQMC requires MPI.
|
2021-06-06 02:36:41 +08:00
|
|
|
if(BUILD_AFQMC AND NOT QMC_MPI)
|
|
|
|
message(FATAL_ERROR "AFQMC requires building with MPI (QMC_MPI=1). Set BUILD_AFQMC=0 or configure MPI.")
|
|
|
|
endif()
|
|
|
|
option(BUILD_FCIQMC "Build with FCIQMC" OFF)
|
|
|
|
option(QMC_BUILD_STATIC "Link to static libraries" OFF)
|
|
|
|
option(ENABLE_TIMERS "Enable internal timers" ON)
|
|
|
|
option(ENABLE_STACKTRACE "Enable use of boost::stacktrace" OFF)
|
|
|
|
option(USE_VTUNE_API "Enable use of VTune ittnotify APIs" OFF)
|
|
|
|
cmake_dependent_option(USE_VTUNE_TASKS "USE VTune ittnotify task annotation" OFF "ENABLE_TIMERS AND USE_VTUNE_API" OFF)
|
2021-02-24 00:05:41 +08:00
|
|
|
# CMake note - complex conditionals in cmake_dependent_option must have spaces around parentheses
|
2021-06-06 02:36:41 +08:00
|
|
|
cmake_dependent_option(USE_NVTX_API "Enable/disable NVTX regions in CUDA code." OFF
|
|
|
|
"ENABLE_TIMERS AND ( QMC_CUDA OR ENABLE_CUDA )" OFF)
|
2021-08-26 12:58:31 +08:00
|
|
|
set(HAVE_EINSPLINE 1) # to be removed
|
|
|
|
option(QMC_EXP_THREADING "Experimental non openmp threading models" OFF)
|
|
|
|
mark_as_advanced(QMC_EXP_THREADING)
|
2005-11-17 11:38:21 +08:00
|
|
|
|
2021-08-26 12:58:31 +08:00
|
|
|
#--------------------------------------------------------------------
|
2021-03-23 05:31:57 +08:00
|
|
|
# Sanitizer options
|
2021-08-26 12:58:31 +08:00
|
|
|
#--------------------------------------------------------------------
|
2021-03-23 05:31:57 +08:00
|
|
|
|
|
|
|
# Add optional sanitizers ASAN, UBSAN, MSAN
|
2021-06-06 02:36:41 +08:00
|
|
|
set(VALID_SANITIZERS "none" "asan" "ubsan" "tsan" "msan")
|
|
|
|
set(ENABLE_SANITIZER
|
|
|
|
"none"
|
|
|
|
CACHE STRING "none,asan,ubsan,tsan,msan")
|
|
|
|
set_property(CACHE ENABLE_SANITIZER PROPERTY STRINGS ${VALID_SANITIZERS})
|
2021-03-23 05:31:57 +08:00
|
|
|
|
|
|
|
# Perform sanitizer option check, only works in debug mode
|
2021-06-06 02:36:41 +08:00
|
|
|
if(NOT ENABLE_SANITIZER IN_LIST VALID_SANITIZERS)
|
|
|
|
message(FATAL_ERROR "Invalid -DENABLE_SANITIZER=${ENABLE_SANITIZER}, value must be one of ${VALID_SANITIZERS}")
|
|
|
|
else()
|
|
|
|
message(STATUS "Enable sanitizer ENABLE_SANITIZER=${ENABLE_SANITIZER}")
|
|
|
|
endif()
|
2021-03-23 05:31:57 +08:00
|
|
|
|
2021-08-26 12:58:31 +08:00
|
|
|
#--------------------------------------------------------------------
|
2018-12-12 06:23:02 +08:00
|
|
|
# INSTALL_NEXUS install Nexus alongside QMCPACK
|
2021-08-26 12:58:31 +08:00
|
|
|
#--------------------------------------------------------------------
|
|
|
|
option(INSTALL_NEXUS "Install Nexus alongside QMCPACK" ON)
|
|
|
|
if(INSTALL_NEXUS)
|
|
|
|
install(CODE "EXECUTE_PROCESS(COMMAND ${qmcpack_SOURCE_DIR}/nexus/install --leave_paths ${CMAKE_INSTALL_PREFIX}/bin)")
|
2021-06-06 02:36:41 +08:00
|
|
|
endif()
|
2017-01-19 05:34:50 +08:00
|
|
|
|
2021-08-26 12:58:31 +08:00
|
|
|
######################################################################
|
2021-08-26 13:39:25 +08:00
|
|
|
# Set the compiler specific options/flags
|
2021-08-26 12:58:31 +08:00
|
|
|
######################################################################
|
2021-06-06 02:36:41 +08:00
|
|
|
if(CMAKE_TOOLCHAIN_FILE)
|
|
|
|
message(STATUS "Using ${CMAKE_TOOLCHAIN_FILE} toolchain ")
|
|
|
|
else(CMAKE_TOOLCHAIN_FILE)
|
2021-08-26 13:12:37 +08:00
|
|
|
message(STATUS "Trying to figure out compiler options ....")
|
2021-06-06 02:36:41 +08:00
|
|
|
set(ENABLE_OPENMP 0)
|
2007-10-11 01:23:18 +08:00
|
|
|
|
2015-09-26 03:51:10 +08:00
|
|
|
#------------------------
|
|
|
|
# On Cray's machine
|
|
|
|
#------------------------
|
2021-06-06 02:36:41 +08:00
|
|
|
get_filename_component(BASE_CXX_COMPILER_NAME ${CMAKE_CXX_COMPILER} NAME)
|
|
|
|
if($ENV{CRAYPE_VERSION} MATCHES "." AND NOT BASE_CXX_COMPILER_NAME STREQUAL "CC")
|
|
|
|
message(WARNING "Cray Programming Environment has been detected but C++ compiler wrapper CC is not used! "
|
2020-06-16 00:50:46 +08:00
|
|
|
"Please use cc/CC as the C/C++ compiler to ensure correct cross-compiling for the compute nodes "
|
|
|
|
"unless you understand cross-compiling and intend not to use Cray compiler wrappers.")
|
2021-06-06 02:36:41 +08:00
|
|
|
endif()
|
|
|
|
if(CMAKE_SYSTEM_NAME STREQUAL "CrayLinuxEnvironment")
|
|
|
|
message(STATUS "Running on a Cray machine.")
|
2015-09-26 02:06:38 +08:00
|
|
|
|
2021-06-06 02:36:41 +08:00
|
|
|
if(NOT $ENV{CRAYPE_LINK_TYPE} STREQUAL "dynamic")
|
|
|
|
message(WARNING "Cray Programming Environment uses static linking by default. "
|
2020-02-06 15:40:41 +08:00
|
|
|
"We prefer dynamic linking which makes library searching easier. "
|
2021-09-01 00:14:21 +08:00
|
|
|
"Setting environment variable CRAYPE_LINK_TYPE to \"dynamic\" enables dynamic linking.\n")
|
2021-06-06 02:36:41 +08:00
|
|
|
endif()
|
2020-02-06 15:40:41 +08:00
|
|
|
|
2021-06-06 02:36:41 +08:00
|
|
|
if(NOT DEFINED MPIEXEC_EXECUTABLE)
|
|
|
|
find_program(MPIEXEC_EXECUTABLE aprun)
|
|
|
|
if(NOT MPIEXEC_EXECUTABLE)
|
2020-02-06 15:40:41 +08:00
|
|
|
# For slurm use srun
|
2021-06-06 02:36:41 +08:00
|
|
|
find_program(MPIEXEC_EXECUTABLE srun)
|
|
|
|
endif(NOT MPIEXEC_EXECUTABLE)
|
|
|
|
endif()
|
|
|
|
else()
|
|
|
|
if($ENV{CRAYPE_VERSION} MATCHES "." AND BASE_CXX_COMPILER_NAME STREQUAL "CC")
|
|
|
|
message(
|
|
|
|
FATAL_ERROR
|
|
|
|
"Cray compiler wrapper detected. Empty the build folder and rerun cmake with -DCMAKE_SYSTEM_NAME=CrayLinuxEnvironment added."
|
|
|
|
)
|
|
|
|
endif()
|
|
|
|
endif()
|
2006-11-24 07:00:56 +08:00
|
|
|
|
2021-08-26 12:58:31 +08:00
|
|
|
include(inspectCompiler)
|
2008-05-14 22:52:41 +08:00
|
|
|
|
2021-06-06 02:36:41 +08:00
|
|
|
endif(CMAKE_TOOLCHAIN_FILE)
|
2018-03-26 11:10:05 +08:00
|
|
|
|
2021-04-21 02:26:00 +08:00
|
|
|
if(NOT CMAKE_CXX_COMPILER_ID STREQUAL CMAKE_C_COMPILER_ID)
|
|
|
|
message(FATAL_ERROR "Mixing C and C++ compilers from different vendors is not permitted. Current "
|
|
|
|
"C compiler is ${CMAKE_C_COMPILER_ID} but C++ compiler is ${CMAKE_CXX_COMPILER_ID}.")
|
|
|
|
endif()
|
|
|
|
|
2021-08-26 12:58:31 +08:00
|
|
|
#-----------------------------------------------------------------------
|
2020-11-13 05:40:24 +08:00
|
|
|
# Set C++ minimum standard and run basic checks
|
2021-08-26 12:58:31 +08:00
|
|
|
#-----------------------------------------------------------------------
|
2020-11-13 05:40:24 +08:00
|
|
|
set(CMAKE_CXX_STANDARD ${QMC_CXX_STANDARD})
|
|
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
|
|
set(CMAKE_CXX_EXTENSIONS OFF)
|
|
|
|
|
2021-09-01 00:14:21 +08:00
|
|
|
# Check that a C++ compiler is compatible with the underlying libstdc++
|
2021-08-26 12:58:31 +08:00
|
|
|
include(Testlibstdc++)
|
2020-11-13 05:40:24 +08:00
|
|
|
|
|
|
|
# Check that a C++ standard library is configured properly
|
2021-08-26 12:58:31 +08:00
|
|
|
include(TestCxx17Library)
|
|
|
|
|
|
|
|
#-----------------------------------------------------------------------
|
|
|
|
# SETUP SANITIZERS FLAGS
|
|
|
|
#-----------------------------------------------------------------------
|
|
|
|
if(NOT "${ENABLE_SANITIZER}" STREQUAL "none")
|
|
|
|
if(NOT ${COMPILER} MATCHES "GNU" AND NOT ${COMPILER} MATCHES "Clang")
|
|
|
|
message(FATAL_ERROR "-DENABLE_SANITIZER=${ENABLE_SANITIZER} only works with GNU or Clang compilers")
|
|
|
|
endif()
|
|
|
|
|
|
|
|
if("${ENABLE_SANITIZER}" STREQUAL "asan")
|
|
|
|
set(CMAKE_CXX_FLAGS_SAN
|
|
|
|
"-fsanitize=address -fno-optimize-sibling-calls -fsanitize-address-use-after-scope -fno-omit-frame-pointer"
|
|
|
|
CACHE STRING "AddressSanitizer C++ compiler builds." FORCE)
|
|
|
|
elseif("${ENABLE_SANITIZER}" STREQUAL "ubsan")
|
|
|
|
set(CMAKE_CXX_FLAGS_SAN
|
|
|
|
"-fsanitize=undefined"
|
|
|
|
CACHE STRING "UndefinedBehaviorSanitizer C++ compiler builds." FORCE)
|
|
|
|
elseif("${ENABLE_SANITIZER}" STREQUAL "msan")
|
|
|
|
set(CMAKE_CXX_FLAGS_SAN
|
|
|
|
"-fsanitize=memory"
|
|
|
|
CACHE STRING "MemorySanitizer C++ compiler builds." FORCE)
|
|
|
|
elseif("${ENABLE_SANITIZER}" STREQUAL "tsan")
|
|
|
|
set(CMAKE_CXX_FLAGS_SAN
|
|
|
|
"-fsanitize=thread"
|
|
|
|
CACHE STRING "ThreadSanitizer C++ compiler builds." FORCE)
|
|
|
|
endif()
|
|
|
|
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_SAN}")
|
2009-02-22 00:30:49 +08:00
|
|
|
|
2021-08-26 12:58:31 +08:00
|
|
|
endif()
|
|
|
|
|
|
|
|
#-----------------------------------------------------------------------
|
|
|
|
# verify code coverage compiler support
|
|
|
|
#-----------------------------------------------------------------------
|
2021-06-06 02:36:41 +08:00
|
|
|
if(ENABLE_GCOV)
|
2021-08-26 12:58:31 +08:00
|
|
|
if(GCOV_SUPPORTED)
|
|
|
|
message(STATUS "GCOV is enabled")
|
|
|
|
else()
|
2021-06-06 02:36:41 +08:00
|
|
|
message(FATAL_ERROR "ENABLE_GCOV was specified but compiler does not support GCC coverage flag")
|
|
|
|
endif()
|
|
|
|
endif(ENABLE_GCOV)
|
2017-05-06 05:29:07 +08:00
|
|
|
|
2021-03-05 14:03:56 +08:00
|
|
|
#-------------------------------------------------------------------------------
|
2021-03-04 11:16:09 +08:00
|
|
|
# Check SIMD alignment for CPU only
|
2021-03-05 14:03:56 +08:00
|
|
|
#-------------------------------------------------------------------------------
|
2021-03-04 11:16:09 +08:00
|
|
|
# This is intentionally placed before adding OpenMP offload compile options
|
2021-03-05 14:03:56 +08:00
|
|
|
# to avoid contamination from device compilation pass.
|
|
|
|
# When '-march=skylake-avx512 -fopenmp-targets=nvptx64 -march=sm_70' is added
|
|
|
|
# for Clang, the source code is parsed twice for both host and offload targets.
|
|
|
|
# A trap for macro __AVX512F__ always fails because the offload pass doesn't
|
|
|
|
# carry '-march=skylake-avx512' but only takes '-march=sm_70'.
|
|
|
|
#-------------------------------------------------------------------------------
|
2021-08-26 12:58:31 +08:00
|
|
|
include(CheckSIMDAlignment)
|
2021-06-06 02:36:41 +08:00
|
|
|
set(QMC_SIMD_ALIGNMENT
|
|
|
|
${default_alignment}
|
|
|
|
CACHE STRING "Cache/SIMD alignment in bytes")
|
2021-03-05 14:03:56 +08:00
|
|
|
math(EXPR alignment_remainder "${QMC_SIMD_ALIGNMENT} % ${default_alignment}")
|
2021-06-06 02:36:41 +08:00
|
|
|
if(alignment_remainder)
|
|
|
|
message(
|
|
|
|
FATAL_ERROR
|
|
|
|
"QMC_SIMD_ALIGNMENT must be a multiple of ${default_alignment}. Bad cached value is ${QMC_SIMD_ALIGNMENT}")
|
2021-03-04 11:16:09 +08:00
|
|
|
endif()
|
2021-04-28 00:23:27 +08:00
|
|
|
message(STATUS "QMC_SIMD_ALIGNMENT is set to ${QMC_SIMD_ALIGNMENT}")
|
2021-04-27 01:46:03 +08:00
|
|
|
|
|
|
|
#---------------------------------------------------------
|
|
|
|
# Determine if OpenMP taskloop works with the CXX compiler
|
|
|
|
#---------------------------------------------------------
|
2021-08-26 12:58:31 +08:00
|
|
|
include(TestOpenMPtaskloop)
|
2021-04-27 01:46:03 +08:00
|
|
|
option(ENABLE_OMP_TASKLOOP "Enable OpenMP taskloop" ${OMP_TASKLOOP_OKAY})
|
2021-04-28 00:23:27 +08:00
|
|
|
message(STATUS "ENABLE_OMP_TASKLOOP is set to ${ENABLE_OMP_TASKLOOP}")
|
2021-03-04 11:16:09 +08:00
|
|
|
|
|
|
|
#---------------------------------------------------------
|
|
|
|
# Set up OpenMP offload compile options
|
|
|
|
#---------------------------------------------------------
|
2021-06-06 02:36:41 +08:00
|
|
|
if(ENABLE_OFFLOAD AND DEFINED OPENMP_OFFLOAD_COMPILE_OPTIONS)
|
2021-03-04 11:16:09 +08:00
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OPENMP_OFFLOAD_COMPILE_OPTIONS}")
|
|
|
|
endif()
|
|
|
|
|
2021-08-26 12:58:31 +08:00
|
|
|
#---------------------------------------------------------
|
|
|
|
# consider making this always on if OpenMP is no longer UB with Thread Support Library
|
|
|
|
# We should test out abstractions consistently and c++17 stdlib's all have support for
|
|
|
|
# std::thread and std::atomic
|
|
|
|
#---------------------------------------------------------
|
|
|
|
if(QMC_EXP_THREADING)
|
|
|
|
include(CheckAtomic)
|
|
|
|
if(HAVE_LIBATOMIC)
|
|
|
|
link_libraries("${HAVE_LIBATOMIC}")
|
|
|
|
endif(HAVE_LIBATOMIC)
|
|
|
|
add_definitions(-DQMC_EXP_THREADING)
|
|
|
|
endif(QMC_EXP_THREADING)
|
|
|
|
|
2020-02-06 15:40:41 +08:00
|
|
|
#-------------------------------------------------------------------
|
2021-08-26 12:58:31 +08:00
|
|
|
# Check MPI installation. MPI is treated as a part of compiler
|
2020-02-06 15:40:41 +08:00
|
|
|
#-------------------------------------------------------------------
|
2021-06-06 02:36:41 +08:00
|
|
|
if(QMC_MPI)
|
2020-02-13 12:45:41 +08:00
|
|
|
# for backward compatibility with MPIEXEC
|
2021-06-06 02:36:41 +08:00
|
|
|
if(DEFINED MPIEXEC AND NOT DEFINED MPIEXEC_EXECUTABLE)
|
|
|
|
message(
|
|
|
|
WARNING
|
|
|
|
"Setting MPIEXEC_EXECUTABLE based on MPIEXEC. MPIEXEC has been deprecated! Use MPIEXEC_EXECUTABLE instead!")
|
|
|
|
set(MPIEXEC_EXECUTABLE ${MPIEXEC})
|
|
|
|
endif(DEFINED MPIEXEC AND NOT DEFINED MPIEXEC_EXECUTABLE)
|
2021-07-20 07:12:51 +08:00
|
|
|
set(MPI_CXX_SKIP_MPICXX
|
|
|
|
TRUE
|
|
|
|
CACHE BOOL "Must be TRUE for QMCPACK. Cached for working around CMake FindMPI issue.")
|
2021-06-06 02:36:41 +08:00
|
|
|
if(NOT CMAKE_CROSSCOMPILING)
|
|
|
|
set(MPI_DETERMINE_LIBRARY_VERSION TRUE)
|
|
|
|
endif()
|
|
|
|
find_package(MPI COMPONENTS CXX)
|
|
|
|
|
|
|
|
if(NOT MPI_FOUND)
|
|
|
|
message(
|
|
|
|
FATAL_ERROR
|
|
|
|
"MPI support not found! Provide MPI compiler wrappers or build without MPI by passing '-DQMC_MPI=0' to cmake.")
|
|
|
|
endif(NOT MPI_FOUND)
|
|
|
|
|
|
|
|
if(${MPI_CXX_LIBRARY_VERSION_STRING} MATCHES "MVAPICH2")
|
|
|
|
string(REGEX REPLACE "\n" ";" ONE_LINE "${MPI_CXX_LIBRARY_VERSION_STRING}")
|
|
|
|
string(REGEX REPLACE " +|\t" ";" ONE_LINE "${ONE_LINE}")
|
|
|
|
list(GET ONE_LINE 3 MVAPICH2_VERSION)
|
|
|
|
message(STATUS "MVAPICH2 version ${MVAPICH2_VERSION}")
|
|
|
|
if(${MVAPICH2_VERSION} VERSION_LESS "2.4" AND NOT ${MPI_CXX_LIBRARY_VERSION_STRING} MATCHES
|
|
|
|
"disable-registration-cache")
|
|
|
|
message(
|
|
|
|
FATAL_ERROR
|
|
|
|
"MVAPICH2 (version < 2.4) with registration cache enabled breaks QMCPACK. "
|
|
|
|
"Use a different MPI library or a MVAPICH2 >=2.4 "
|
|
|
|
"or build MVAPICH2 with --disable-registration-cache configure option.")
|
|
|
|
endif()
|
|
|
|
endif()
|
|
|
|
|
|
|
|
if(${MPI_CXX_LIBRARY_VERSION_STRING} MATCHES "Open MPI")
|
|
|
|
if(NOT MPIEXEC_PREFLAGS)
|
|
|
|
set(MPIEXEC_PREFLAGS "--bind-to;none")
|
|
|
|
message(STATUS "Detected Open MPI. Setting bind-to options for thread affinity in MPIEXEC_PREFLAGS.")
|
|
|
|
else(NOT MPIEXEC_PREFLAGS)
|
|
|
|
if(NOT "${MPIEXEC_PREFLAGS}" MATCHES "--bind-to")
|
|
|
|
message(
|
|
|
|
WARNING "Default Open MPI thread affinity policy may bind all the threads to a single core and "
|
|
|
|
"significantly slow down testing. Add proper --bind-to options via MPIEXEC_PREFLAGS. "
|
|
|
|
"If you don't know exactly what affinity to add, "
|
|
|
|
"add '--bind-to;none' to your current MPIEXEC_PREFLAGS to stop this warning.")
|
|
|
|
endif()
|
|
|
|
endif(NOT MPIEXEC_PREFLAGS)
|
|
|
|
endif()
|
|
|
|
|
|
|
|
if(NOT ${CMAKE_CXX_COMPILER} STREQUAL ${MPI_CXX_COMPILER})
|
|
|
|
set(MPI_WARNING_LIST
|
2020-02-06 15:40:41 +08:00
|
|
|
"Building MPI version without using MPI compiler wrappers.\n"
|
|
|
|
"This may not build qmcpack correctly. To ensure the correct version, specify the compiler wrappers to cmake.\n"
|
|
|
|
"For example: cmake -DCMAKE_C_COMPILER=mpicc -DCMAKE_CXX_COMPILER=mpic++\n"
|
|
|
|
"To build without MPI, pass '-DQMC_MPI=0' to cmake")
|
2021-06-06 02:36:41 +08:00
|
|
|
message(WARNING ${MPI_WARNING_LIST})
|
|
|
|
endif()
|
|
|
|
|
|
|
|
message(STATUS "MPI runner MPIEXEC_EXECUTABLE : ${MPIEXEC_EXECUTABLE}")
|
|
|
|
message(STATUS "MPIEXEC_NUMPROC_FLAG : ${MPIEXEC_NUMPROC_FLAG}")
|
|
|
|
message(STATUS "MPIEXEC_PREFLAGS : ${MPIEXEC_PREFLAGS}")
|
|
|
|
string(REPLACE ";" " " MPIEXEC_PREFLAGS_PRINT "${MPIEXEC_PREFLAGS}")
|
|
|
|
message(
|
|
|
|
STATUS "Tests run as : ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} NUM_PROCS ${MPIEXEC_PREFLAGS_PRINT} EXECUTABLE"
|
|
|
|
)
|
|
|
|
|
|
|
|
set(HAVE_MPI 1)
|
|
|
|
message(STATUS "MPI is enabled")
|
|
|
|
else(QMC_MPI)
|
|
|
|
set(HAVE_MPI 0)
|
|
|
|
message(STATUS "MPI is disabled")
|
|
|
|
endif(QMC_MPI)
|
2004-09-30 23:42:16 +08:00
|
|
|
|
2021-08-26 13:39:25 +08:00
|
|
|
######################################################################
|
|
|
|
# Check external libraries.
|
|
|
|
######################################################################
|
2021-08-26 11:42:51 +08:00
|
|
|
|
|
|
|
#-------------------------------------------------------------------
|
|
|
|
# check OS related libraries
|
|
|
|
#-------------------------------------------------------------------
|
2021-08-26 12:58:31 +08:00
|
|
|
include(CheckFunctionExists)
|
2021-08-26 11:42:51 +08:00
|
|
|
check_function_exists(posix_memalign HAVE_POSIX_MEMALIGN)
|
2016-05-18 09:52:12 +08:00
|
|
|
|
2020-10-27 15:25:14 +08:00
|
|
|
#-------------------------------------------------------------------
|
2021-03-02 06:35:21 +08:00
|
|
|
# Check LAPACK/BLAS
|
2020-10-27 15:25:14 +08:00
|
|
|
#-------------------------------------------------------------------
|
|
|
|
# Add Math::BLAS_LAPACK target
|
2021-06-06 02:36:41 +08:00
|
|
|
add_library(Math::BLAS_LAPACK INTERFACE IMPORTED)
|
|
|
|
|
|
|
|
foreach(MKL_LIB_PATH IN ITEMS ${MKL_ROOT} $ENV{MKL_ROOT} $ENV{MKLROOT} $ENV{MKL_HOME})
|
|
|
|
set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} ${MKL_LIB_PATH}/lib/intel64)
|
|
|
|
endforeach()
|
|
|
|
if(NOT BLA_VENDOR)
|
|
|
|
message(STATUS "Trying to find LAPACK from Intel MKL")
|
2021-07-20 07:12:51 +08:00
|
|
|
if(QMC_OMP AND COMPILER STREQUAL "Intel")
|
2021-06-06 02:36:41 +08:00
|
|
|
set(BLA_VENDOR Intel10_64lp)
|
|
|
|
else()
|
|
|
|
set(BLA_VENDOR Intel10_64lp_seq)
|
|
|
|
endif()
|
2020-10-28 08:35:42 +08:00
|
|
|
find_package(LAPACK)
|
2021-06-06 02:36:41 +08:00
|
|
|
if(NOT LAPACK_FOUND)
|
|
|
|
message(STATUS "Intel MKL library files not found via FindLAPACK.")
|
|
|
|
message(STATUS "Trying to find alternative LAPACK libraries")
|
|
|
|
set(BLA_VENDOR All)
|
2020-10-28 08:17:18 +08:00
|
|
|
find_package(LAPACK REQUIRED)
|
2021-06-06 02:36:41 +08:00
|
|
|
endif()
|
|
|
|
else()
|
|
|
|
message(STATUS "Trying to find LAPACK library as requested BLA_VENDOR=${BLA_VENDOR}")
|
2020-10-28 08:17:18 +08:00
|
|
|
find_package(LAPACK REQUIRED)
|
2021-06-06 02:36:41 +08:00
|
|
|
endif()
|
2020-10-28 08:17:18 +08:00
|
|
|
|
2021-06-06 02:36:41 +08:00
|
|
|
message(STATUS "LAPACK linker flags: ${LAPACK_LINKER_FLAGS}")
|
|
|
|
message(STATUS "LAPACK libraries: ${LAPACK_LIBRARIES}")
|
|
|
|
set_target_properties(Math::BLAS_LAPACK PROPERTIES INTERFACE_LINK_LIBRARIES
|
|
|
|
"${LAPACK_LINKER_FLAGS};${LAPACK_LIBRARIES}")
|
2020-10-28 08:17:18 +08:00
|
|
|
|
2021-08-13 13:53:50 +08:00
|
|
|
#create scalar_vector_functions target
|
|
|
|
add_library(Math::scalar_vector_functions INTERFACE IMPORTED)
|
|
|
|
#create fftw3 target
|
|
|
|
add_library(Math::FFTW3 INTERFACE IMPORTED)
|
|
|
|
|
2020-10-28 08:17:18 +08:00
|
|
|
# Detects MKL header files and other components.
|
2021-06-06 02:36:41 +08:00
|
|
|
if(LAPACK_LIBRARIES MATCHES "mkl_core")
|
2021-08-26 12:58:31 +08:00
|
|
|
include(FindMKL)
|
2021-06-06 02:36:41 +08:00
|
|
|
endif()
|
2020-10-27 15:25:14 +08:00
|
|
|
|
2021-08-14 00:55:21 +08:00
|
|
|
if(MKL_FOUND)
|
|
|
|
set(MATH_VENDOR_GUESS "INTEL_VML")
|
|
|
|
endif()
|
|
|
|
|
2020-10-28 08:17:18 +08:00
|
|
|
# AFQMC requires MKL sparse for good performance (roughly a factor of 2x)
|
2021-06-06 02:36:41 +08:00
|
|
|
if(BUILD_AFQMC AND NOT MKL_FOUND)
|
|
|
|
message(
|
|
|
|
WARNING
|
|
|
|
"AFQMC - MKL not found, using simple sparse matrix routines. Link with MKL sparse libraries for better performance."
|
|
|
|
)
|
|
|
|
endif()
|
2020-10-28 08:17:18 +08:00
|
|
|
|
2020-02-08 19:55:57 +08:00
|
|
|
#-------------------------------------------------------------------
|
|
|
|
# set up scalar/vector math libraries
|
|
|
|
#-------------------------------------------------------------------
|
2021-08-14 00:55:21 +08:00
|
|
|
set(VALID_MATH_VENDORS "GENERIC" "INTEL_VML" "IBM_MASS" "AMD_LIBM")
|
|
|
|
if(NOT DEFINED MATH_VENDOR_GUESS)
|
|
|
|
set(MATH_VENDOR_GUESS "GENERIC")
|
|
|
|
endif()
|
2021-08-13 13:53:50 +08:00
|
|
|
set(QMC_MATH_VENDOR
|
2021-08-14 01:45:20 +08:00
|
|
|
${MATH_VENDOR_GUESS}
|
|
|
|
CACHE STRING "Vendor optimized libraries for scalar and vector math functions")
|
2021-08-14 00:55:21 +08:00
|
|
|
|
|
|
|
# Perform math vendor option check
|
|
|
|
if(NOT QMC_MATH_VENDOR IN_LIST VALID_MATH_VENDORS)
|
|
|
|
message(FATAL_ERROR "Invalid vendor math library ${QMC_MATH_VENDOR}, value must be one of ${VALID_MATH_VENDORS}")
|
|
|
|
else()
|
|
|
|
message(STATUS "Selected vendor math library ${QMC_MATH_VENDOR}")
|
|
|
|
endif()
|
2020-02-08 19:55:57 +08:00
|
|
|
|
|
|
|
# This needs to go before HAVE_SINCOS
|
2021-08-14 00:55:21 +08:00
|
|
|
if(QMC_MATH_VENDOR STREQUAL "INTEL_VML")
|
2021-08-26 12:58:31 +08:00
|
|
|
include(FindMKLVML)
|
2021-08-14 00:55:21 +08:00
|
|
|
elseif(QMC_MATH_VENDOR STREQUAL "IBM_MASS")
|
2021-08-26 12:58:31 +08:00
|
|
|
include(FindIBMMASS)
|
2021-08-13 13:53:50 +08:00
|
|
|
elseif(QMC_MATH_VENDOR STREQUAL "AMD_LIBM")
|
2021-08-26 12:58:31 +08:00
|
|
|
include(FindAMDLibM)
|
2021-08-13 13:53:50 +08:00
|
|
|
endif()
|
2020-02-08 19:55:57 +08:00
|
|
|
|
|
|
|
# CheckSincos relies on SINCOS_INCLUDE which may be modified based on vendor libraries
|
2021-06-06 02:36:41 +08:00
|
|
|
if(NOT SINCOS_INCLUDE)
|
|
|
|
set(SINCOS_INCLUDE cmath)
|
|
|
|
endif(NOT SINCOS_INCLUDE)
|
|
|
|
message(STATUS "SINCOS_INCLUDE : ${SINCOS_INCLUDE}")
|
2021-08-26 12:58:31 +08:00
|
|
|
include(CheckSincos)
|
2019-11-06 05:39:49 +08:00
|
|
|
|
2020-02-08 19:55:57 +08:00
|
|
|
#-------------------------------------------------------------------
|
|
|
|
# set up FFTW3 library
|
|
|
|
#-------------------------------------------------------------------
|
2021-06-06 02:36:41 +08:00
|
|
|
set(FFTW_FOUND 0)
|
|
|
|
if(HAVE_MKL)
|
|
|
|
if(HAVE_MKL_FFTW3)
|
|
|
|
set(FFTW_FOUND 1)
|
|
|
|
endif()
|
|
|
|
endif()
|
|
|
|
if(NOT FFTW_FOUND)
|
2016-05-18 09:52:12 +08:00
|
|
|
find_package(FFTW)
|
2021-06-06 02:36:41 +08:00
|
|
|
endif()
|
|
|
|
if(FFTW_FOUND)
|
|
|
|
set(HAVE_LIBFFTW 1)
|
|
|
|
message(STATUS "Found FFTW")
|
|
|
|
else(FFTW_FOUND)
|
|
|
|
# MESSAGE(STATUS "Disabling FFTW")
|
|
|
|
message(FATAL_ERROR "Could not find required library FFTW. Verify FFTW_HOME")
|
|
|
|
endif(FFTW_FOUND)
|
2018-03-21 02:25:12 +08:00
|
|
|
|
2021-06-06 02:36:41 +08:00
|
|
|
set(QMC_UTIL_LIBS ${QMC_UTIL_LIBS} ${FORTRAN_LIBRARIES})
|
2016-05-18 09:52:12 +08:00
|
|
|
|
2020-02-08 20:59:39 +08:00
|
|
|
#-------------------------------------------------------------------
|
|
|
|
# set up Libxml2 library
|
|
|
|
#-------------------------------------------------------------------
|
2015-09-26 02:06:38 +08:00
|
|
|
find_package(ZLIB)
|
2020-11-05 09:12:08 +08:00
|
|
|
find_package(LibXml2 REQUIRED)
|
2015-09-26 02:06:38 +08:00
|
|
|
|
2020-02-06 15:40:41 +08:00
|
|
|
#-------------------------------------------------------------------
|
|
|
|
# set up HDF5 library
|
|
|
|
#-------------------------------------------------------------------
|
2021-06-06 02:36:41 +08:00
|
|
|
if(HAVE_MPI)
|
|
|
|
set(HDF5_PREFER_PARALLEL
|
|
|
|
TRUE
|
|
|
|
CACHE BOOL "Request parallel/serial HDF5 library")
|
|
|
|
else(HAVE_MPI)
|
|
|
|
set(HDF5_PREFER_PARALLEL
|
|
|
|
FALSE
|
|
|
|
CACHE BOOL "Request parallel/serial HDF5 library")
|
|
|
|
if(HDF5_PREFER_PARALLEL)
|
|
|
|
message(FATAL_ERROR "Parallel HDF5 library cannot be selected with QMCPACK non-MPI build. "
|
2019-12-07 07:15:11 +08:00
|
|
|
"Please set HDF5_PREFER_PARALLEL=0.")
|
2021-06-06 02:36:41 +08:00
|
|
|
endif(HDF5_PREFER_PARALLEL)
|
|
|
|
endif(HAVE_MPI)
|
2019-12-07 07:15:11 +08:00
|
|
|
|
2015-09-26 02:06:38 +08:00
|
|
|
if(QMC_BUILD_STATIC)
|
2021-06-06 02:36:41 +08:00
|
|
|
message(STATUS "Linking static HDF5 library")
|
2015-09-26 02:06:38 +08:00
|
|
|
set(HDF5_USE_STATIC_LIBRARIES on)
|
2019-12-07 07:15:11 +08:00
|
|
|
else()
|
2021-06-06 02:36:41 +08:00
|
|
|
message(STATUS "Linking dynamic HDF5 library")
|
2019-12-07 07:15:11 +08:00
|
|
|
set(HDF5_USE_STATIC_LIBRARIES off)
|
2015-09-26 02:06:38 +08:00
|
|
|
endif()
|
|
|
|
|
2017-08-29 04:11:24 +08:00
|
|
|
find_package(HDF5 COMPONENTS C)
|
2019-12-07 07:15:11 +08:00
|
|
|
|
2021-06-06 02:36:41 +08:00
|
|
|
if(HDF5_FOUND)
|
|
|
|
set(HAVE_LIBHDF5 1)
|
|
|
|
|
|
|
|
if(HDF5_IS_PARALLEL)
|
|
|
|
message(STATUS "Parallel HDF5 library found")
|
|
|
|
option(ENABLE_PHDF5 "Enable code paths using parallel HDF5" ON)
|
|
|
|
else(HDF5_IS_PARALLEL)
|
|
|
|
message(STATUS "Serial HDF5 library found")
|
|
|
|
option(ENABLE_PHDF5 "Enable code paths using parallel HDF5" OFF)
|
|
|
|
if(ENABLE_PHDF5)
|
|
|
|
if(HAVE_MPI)
|
|
|
|
message(FATAL_ERROR "Parallel HDF5 code paths requested but serial HDF5 library found! "
|
2019-12-07 07:15:11 +08:00
|
|
|
"Please either provide parallel HDF5 library or set ENABLE_PHDF5=0.")
|
2021-06-06 02:36:41 +08:00
|
|
|
else(HAVE_MPI)
|
|
|
|
message(FATAL_ERROR "Parallel HDF5 code paths cannot be enabled on non-MPI builds! Please set ENABLE_PHDF5=0.")
|
|
|
|
endif(HAVE_MPI)
|
|
|
|
endif(ENABLE_PHDF5)
|
|
|
|
endif(HDF5_IS_PARALLEL)
|
|
|
|
|
|
|
|
if(ENABLE_PHDF5)
|
|
|
|
message(STATUS "Using HDF5 parallel collective I/O code paths")
|
|
|
|
else(ENABLE_PHDF5)
|
|
|
|
message(STATUS "Using HDF5 non-scalable serial I/O code paths")
|
|
|
|
endif(ENABLE_PHDF5)
|
|
|
|
|
|
|
|
if(HAVE_MPI AND NOT ENABLE_PHDF5)
|
|
|
|
message(
|
|
|
|
WARNING
|
|
|
|
"MPI builds may have performance loss by not using parallel HDF5! (Safe to ignore for workstation builds).")
|
|
|
|
endif()
|
|
|
|
|
|
|
|
if(CMAKE_BUILD_TYPE AND HDF5_LIBRARIES_DEBUG)
|
|
|
|
if(CMAKE_BUILD_TYPE MATCHES DEBUG)
|
|
|
|
set(HDF5_LIBRARIES ${HDF5_LIBRARIES_DEBUG})
|
|
|
|
else()
|
|
|
|
set(HDF5_LIBRARIES ${HDF5_LIBRARIES_RELEASE})
|
|
|
|
endif()
|
|
|
|
endif()
|
|
|
|
|
|
|
|
add_library(IO::HDF5 INTERFACE IMPORTED)
|
|
|
|
set_target_properties(
|
|
|
|
IO::HDF5
|
|
|
|
PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${HDF5_INCLUDE_DIR}" INTERFACE_COMPILE_DEFINITIONS
|
|
|
|
"HAVE_LIBHDF5;H5_USE_16_API" INTERFACE_LINK_LIBRARIES
|
|
|
|
"${HDF5_LIBRARIES}")
|
|
|
|
if(ENABLE_PHDF5)
|
|
|
|
set_property(TARGET IO::HDF5 APPEND PROPERTY INTERFACE_COMPILE_DEFINITIONS "ENABLE_PHDF5")
|
|
|
|
endif(ENABLE_PHDF5)
|
|
|
|
else(HDF5_FOUND)
|
|
|
|
message(FATAL_ERROR "HDF5 not found. Set HDF5_ROOT")
|
|
|
|
endif(HDF5_FOUND)
|
2004-08-25 03:21:10 +08:00
|
|
|
|
2020-02-08 20:59:39 +08:00
|
|
|
#-------------------------------------------------------------------
|
|
|
|
# set up libboost library, header only
|
|
|
|
#-------------------------------------------------------------------
|
2015-09-26 02:06:38 +08:00
|
|
|
set(Boost_NO_BOOST_CMAKE on)
|
2018-12-15 05:27:51 +08:00
|
|
|
find_package(Boost 1.61.0 REQUIRED)
|
2021-06-06 02:36:41 +08:00
|
|
|
if(Boost_FOUND)
|
|
|
|
set_property(TARGET Boost::boost APPEND PROPERTY INTERFACE_COMPILE_DEFINITIONS "HAVE_LIBBOOST")
|
|
|
|
message(STATUS "Setting Boost_INCLUDE_DIRS=${Boost_INCLUDE_DIRS}")
|
|
|
|
else()
|
|
|
|
message(FATAL_ERROR "Need boost 1.61.0 or higher. Set BOOST_ROOT")
|
|
|
|
endif()
|
2009-12-23 23:49:53 +08:00
|
|
|
|
2020-02-08 20:59:39 +08:00
|
|
|
#-------------------------------------------------------------------
|
|
|
|
# set up CUDA compiler options and libraries
|
|
|
|
#-------------------------------------------------------------------
|
2021-06-06 02:36:41 +08:00
|
|
|
set(HAVE_CUDA 0)
|
|
|
|
if(QMC_CUDA OR ENABLE_CUDA)
|
2021-08-26 09:48:20 +08:00
|
|
|
if(QMC_CUDA2HIP)
|
|
|
|
message(STATUS "CUDA2HIP enabled") # all the HIP and ROCm settings will be handled by ENABLE_ROCM
|
|
|
|
else(QMC_CUDA2HIP)
|
2021-05-12 03:11:25 +08:00
|
|
|
# FindCUDA default CUDA_PROPAGATE_HOST_FLAGS to ON but we prefer OFF
|
|
|
|
# It happened -ffast-math from host caused numerical issue in CUDA kernels.
|
2021-06-06 02:36:41 +08:00
|
|
|
option(CUDA_PROPAGATE_HOST_FLAGS "Propagate C/CXX_FLAGS and friends to the host compiler via -Xcompile" OFF)
|
|
|
|
find_package(CUDA REQUIRED)
|
|
|
|
set(CUDA_LINK_LIBRARIES_KEYWORD PRIVATE)
|
2021-05-12 03:11:25 +08:00
|
|
|
#set(CUDA_NVCC_FLAGS
|
|
|
|
# "-arch=sm_20;-Drestrict=__restrict__;-DNO_CUDA_MAIN;-O3;-use_fast_math")
|
|
|
|
if(CUDA_NVCC_FLAGS MATCHES "arch")
|
|
|
|
# User defined NVCC flags
|
2021-06-06 02:36:41 +08:00
|
|
|
message(STATUS "Setting CUDA FLAGS=${CUDA_NVCC_FLAGS}")
|
2021-05-12 03:11:25 +08:00
|
|
|
else(CUDA_NVCC_FLAGS MATCHES "arch")
|
|
|
|
# Automatically set the default NVCC flags
|
2021-08-24 22:51:23 +08:00
|
|
|
set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS};-Drestrict=__restrict__;-DNO_CUDA_MAIN;-std=c++14")
|
2021-06-06 02:36:41 +08:00
|
|
|
if(QMC_COMPLEX)
|
2021-08-30 10:14:15 +08:00
|
|
|
set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS};-DQMC_COMPLEX=${QMC_COMPLEX}")
|
2021-05-12 03:11:25 +08:00
|
|
|
endif()
|
2021-06-06 02:36:41 +08:00
|
|
|
if(CMAKE_BUILD_TYPE STREQUAL "DEBUG")
|
|
|
|
set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS};-g;-G")
|
2021-05-12 03:11:25 +08:00
|
|
|
else()
|
|
|
|
# Temporarily disable fast_math because it causes multiple test failures
|
|
|
|
# SET(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS};-O3;-use_fast_math")
|
2021-06-06 02:36:41 +08:00
|
|
|
set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS};-O3")
|
|
|
|
endif()
|
|
|
|
set(CUDA_ARCH
|
|
|
|
sm_70
|
|
|
|
CACHE STRING "CUDA architecture sm_XX")
|
|
|
|
set(CUDA_NVCC_FLAGS "-arch=${CUDA_ARCH};${CUDA_NVCC_FLAGS}")
|
2021-05-12 03:11:25 +08:00
|
|
|
endif(CUDA_NVCC_FLAGS MATCHES "arch")
|
2021-06-06 02:36:41 +08:00
|
|
|
include_directories(${CUDA_INCLUDE_DIRS})
|
|
|
|
set(HAVE_CUDA 1)
|
|
|
|
message(" CUDA_NVCC_FLAGS=${CUDA_NVCC_FLAGS}")
|
2021-08-26 09:48:20 +08:00
|
|
|
endif(QMC_CUDA2HIP)
|
2021-06-06 02:36:41 +08:00
|
|
|
else(QMC_CUDA OR ENABLE_CUDA)
|
2021-08-26 09:48:20 +08:00
|
|
|
if(QMC_CUDA2HIP)
|
|
|
|
message(FATAL_ERROR "QMC_CUDA2HIP requires QMC_CUDA=ON or ENABLE_CUDA=ON.")
|
|
|
|
endif()
|
2021-06-06 02:36:41 +08:00
|
|
|
message(STATUS "CUDA disabled")
|
|
|
|
endif(QMC_CUDA OR ENABLE_CUDA)
|
|
|
|
|
|
|
|
if(USE_NVTX_API)
|
|
|
|
message(STATUS "Enabling use of CUDA NVTX APIs")
|
|
|
|
find_library(
|
|
|
|
NVTX_API_LIB NAME nvToolsExt
|
2020-12-20 05:38:34 +08:00
|
|
|
HINTS ${CUDA_TOOLKIT_ROOT_DIR}
|
|
|
|
PATH_SUFFIXES lib lib64)
|
2021-06-06 02:36:41 +08:00
|
|
|
if(NOT NVTX_API_LIB)
|
|
|
|
message(FATAL_ERROR "USE_NVTX_API set but NVTX_API_LIB not found")
|
|
|
|
endif(NOT NVTX_API_LIB)
|
|
|
|
message("CUDA nvToolsExt library: ${NVTX_API_LIB}")
|
|
|
|
link_libraries(${NVTX_API_LIB})
|
|
|
|
else()
|
|
|
|
message(STATUS "CUDA NVTX APIs disabled")
|
|
|
|
endif(USE_NVTX_API)
|
2018-07-06 07:05:54 +08:00
|
|
|
|
2020-06-23 13:44:19 +08:00
|
|
|
#-------------------------------------------------------------------
|
|
|
|
# set up ROCM compiler options and libraries
|
|
|
|
#-------------------------------------------------------------------
|
2021-06-06 02:36:41 +08:00
|
|
|
if(ENABLE_ROCM)
|
2021-08-26 09:48:20 +08:00
|
|
|
if(ROCM_ROOT)
|
|
|
|
message(STATUS "ROCM_ROOT provided. Searching for FindHIP.cmake file")
|
|
|
|
find_path(
|
|
|
|
HIP_MODULE_FILE_DIR FindHIP.cmake
|
|
|
|
HINTS ${ROCM_ROOT}
|
|
|
|
PATH_SUFFIXES hip/cmake REQUIRED
|
|
|
|
NO_DEFAULT_PATH)
|
|
|
|
else()
|
|
|
|
message(STATUS "ROCM_ROOT not provided. Searching for FindHIP.cmake file.")
|
|
|
|
find_path(
|
|
|
|
HIP_MODULE_FILE_DIR FindHIP.cmake
|
|
|
|
HINTS /opt/rocm
|
|
|
|
PATH_SUFFIXES hip/cmake)
|
|
|
|
if(HIP_MODULE_FILE_DIR)
|
|
|
|
message(STATUS "Found FindHIP.cmake file. ROCM_ROOT will be derived.")
|
|
|
|
else()
|
2021-09-01 00:14:21 +08:00
|
|
|
message(FATAL_ERROR "Failed to find FindHIP.cmake file. Please set ROCM_ROOT to your ROCm installation.")
|
2021-08-26 09:48:20 +08:00
|
|
|
endif()
|
|
|
|
string(REGEX REPLACE "\/hip\/cmake" "" ROCM_ROOT "${HIP_MODULE_FILE_DIR}")
|
|
|
|
endif()
|
|
|
|
message(STATUS "Using ROCM_ROOT: ${ROCM_ROOT}")
|
|
|
|
|
|
|
|
list(APPEND CMAKE_MODULE_PATH ${HIP_MODULE_FILE_DIR})
|
|
|
|
list(APPEND CMAKE_PREFIX_PATH ${ROCM_ROOT})
|
|
|
|
find_package(HIP REQUIRED)
|
|
|
|
find_package(hipblas REQUIRED)
|
|
|
|
find_package(rocsolver REQUIRED)
|
|
|
|
# architecture flags
|
|
|
|
set(HIP_ARCH
|
|
|
|
"gfx906,gfx908"
|
|
|
|
CACHE STRING "HIP architecture gfxXXX")
|
|
|
|
list(APPEND HIP_HIPCC_FLAGS "-fPIC -ffast-math -O3 -std=c++14")
|
|
|
|
list(APPEND HIP_HIPCC_FLAGS "--amdgpu-target=${HIP_ARCH}")
|
|
|
|
list(APPEND HIP_HIPCC_FLAGS "--gpu-max-threads-per-block=256")
|
|
|
|
# warning suppression
|
|
|
|
list(APPEND HIP_HIPCC_FLAGS "-Wno-vla")
|
|
|
|
list(APPEND HIP_HIPCC_FLAGS "-Wno-deprecated-declarations")
|
|
|
|
list(APPEND HIP_HIPCC_FLAGS "-Wno-unused-command-line-argument")
|
|
|
|
|
|
|
|
if(BUILD_AFQMC)
|
|
|
|
find_package(rocrand REQUIRED)
|
|
|
|
# connect ROCm shipped libraries
|
|
|
|
add_library(ROCM::libraries INTERFACE IMPORTED)
|
|
|
|
# temporarily put rocsolver rocrand here for convenience, should be moved to Platforms.
|
|
|
|
target_link_libraries(ROCM::libraries INTERFACE "-L${ROCM_ROOT}/lib;-lrocsolver;-lrocrand")
|
|
|
|
target_include_directories(ROCM::libraries INTERFACE "${ROCM_ROOT}/include")
|
|
|
|
endif()
|
2021-06-06 02:36:41 +08:00
|
|
|
endif(ENABLE_ROCM)
|
2020-06-23 13:44:19 +08:00
|
|
|
|
|
|
|
#-------------------------------------------------------------------
|
|
|
|
# set up HIP compiler options
|
|
|
|
#-------------------------------------------------------------------
|
2021-06-06 02:36:41 +08:00
|
|
|
if(ENABLE_HIP)
|
|
|
|
if(NOT ENABLE_ROCM)
|
|
|
|
message(FATAL_ERROR "ROCM is required to use HIP. Please set ENABLE_ROCM=ON.")
|
|
|
|
endif()
|
|
|
|
|
2021-08-26 09:48:20 +08:00
|
|
|
find_package(hipsparse REQUIRED)
|
2021-06-06 02:36:41 +08:00
|
|
|
add_library(HIP::HIP INTERFACE IMPORTED)
|
2020-06-23 13:44:19 +08:00
|
|
|
# temporarily put hipsparse hipblas here for convenience, should be moved to Platforms.
|
2021-08-26 09:48:20 +08:00
|
|
|
target_link_libraries(HIP::HIP INTERFACE "-L${ROCM_ROOT}/lib;-lhipsparse;-lhipblas;-lamdhip64")
|
|
|
|
target_include_directories(HIP::HIP INTERFACE "${ROCM_ROOT}/include")
|
|
|
|
target_compile_definitions(HIP::HIP INTERFACE "ENABLE_HIP")
|
|
|
|
|
|
|
|
# FindHIP sets HIP_PLATFORM to amd or nvcc
|
|
|
|
message(STATUS "FindHIP determined HIP_PLATFORM is ${HIP_PLATFORM}.")
|
|
|
|
if(HIP_PLATFORM STREQUAL "amd")
|
|
|
|
target_compile_definitions(HIP::HIP INTERFACE "__HIP_PLATFORM_AMD__")
|
|
|
|
elseif(HIP_PLATFORM STREQUAL "nvcc")
|
|
|
|
target_compile_definitions(HIP::HIP INTERFACE "__HIP_PLATFORM_NVIDIA__")
|
|
|
|
else()
|
|
|
|
message(FATAL_ERROR "Unknown HIP platform ${HIP_PLATFORM} only support 'amd' or 'nvcc'")
|
|
|
|
endif()
|
2021-06-06 02:36:41 +08:00
|
|
|
endif(ENABLE_HIP)
|
2020-06-23 13:44:19 +08:00
|
|
|
|
2021-08-26 13:39:25 +08:00
|
|
|
#-------------------------------------------------------------------
|
|
|
|
# set up VTune ittnotify library
|
|
|
|
#-------------------------------------------------------------------
|
2021-06-06 02:36:41 +08:00
|
|
|
|
|
|
|
if(USE_VTUNE_API)
|
|
|
|
message(STATUS "Enabling use of VTune ittnotify APIs")
|
|
|
|
find_path(
|
|
|
|
VTUNE_ITTNOTIFY_INCLUDE_DIR ittnotify.h
|
|
|
|
HINTS ${VTUNE_ROOT} $ENV{VTUNE_ROOT}
|
|
|
|
PATH_SUFFIXES include REQUIRED)
|
|
|
|
message(STATUS "Found VTUNE_ITTNOTIFY_INCLUDE_DIR ${VTUNE_ITTNOTIFY_INCLUDE_DIR}")
|
|
|
|
find_library(
|
|
|
|
VTUNE_ITTNOTIFY_LIBRARY ittnotify
|
|
|
|
HINTS ${VTUNE_ROOT} $ENV{VTUNE_ROOT}
|
|
|
|
PATH_SUFFIXES lib64 lib REQUIRED)
|
|
|
|
message(STATUS "Found VTUNE_ITTNOTIFY_LIBRARY ${VTUNE_ITTNOTIFY_LIBRARY}")
|
|
|
|
|
|
|
|
include_directories(${VTUNE_ITTNOTIFY_INCLUDE_DIR})
|
|
|
|
link_libraries(${VTUNE_ITTNOTIFY_LIBRARY})
|
|
|
|
if(USE_VTUNE_TASKS)
|
|
|
|
message(STATUS "VTune ittnotify tasks enabled")
|
|
|
|
endif()
|
|
|
|
else()
|
|
|
|
message(STATUS "VTune ittnotify APIs disabled")
|
|
|
|
endif()
|
|
|
|
|
2021-08-26 12:58:31 +08:00
|
|
|
#-------------------------------------------------------------------
|
2014-11-14 05:21:32 +08:00
|
|
|
# Add user extra flags
|
2021-08-26 12:58:31 +08:00
|
|
|
#-------------------------------------------------------------------
|
2021-06-06 02:36:41 +08:00
|
|
|
if(QMC_INCLUDE)
|
|
|
|
foreach(tmp ${QMC_INCLUDE})
|
|
|
|
message(STATUS "Adding '${tmp}' to include directories")
|
|
|
|
include_directories("${tmp}")
|
|
|
|
endforeach()
|
|
|
|
endif()
|
2021-08-26 12:58:31 +08:00
|
|
|
|
2021-06-06 02:36:41 +08:00
|
|
|
if(QMC_EXTRA_LIBS)
|
2014-11-20 02:28:35 +08:00
|
|
|
string(REPLACE " " ";" QMC_EXTRA_LIBS ${QMC_EXTRA_LIBS})
|
2021-06-06 02:36:41 +08:00
|
|
|
set(QMC_UTIL_LIBS ${QMC_UTIL_LIBS} ${QMC_EXTRA_LIBS})
|
|
|
|
message("QMC_UTIL_LIBS=${QMC_UTIL_LIBS}")
|
|
|
|
endif()
|
2014-11-14 05:21:32 +08:00
|
|
|
|
2021-08-26 12:58:31 +08:00
|
|
|
if(BUILD_AFQMC AND NOT APPLE)
|
|
|
|
link_libraries("rt")
|
2021-06-06 02:36:41 +08:00
|
|
|
endif()
|
2016-02-06 13:16:11 +08:00
|
|
|
|
2021-08-26 12:58:31 +08:00
|
|
|
######################################################################
|
|
|
|
# All the settings related to building QMCPACK are complete
|
|
|
|
######################################################################
|
2021-05-12 03:11:25 +08:00
|
|
|
|
2021-08-26 12:58:31 +08:00
|
|
|
#include build/src
|
|
|
|
include_directories(${qmcpack_BINARY_DIR}/src)
|
2021-08-26 13:39:25 +08:00
|
|
|
#include qmcpack/src
|
|
|
|
include_directories(${PROJECT_SOURCE_DIR}/src)
|
|
|
|
|
2021-08-26 12:58:31 +08:00
|
|
|
#-------------------------------------------------------------------
|
|
|
|
# add definitions DO NOT EXPAND
|
|
|
|
#-------------------------------------------------------------------
|
|
|
|
add_definitions(-DHAVE_CONFIG_H -DUSE_REAL_STRUCT_FACTOR -DADD_)
|
2021-05-12 03:11:25 +08:00
|
|
|
|
2021-08-26 12:58:31 +08:00
|
|
|
#-------------------------------------------------------------------
|
|
|
|
# qmcpack.settings
|
|
|
|
#-------------------------------------------------------------------
|
|
|
|
execute_process(
|
|
|
|
COMMAND hostname
|
|
|
|
OUTPUT_VARIABLE QMC_HOSTNAME
|
|
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
|
|
configure_file(${qmcpack_SOURCE_DIR}/src/qmcpack.settings ${qmcpack_BINARY_DIR}/bin/qmcpack.settings)
|
|
|
|
install(FILES ${qmcpack_BINARY_DIR}/bin/qmcpack.settings DESTINATION bin)
|
2021-03-23 05:31:57 +08:00
|
|
|
|
2021-08-26 12:58:31 +08:00
|
|
|
#-------------------------------------------------------------------
|
2018-03-22 22:11:33 +08:00
|
|
|
# FLAGS at the project level
|
2021-08-26 12:58:31 +08:00
|
|
|
#-------------------------------------------------------------------
|
2018-03-22 22:11:33 +08:00
|
|
|
#this might be redundant but maybe not in all CMake versions.
|
2021-06-06 02:36:41 +08:00
|
|
|
string(TOUPPER "${CMAKE_BUILD_TYPE}" THIS_CONFIG)
|
2018-03-22 22:11:33 +08:00
|
|
|
|
2021-06-06 02:36:41 +08:00
|
|
|
foreach(lang IN ITEMS C CXX)
|
|
|
|
set(PROJECT_CMAKE_${lang}_FLAGS ${CMAKE_${lang}_FLAGS})
|
2018-03-22 22:23:28 +08:00
|
|
|
#pre 3.0 cmake does not have string CONCAT
|
2021-06-06 02:36:41 +08:00
|
|
|
set(TMP_PROJECT_CMAKE_${lang}_FLAGS "${PROJECT_CMAKE_${lang}_FLAGS} ${CMAKE_${lang}_FLAGS_${THIS_CONFIG}}")
|
|
|
|
message("Project ${lang}_FLAGS: ${TMP_PROJECT_CMAKE_${lang}_FLAGS}")
|
|
|
|
endforeach(lang IN ITEMS C CXX)
|
2018-03-22 22:11:33 +08:00
|
|
|
|
2018-06-08 03:50:05 +08:00
|
|
|
get_directory_property(TMP_PROJECT_INCLUDE_DIRECTORIES INCLUDE_DIRECTORIES)
|
2021-06-06 02:36:41 +08:00
|
|
|
message("Project INCLUDE_DIRECTORIES: ${TMP_PROJECT_INCLUDE_DIRECTORIES}")
|
2018-03-22 22:11:33 +08:00
|
|
|
|
2021-06-06 02:36:41 +08:00
|
|
|
foreach(target_type IN ITEMS EXE SHARED)
|
|
|
|
set(PROJECT_CMAKE_${target_type}_LINKER_FLAGS ${CMAKE_${target_type}_LINKER_FLAGS})
|
|
|
|
set(TMP_PROJECT_CMAKE_${target_type}_LINKER_FLAGS
|
|
|
|
"${PROJECT_CMAKE_${target_type}_LINKER_FLAGS} ${CMAKE_${target_type}_LINKER_FLAGS_${THIS_CONFIG}}")
|
|
|
|
message("Project ${target_type}_LINKER_FLAGS: ${TMP_PROJECT_CMAKE_${target_type}_LINKER_FLAGS}")
|
|
|
|
endforeach(target_type IN ITEMS EXE SHARED)
|
2018-03-22 22:11:33 +08:00
|
|
|
|
2021-08-26 12:58:31 +08:00
|
|
|
#-------------------------------------------------------------------
|
|
|
|
# Git information (see src/CMakeLists.txt for the
|
|
|
|
# command to get repository information)
|
|
|
|
#-------------------------------------------------------------------
|
|
|
|
find_package(Git)
|
|
|
|
|
|
|
|
if(GIT_FOUND AND EXISTS "${qmcpack_SOURCE_DIR}/.git")
|
|
|
|
set(IS_GIT_PROJECT 1)
|
|
|
|
endif()
|
2008-05-14 22:52:41 +08:00
|
|
|
|
2021-09-02 22:06:01 +08:00
|
|
|
# set up config.h
|
|
|
|
configure_file(${qmcpack_SOURCE_DIR}/src/config.h.cmake.in ${qmcpack_BINARY_DIR}/src/config.h)
|
|
|
|
|
2021-08-26 11:42:51 +08:00
|
|
|
######################################################################
|
2021-08-26 12:58:31 +08:00
|
|
|
# Testing related settings
|
2021-08-26 11:42:51 +08:00
|
|
|
######################################################################
|
2021-08-26 12:58:31 +08:00
|
|
|
|
2021-08-26 11:42:51 +08:00
|
|
|
# The following option disables the extremely slow setup of full system run tests
|
|
|
|
# This is a developer option
|
|
|
|
# It offers a more reasonable compile debug loop if CMakeLists.txt files are being changed
|
|
|
|
# These constom commands execution time far exceeds even the feature and compiler checks for time consumed
|
|
|
|
# when rerunning cmake.
|
|
|
|
#
|
|
|
|
# On leconte: rerun of cmake with
|
|
|
|
# slow custom commands 27 secs
|
|
|
|
# without 8 secs
|
|
|
|
option(QMC_NO_SLOW_CUSTOM_TESTING_COMMANDS "Disable the slow cmake custom commands for integration tests." OFF)
|
|
|
|
mark_as_advanced(QMC_NO_SLOW_CUSTOM_TESTING_COMMANDS)
|
|
|
|
|
2021-08-26 12:58:31 +08:00
|
|
|
if(NOT TEST_MAX_PROCS)
|
|
|
|
set(TEST_MAX_PROCS 100)
|
|
|
|
endif()
|
2021-08-26 11:42:51 +08:00
|
|
|
|
|
|
|
option(QMC_SYMLINK_TEST_FILES "Use symbolic links for test files to save space. Set to false to copy files instead."
|
|
|
|
ON)
|
|
|
|
|
|
|
|
if(QMC_SYMLINK_TEST_FILES)
|
|
|
|
set(SYMLINK_MSG
|
|
|
|
"Using symbolic links for large test files may cause test failures if the build is installed on a separate filesystem from the source."
|
|
|
|
)
|
|
|
|
else()
|
|
|
|
set(SYMLINK_MSG "Copying large test files uses more disk space than using symbolic links.")
|
|
|
|
endif()
|
|
|
|
message(STATUS "QMC_SYMLINK_TEST_FILES = ${QMC_SYMLINK_TEST_FILES}. ${SYMLINK_MSG}")
|
|
|
|
|
2021-08-26 12:58:31 +08:00
|
|
|
if(QMC_DATA)
|
|
|
|
message(STATUS "QMC_DATA is ${QMC_DATA}")
|
|
|
|
endif()
|
|
|
|
|
|
|
|
#-------------------------------------------------------------------
|
|
|
|
# CTest
|
|
|
|
#-------------------------------------------------------------------
|
|
|
|
set(DROP_METHOD "http")
|
|
|
|
set(DROP_SITE "cdash.qmcpack.org")
|
|
|
|
set(DROP_LOCATION "/CDash/submit.php?project=QMCPACK")
|
|
|
|
set(TRIGGER_SITE "")
|
|
|
|
set(DROP_SITE_CDASH TRUE)
|
|
|
|
# Increase timeout per test over the default of 1500 seconds (25 minutes)
|
|
|
|
set(DART_TESTING_TIMEOUT
|
|
|
|
3600
|
|
|
|
CACHE STRING "Maximum time for one test")
|
|
|
|
enable_testing()
|
|
|
|
include(CTest)
|
|
|
|
|
|
|
|
#-------------------------------------------------------------------
|
2021-08-26 11:42:51 +08:00
|
|
|
# Verify Python3 available
|
2021-08-26 12:58:31 +08:00
|
|
|
#-------------------------------------------------------------------
|
2021-08-26 11:42:51 +08:00
|
|
|
find_package(Python3)
|
|
|
|
if(NOT Python3_FOUND)
|
|
|
|
message(FATAL_ERROR "Could not find required python3")
|
|
|
|
endif(NOT Python3_FOUND)
|
2021-08-26 12:58:31 +08:00
|
|
|
include(python)
|
2021-08-26 11:42:51 +08:00
|
|
|
|
2021-08-26 12:58:31 +08:00
|
|
|
#-------------------------------------------------------------------
|
2021-08-26 11:42:51 +08:00
|
|
|
# Check if PySCF is available
|
2021-08-26 12:58:31 +08:00
|
|
|
#-------------------------------------------------------------------
|
2021-08-26 11:42:51 +08:00
|
|
|
if(NOT QMC_NO_SLOW_CUSTOM_TESTING_COMMANDS)
|
|
|
|
test_python_module(pyscf HAVE_PYSCF)
|
|
|
|
if(NOT HAVE_PYSCF)
|
|
|
|
message(STATUS "Unable to import PySCF python module. PySCF tests will not be run.")
|
|
|
|
else()
|
|
|
|
message(STATUS "Successfully imported PySCF python module.")
|
|
|
|
endif()
|
|
|
|
endif()
|
|
|
|
|
2021-08-26 12:58:31 +08:00
|
|
|
#-------------------------------------------------------------------
|
2021-08-26 11:42:51 +08:00
|
|
|
# Check if QE executables available at QE_BIN or on the PATH
|
2021-08-26 12:58:31 +08:00
|
|
|
#-------------------------------------------------------------------
|
2021-08-26 11:42:51 +08:00
|
|
|
if(NOT QMC_NO_SLOW_CUSTOM_TESTING_COMMANDS)
|
|
|
|
include("CMake/FindQE.cmake")
|
|
|
|
if(QE_FOUND)
|
|
|
|
message(STATUS "Found and using patched Quantum ESPRESSO (QE) with pw2qmcpack.x at ${QE_PW_DIR}")
|
|
|
|
else(QE_FOUND)
|
|
|
|
message(
|
|
|
|
STATUS "Did not find a patched Quantum ESPRESSO (QE) distribution with pw2qmcpack.x. QE tests will not be run.")
|
|
|
|
endif(QE_FOUND)
|
|
|
|
endif()
|
|
|
|
|
2021-08-26 12:58:31 +08:00
|
|
|
######################################################################
|
|
|
|
message(STATUS "Ready to parse QMCPACK source tree")
|
|
|
|
######################################################################
|
2013-10-19 04:27:59 +08:00
|
|
|
|
2021-06-06 02:24:40 +08:00
|
|
|
add_subdirectory(src)
|
2013-12-18 04:00:01 +08:00
|
|
|
|
2021-06-06 02:36:41 +08:00
|
|
|
if(NOT QMC_BUILD_SANDBOX_ONLY)
|
|
|
|
if(NOT QMC_NO_SLOW_CUSTOM_TESTING_COMMANDS)
|
2021-06-06 02:24:40 +08:00
|
|
|
add_subdirectory(tests)
|
|
|
|
add_subdirectory(examples)
|
2021-06-06 02:36:41 +08:00
|
|
|
endif()
|
|
|
|
if(IS_DIRECTORY "${PROJECT_SOURCE_DIR}/nexus" AND INSTALL_NEXUS)
|
2021-06-06 02:24:40 +08:00
|
|
|
add_subdirectory(nexus/tests)
|
2021-06-06 02:36:41 +08:00
|
|
|
endif()
|
|
|
|
endif()
|