2019-10-10 20:54:53 +08:00
######################################################################
# CMake version and policies
######################################################################
2020-11-05 09:12:08 +08:00
CMAKE_MINIMUM_REQUIRED ( VERSION 3.12.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 )
2020-04-02 06:15:55 +08:00
include ( CMakeDependentOption )
2013-12-18 04:00:01 +08:00
2005-11-18 01:29:59 +08:00
######################################################################
2019-10-10 20:54:53 +08:00
# QMCPACK
2005-11-18 01:29:59 +08:00
######################################################################
2019-10-10 20:54:53 +08:00
PROJECT ( qmcpack )
2017-01-28 07:20:36 +08:00
SET ( QMCPACK_VERSION_MAJOR 3 )
2020-11-11 03:47:46 +08:00
SET ( QMCPACK_VERSION_MINOR 10 )
2020-11-11 06:59:15 +08:00
SET ( QMCPACK_VERSION_PATCH 9 )
2017-01-19 05:34:50 +08:00
SET ( QMCPACK_VERSION "${QMCPACK_VERSION_MAJOR}.${QMCPACK_VERSION_MINOR}.${QMCPACK_VERSION_PATCH}" )
2005-11-03 06:23:38 +08:00
2019-11-08 04:48:24 +08:00
######################################################
# Directory where customize cmake files reside
######################################################
SET ( PROJECT_CMAKE ${ qmcpack_SOURCE_DIR } /CMake )
SET ( QMCPACK_UNIT_TEST_DIR ${ qmcpack_BINARY_DIR } /tests/bin )
2020-01-09 01:52:22 +08:00
######################################################################
# Verify Python3 available
######################################################################
2020-01-09 19:30:13 +08:00
INCLUDE ( CMake/python.cmake )
2020-11-05 09:12:08 +08:00
find_package ( Python3 )
2020-01-09 14:01:55 +08:00
IF ( NOT Python3_FOUND )
MESSAGE ( FATAL_ERROR "Could not find required python3" )
ENDIF ( NOT Python3_FOUND )
2020-05-15 06:59:20 +08:00
######################################################################
# Check is PySCF is availabile within Python
######################################################################
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 ( )
2019-05-31 01:31:41 +08:00
######################################################################
# Verify QE executables present if QE_BIN specified
######################################################################
IF ( DEFINED QE_BIN )
2019-05-31 04:42:14 +08:00
INCLUDE ( CMake/run_qe.cmake )
VERIFY_QE_PRESENT ( ${ QE_BIN } )
2019-05-31 01:31:41 +08:00
ENDIF ( )
2014-11-14 05:21:32 +08:00
######################################################################
2018-03-21 02:25:12 +08:00
# CTest
2014-11-14 05:21:32 +08:00
######################################################################
2019-07-16 02:16:09 +08:00
INCLUDE ( "${qmcpack_SOURCE_DIR}/CMake/macros.cmake" )
2014-11-14 05:21:32 +08:00
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 )
2016-02-08 23:00:30 +08:00
# Increase timeout per test over the default of 1500 seconds (25 minutes)
SET ( DART_TESTING_TIMEOUT 3600 CACHE STRING "Maximum time for one test" )
2014-11-14 05:21:32 +08:00
ENABLE_TESTING ( )
INCLUDE ( CTest )
2020-10-28 11:05:46 +08:00
OPTION ( QMC_SYMLINK_TEST_FILES "Use symbolic links for test files to save space. Set to false to copy files instead." ON )
2017-02-08 05:19:13 +08:00
2017-02-10 04:25:41 +08:00
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. For example, Titan at OLCF." )
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}" )
2020-01-11 01:11:21 +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
2020-10-28 11:05:46 +08:00
OPTION ( QMC_NO_SLOW_CUSTOM_TESTING_COMMANDS "Disable the slow cmake custom commands for integration tests." OFF )
2020-01-11 01:11:21 +08:00
MARK_AS_ADVANCED ( QMC_NO_SLOW_CUSTOM_TESTING_COMMANDS )
2009-10-29 02:27:53 +08:00
######################################################################
# Build level
######################################################################
2019-01-30 08:06:37 +08:00
2020-10-28 11:05:46 +08:00
OPTION ( QMC_BUILD_SANDBOX_ONLY "Build only applications in Sandbox directory" OFF )
2015-12-06 02:36:18 +08:00
IF ( NOT CMAKE_BUILD_TYPE AND NOT CMAKE_TOOLCHAIN_FILE )
2015-12-04 06:41:31 +08:00
SET ( CMAKE_BUILD_TYPE Release )
ENDIF ( )
2015-12-05 04:28:01 +08:00
STRING ( TOUPPER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE )
2015-12-19 00:56:57 +08:00
MESSAGE ( STATUS "CMAKE_BUILD_TYPE is ${CMAKE_BUILD_TYPE}" )
2009-10-29 02:27:53 +08:00
2006-04-15 05:54:50 +08:00
######################################################################
2004-08-25 03:21:10 +08:00
#define the paths for library and executable for out-of-soruce compilation
2006-04-15 05:54:50 +08:00
######################################################################
2006-10-19 04:57:15 +08:00
SET ( LIBRARY_OUTPUT_PATH ${ qmcpack_BINARY_DIR } /lib CACHE PATH "Single output directory for building all libraries." )
SET ( EXECUTABLE_OUTPUT_PATH ${ qmcpack_BINARY_DIR } /bin CACHE PATH "Single output directory for building all executables." )
2020-11-13 05:40:24 +08:00
##################################
# Set C++ standard used by QMCPACK
##################################
2020-11-13 14:33:00 +08:00
SET ( QMC_CXX_STANDARD 14 CACHE STRING "QMCPACK C++ language standard" )
2020-11-14 00:22:13 +08:00
IF ( NOT QMC_CXX_STANDARD EQUAL 14 )
2020-11-13 14:33:00 +08:00
MESSAGE ( WARNING "C++14 is the only language standard officially supported by this QMCPACK version. "
2020-11-14 00:36:58 +08:00
" U s i n g o t h e r v e r s i o n s o f t h e C + + s t a n d a r d i s u n s u p p o r t e d a n d d o n e e n t i r e l y a t u s e r ' s o w n r i s k . " )
2020-11-13 05:40:24 +08:00
ENDIF ( )
2009-12-23 23:49:53 +08:00
2006-10-19 04:57:15 +08:00
######################################################################
2006-11-24 07:00:56 +08:00
# Set the compiler-time parameters
2020-01-24 05:33:50 +08:00
# WALKER_MAX_PROPERTIES max number of observables + 12 or so standard
# props. Things like forces are per particle so you may need this to
# rather large. Each property increases walker size by
# 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
2006-11-24 07:00:56 +08:00
# QMC_COMPLEX = true if using complex wavefunctions
2018-03-21 02:25:12 +08:00
# QMC_MPI = enable MPI
# QMC_OMP = enable OMP
2006-10-19 04:57:15 +08:00
######################################################################
2020-05-08 05:49:52 +08:00
SET ( WALKER_MAX_PROPERTIES 2048 CACHE STRING "Maximum number of properties tracked by walkers" )
2020-01-11 06:47:32 +08:00
MARK_AS_ADVANCED ( WALKER_MAX_PROPERTIES )
2019-04-25 06:24:52 +08:00
SET ( OHMMS_DIM 3 CACHE STRING "Select physical dimension" )
2006-11-24 07:00:56 +08:00
SET ( OHMMS_INDEXTYPE int )
2016-10-07 00:03:27 +08:00
MESSAGE ( STATUS "defining the float point precision" )
2016-10-07 01:57:10 +08:00
SET ( OHMMS_PRECISION_FULL double )
2016-10-07 00:03:27 +08:00
IF ( QMC_CUDA )
SET ( QMC_MIXED_PRECISION 1 CACHE BOOL "Enable/disable mixed precision" )
2016-09-21 02:31:02 +08:00
SET ( OHMMS_PRECISION double )
2016-10-08 03:14:43 +08:00
SET ( CUDA_PRECISION_FULL double )
2016-10-07 00:03:27 +08:00
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}" )
2016-10-08 03:14:43 +08:00
MESSAGE ( " CUDA full precision = ${CUDA_PRECISION_FULL}" )
2016-10-07 00:03:27 +08:00
ELSE ( QMC_CUDA )
SET ( QMC_MIXED_PRECISION 0 CACHE BOOL "Enable/disable mixed precision" )
IF ( QMC_MIXED_PRECISION )
SET ( OHMMS_PRECISION float )
SET ( MIXED_PRECISION 1 )
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
2017-05-06 05:29:07 +08:00
# Code coverage
SET ( GCOV_SUPPORTED FALSE )
2020-10-28 11:05:46 +08:00
OPTION ( ENABLE_GCOV "Enable code coverage" OFF )
2017-05-06 05:29:07 +08:00
2009-08-13 05:23:52 +08:00
######################################################################
2020-03-04 03:20:39 +08:00
# enable MPI and OPENMP if possible
2009-08-13 05:23:52 +08:00
######################################################################
2020-10-27 15:25:14 +08:00
OPTION ( QMC_MPI "Enable/disable MPI" ON )
OPTION ( QMC_OMP "Enable/disable OpenMP" ON )
OPTION ( QMC_COMPLEX "Build for complex binary" OFF )
2019-03-27 09:06:10 +08:00
SET ( ENABLE_SOA 1 CACHE BOOL "Enable/disable SoA optimization" )
2020-06-23 13:44:19 +08:00
SET ( QMC_CUDA 0 CACHE BOOL "Build with GPU support through CUDA" )
OPTION ( ENABLE_CUDA "Build with the second generation of GPU support through CUDA (production quality for AFQMC, experimental for real space)" OFF )
OPTION ( ENABLE_HIP "Build with with GPU support through HIP" OFF )
OPTION ( ENABLE_ROCM "Build with with GPU support through ROCM" OFF )
2020-04-02 06:15:55 +08:00
OPTION ( ENABLE_OFFLOAD "Enable OpenMP offload" OFF )
2020-06-09 23:43:26 +08:00
# 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 )
2012-02-18 01:37:16 +08:00
2020-11-05 09:45:18 +08:00
IF ( USE_OBJECT_TARGET )
IF ( ${ CMAKE_VERSION } VERSION_LESS "3.14.0" )
MESSAGE ( FATAL_ERROR "USE_OBJECT_TARGET=ON requires cmake 3.14.0 or above!" )
ENDIF ( )
ENDIF ( )
2019-03-14 07:50:29 +08:00
IF ( ENABLE_CUDA AND QMC_CUDA )
MESSAGE ( FATAL_ERROR "ENABLE_CUDA=1 and QMC_CUDA=1 can not be set together!" )
ENDIF ( ENABLE_CUDA AND QMC_CUDA )
2012-02-18 01:37:16 +08:00
2020-10-28 11:05:46 +08:00
OPTION ( QMC_VERBOSE_CONFIGURATION "Give details why specific tests are/are not added" OFF )
2019-07-13 09:03:53 +08:00
2012-02-18 01:37:16 +08:00
######################################################################
# set debug printout
# DEBUG_PSIBUFFER_ON keep track buffer's locator
######################################################################
2020-10-28 11:05:46 +08:00
SET ( PRINT_DEBUG 0 CACHE BOOL "Enable/disable debug printing" )
2020-09-22 08:37:08 +08:00
SET ( DEBUG_PSIBUFFER_ON 0 CACHE BOOL "Debug messages for PSIBUFFER locator" )
MARK_AS_ADVANCED ( DEBUG_PSIBUFFER_ON )
SET ( DEBUG_PER_STEP_ACCEPT_REJECT 0 CACHE BOOL "Print accepts and rejects at each step" )
MARK_AS_ADVANCED ( DEBUG_PER_STEP_ACCEPT_REJECT )
2005-11-17 11:38:21 +08:00
2007-05-23 00:35:35 +08:00
######################################################################
# Standard test
######################################################################
2010-02-06 02:45:53 +08:00
SET ( CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/CMake" ${ CMAKE_MODULE_PATH } )
2011-09-15 05:41:49 +08:00
2013-12-18 04:00:01 +08:00
2011-09-15 05:41:49 +08:00
######################################################################
# add macros to compile einspline if necessary
######################################################################
2007-05-23 00:35:35 +08:00
INCLUDE ( ${ CMAKE_ROOT } /Modules/CheckFunctionExists.cmake )
2019-11-06 05:39:49 +08:00
INCLUDE ( ${ CMAKE_ROOT } /Modules/CheckCXXSymbolExists.cmake )
2008-05-13 22:48:20 +08:00
INCLUDE ( ${ CMAKE_ROOT } /Modules/CheckIncludeFile.cmake )
INCLUDE ( ${ CMAKE_ROOT } /Modules/CheckTypeSize.cmake )
2011-09-15 05:41:49 +08:00
2008-05-13 22:48:20 +08:00
CHECK_FUNCTION_EXISTS ( posix_memalign HAVE_POSIX_MEMALIGN )
CHECK_INCLUDE_FILE ( dlfcn.h HAVE_DLFCN_H )
CHECK_INCLUDE_FILE ( inttypes.h HAVE_INTTYPES_H )
CHECK_INCLUDE_FILE ( memory.h HAVE_MEMORY_H )
CHECK_INCLUDE_FILE ( sys/stat.h HAVE_SYS_STAT_H )
CHECK_INCLUDE_FILE ( sys/time.h HAVE_SYS_TIME_H )
CHECK_INCLUDE_FILE ( sys/types.h HAVE_SYS_TYPES_H )
CHECK_INCLUDE_FILE ( unistd.h HAVE_UNISTD_H )
2006-04-15 05:54:50 +08:00
######################################################################
2006-11-24 07:00:56 +08:00
# Build options
# QMC_BUILD_STATIC build static/dynamic libraries
# BUILD_QMCTOOLS build utility programs
# MPIP_PROFILE profile mpi performance
2006-04-15 05:54:50 +08:00
######################################################################
2016-12-08 23:40:59 +08:00
SET ( BUILD_UNIT_TESTS 1 CACHE BOOL "Build unit tests" )
2016-12-10 00:16:55 +08:00
SET ( BUILD_LMYENGINE_INTERFACE 1 CACHE BOOL "Build LMY engine" )
IF ( QMC_CUDA AND BUILD_LMYENGINE_INTERFACE )
2018-10-11 07:58:16 +08:00
MESSAGE ( STATUS "LMY engine is not compatible with CUDA build! Disabling LMY engine" )
2016-12-09 23:06:19 +08:00
SET ( BUILD_LMYENGINE_INTERFACE 0 )
ENDIF ( )
2016-12-08 23:40:59 +08:00
IF ( MIXED_PRECISION AND BUILD_LMYENGINE_INTERFACE )
2018-10-11 07:58:16 +08:00
MESSAGE ( STATUS "LMY engine is not compatible with CPU mixed precision build! Disabling LMY engine" )
2016-12-08 23:40:59 +08:00
SET ( BUILD_LMYENGINE_INTERFACE 0 )
ENDIF ( )
2019-02-05 00:37:12 +08:00
SET ( BUILD_AFQMC 0 CACHE BOOL "Build with AFQMC" )
2019-10-04 01:57:25 +08:00
SET ( BUILD_AFQMC_WITH_NCCL 0 CACHE BOOL "Build AFQMC with NCCL library." )
2019-03-28 11:39:50 +08:00
# AFQMC requires MPI.
2019-02-05 00:37:12 +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 ( )
2016-12-17 07:58:25 +08:00
SET ( BUILD_FCIQMC 0 CACHE BOOL "Build with FCIQMC" )
2012-03-22 09:14:56 +08:00
#SET(BUILD_QMCTOOLS 1 CACHE BOOL "Build tools for QMCPACK")
2011-09-15 05:41:49 +08:00
#SET(MPIP_PROFILE 0 CACHE BOOL "Build with mpip for mpi profile")
2012-03-22 09:14:56 +08:00
#SET(BUILD_QMCTOOLS 1)
2011-09-15 05:41:49 +08:00
#SET(MPIP_PROFILE 0)
2020-08-22 03:05:07 +08:00
OPTION ( QMC_BUILD_STATIC "Link to static libraries" OFF )
2020-09-03 00:12:11 +08:00
OPTION ( ENABLE_TIMERS "Enable internal timers" ON )
2020-08-22 03:05:07 +08:00
OPTION ( ENABLE_STACKTRACE "Enable use of boost::stacktrace" OFF )
2005-11-17 11:38:21 +08:00
2018-12-12 06:23:02 +08:00
######################################################################
# Install options
# INSTALL_NEXUS install Nexus alongside QMCPACK
######################################################################
SET ( INSTALL_NEXUS 1 CACHE BOOL "Install Nexus alongside QMCPACK" )
2006-04-15 05:54:50 +08:00
######################################################################
#list of options to determine libraries. First, try to use libraries available
2009-08-13 05:23:52 +08:00
#FindXYZ.cmake will set the values if successful
2004-08-25 03:21:10 +08:00
######################################################################
2020-02-06 13:05:55 +08:00
SET ( HAVE_EINSPLINE 1 ) # to be removed
2006-04-15 05:54:50 +08:00
SET ( HAVE_LIBXMLPP 0 )
SET ( HAVE_LIBBLITZ 0 )
SET ( HAVE_LIBGSL 0 )
2007-03-14 02:16:14 +08:00
SET ( MAC_VECLIB 0 )
2009-04-21 06:19:07 +08:00
2008-06-02 04:57:35 +08:00
######################################################
2017-01-19 05:34:50 +08:00
# Git information (see src/CMakeLists.txt for the
# command to get repository information)
2008-06-02 04:57:35 +08:00
######################################################
2017-01-19 05:34:50 +08:00
FIND_PACKAGE ( Git )
2018-01-18 04:49:50 +08:00
IF ( GIT_FOUND AND EXISTS "${PROJECT_SOURCE_DIR}/.git" )
SET ( IS_GIT_PROJECT 1 )
2017-01-19 05:34:50 +08:00
ENDIF ( )
2004-08-25 03:21:10 +08:00
######################################################
#COMPILER choose one of the cmake files to customize the compiler options
#If nothing is chosen, default settings by cmake will be used.
2018-03-21 02:25:12 +08:00
#If the automatic detection does not work, comment out everything
2007-01-05 03:41:39 +08:00
#upto COMPILER MANUAL SELECTION and use one of the customized cmake file.
2004-08-25 03:21:10 +08:00
######################################################
2008-07-20 02:42:58 +08:00
INCLUDE ( ${ CMAKE_ROOT } /Modules/CheckCCompilerFlag.cmake )
2016-11-24 00:23:20 +08:00
INCLUDE ( ${ CMAKE_ROOT } /Modules/CheckCXXCompilerFlag.cmake )
2007-10-11 01:23:18 +08:00
2008-06-02 04:57:35 +08:00
######################################################
2009-08-13 05:23:52 +08:00
# DO NOT MODIFY BELOW
# If you like to customize your build, create a toolchain as instructed
######################################################
######################################################
# now set the compiler flags and the macros in src/config.h
2008-06-02 04:57:35 +08:00
######################################################
2009-08-13 05:23:52 +08:00
IF ( CMAKE_TOOLCHAIN_FILE )
2011-09-15 05:41:49 +08:00
MESSAGE ( STATUS "Using ${CMAKE_TOOLCHAIN_FILE} toolchain " )
2009-08-13 05:23:52 +08:00
ELSE ( CMAKE_TOOLCHAIN_FILE )
2013-05-13 20:28:40 +08:00
MESSAGE ( STATUS "Trying to figure out ....." )
2009-08-13 05:23:52 +08:00
SET ( ENABLE_OPENMP 0 )
SET ( HAVE_ACML 0 )
2007-10-11 01:23:18 +08:00
2015-09-26 03:51:10 +08:00
#------------------------
# On Cray's machine
#------------------------
2020-06-16 00:50:46 +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! "
" P l e a s e u s e c c / C C a s t h e C / C + + c o m p i l e r t o e n s u r e c o r r e c t c r o s s - c o m p i l i n g f o r t h e c o m p u t e n o d e s "
" u n l e s s y o u u n d e r s t a n d c r o s s - c o m p i l i n g a n d i n t e n d n o t t o u s e C r a y c o m p i l e r w r a p p e r s . " )
ENDIF ( )
2020-06-13 10:59:58 +08:00
IF ( CMAKE_SYSTEM_NAME STREQUAL "CrayLinuxEnvironment" )
2016-07-07 02:09:02 +08:00
MESSAGE ( STATUS "Running on a Cray machine." )
2015-09-26 02:06:38 +08:00
2020-02-06 15:40:41 +08:00
IF ( NOT $ENV{ CRAYPE_LINK_TYPE } STREQUAL "dynamic" )
MESSAGE ( WARNING "Cray Programming Environment uses static linking by default. "
" W e p r e f e r d y n a m i c l i n k i n g w h i c h m a k e s l i b r a r y s e a r c h i n g e a s i e r . "
" S e t e n v i r o n m e n t v a r i a b l e C R A Y P E _ L I N K _ T Y P E t o \ " d y n a m i c \ " e n a b l e s d y n a m i c l i n k i n g . \ n " )
2020-01-13 18:38:34 +08:00
ENDIF ( )
2020-02-06 15:40:41 +08:00
IF ( NOT DEFINED MPIEXEC_EXECUTABLE )
FIND_PROGRAM ( MPIEXEC_EXECUTABLE aprun )
IF ( NOT MPIEXEC_EXECUTABLE )
# For slurm use srun
FIND_PROGRAM ( MPIEXEC_EXECUTABLE srun )
ENDIF ( NOT MPIEXEC_EXECUTABLE )
2020-01-13 18:38:34 +08:00
ENDIF ( )
2020-06-13 10:59:58 +08:00
ELSE ( )
2020-06-16 01:51:58 +08:00
IF ( $ENV{ CRAYPE_VERSION } MATCHES "." AND BASE_CXX_COMPILER_NAME STREQUAL "CC" )
2020-06-13 10:59:58 +08:00
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
2009-08-13 05:23:52 +08:00
#------------------------------------
2018-03-17 00:48:25 +08:00
# Identify the compiler -- This serves only to deal with case where only C or CXX is set, refactor?
2009-08-13 05:23:52 +08:00
#------------------------------------
2017-09-10 08:47:56 +08:00
IF ( CMAKE_C_COMPILER_WORKS OR CMAKE_C_COMPILER_WORKS )
2017-09-11 22:02:18 +08:00
IF ( ( CMAKE_CXX_COMPILER_ID MATCHES "GNU" ) OR ( CMAKE_C_COMPILER_ID MATCHES "GNU" ) )
2016-02-13 04:31:35 +08:00
SET ( COMPILER GNU )
2017-09-11 22:02:18 +08:00
ELSEIF ( ( CMAKE_CXX_COMPILER_ID MATCHES "XL" ) OR ( CMAKE_C_COMPILER_ID MATCHES "XL" ) )
2017-09-10 08:47:56 +08:00
SET ( COMPILER IBM )
2017-09-11 22:02:18 +08:00
ELSEIF ( ( CMAKE_CXX_COMPILER_ID MATCHES "Intel" ) OR ( CMAKE_C_COMPILER_ID MATCHES "Intel" ) )
2016-02-13 04:31:35 +08:00
SET ( COMPILER Intel )
2017-09-11 22:02:18 +08:00
ELSEIF ( ( CMAKE_CXX_COMPILER_ID MATCHES "PGI" ) OR ( CMAKE_C_COMPILER_ID MATCHES "PGI" ) )
2016-02-13 04:31:35 +08:00
SET ( COMPILER PGI )
2017-09-11 22:02:18 +08:00
ELSEIF ( ( CMAKE_CXX_COMPILER_ID MATCHES "Cray" ) OR ( CMAKE_C_COMPILER_ID MATCHES "Cray" ) )
2016-02-13 04:31:35 +08:00
SET ( COMPILER Cray )
2017-09-11 22:02:18 +08:00
ELSEIF ( ( CMAKE_CXX_COMPILER_ID MATCHES "Clang" ) OR ( CMAKE_C_COMPILER_ID MATCHES "Clang" ) )
2016-02-13 04:31:35 +08:00
SET ( COMPILER Clang )
ELSE ( )
SET ( USING_DEFAULT TRUE )
MESSAGE ( "${CMAKE_C_COMPILER_ID}" )
MESSAGE ( WARNING "Unknown C/C++ compiler, default flags will be used" )
ENDIF ( )
ELSE ( )
MESSAGE ( WARNING "No compiler identified" )
ENDIF ( )
MESSAGE ( STATUS "Compiler: ${COMPILER}" )
2008-05-14 02:12:10 +08:00
2009-08-13 05:23:52 +08:00
#------------------------------------
2016-02-13 04:31:35 +08:00
# Include compiler-specific cmake file
2009-08-13 05:23:52 +08:00
#------------------------------------
2016-02-13 04:31:35 +08:00
IF ( ${ COMPILER } MATCHES "IBM" )
INCLUDE ( ${ PROJECT_CMAKE } /IBMCompilers.cmake )
ELSEIF ( ${ COMPILER } MATCHES "Intel" )
2009-08-13 05:23:52 +08:00
INCLUDE ( ${ PROJECT_CMAKE } /IntelCompilers.cmake )
2016-02-13 04:31:35 +08:00
ELSEIF ( ${ COMPILER } MATCHES "GNU" )
INCLUDE ( ${ PROJECT_CMAKE } /GNUCompilers.cmake )
ELSEIF ( ${ COMPILER } MATCHES "Clang" )
INCLUDE ( ${ PROJECT_CMAKE } /ClangCompilers.cmake )
2018-11-03 04:56:44 +08:00
ELSEIF ( ${ COMPILER } MATCHES "PGI" )
INCLUDE ( ${ PROJECT_CMAKE } /PGICompilers.cmake )
2016-02-13 04:31:35 +08:00
ELSE ( )
MESSAGE ( WARNING "No default file for compiler (${COMPILER})" )
ENDIF ( )
2008-05-14 22:52:41 +08:00
2020-11-13 05:40:24 +08:00
ENDIF ( CMAKE_TOOLCHAIN_FILE )
2018-03-26 11:10:05 +08:00
2020-11-13 05:40:24 +08:00
###############################################
# Set C++ minimum standard and run basic checks
###############################################
set ( CMAKE_CXX_STANDARD ${ QMC_CXX_STANDARD } )
set ( CMAKE_CXX_STANDARD_REQUIRED ON )
set ( CMAKE_CXX_EXTENSIONS OFF )
#-----------------------------------------------------------------------
# Check that a C++ compiler is compatiable with the underlying libstdc++
#-----------------------------------------------------------------------
include ( CMake/Testlibstdc++.cmake )
#---------------------------------------------------------
# Check that a C++ standard library is configured properly
#---------------------------------------------------------
IF ( QMC_CXX_STANDARD GREATER_EQUAL 17 )
include ( CMake/TestCxx17Library.cmake )
ELSE ( )
2018-10-26 06:22:07 +08:00
include ( CMake/TestCxx14Library.cmake )
2020-11-13 05:40:24 +08:00
ENDIF ( )
2009-02-22 00:30:49 +08:00
2017-05-06 05:29:07 +08:00
IF ( ENABLE_GCOV )
IF ( NOT GCOV_SUPPORTED )
MESSAGE ( FATAL_ERROR "ENABLE_GCOV was specified but compiler does not support GCC coverage flag" )
ENDIF ( )
ENDIF ( ENABLE_GCOV )
2017-03-15 00:38:06 +08:00
IF ( BUILD_AFQMC AND NOT APPLE )
2016-12-16 12:57:17 +08:00
LINK_LIBRARIES ( "rt" )
ENDIF ( )
2018-03-17 00:48:25 +08:00
2020-02-06 15:40:41 +08:00
#-------------------------------------------------------------------
# check MPI installation
#-------------------------------------------------------------------
IF ( QMC_MPI )
2020-02-13 12:45:41 +08:00
# for backward compatibility with MPIEXEC
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 )
2020-02-07 13:52:08 +08:00
SET ( MPI_CXX_SKIP_MPICXX TRUE )
2020-06-13 14:54:37 +08:00
IF ( NOT CMAKE_CROSSCOMPILING )
SET ( MPI_DETERMINE_LIBRARY_VERSION TRUE )
ENDIF ( )
2020-02-06 15:40:41 +08:00
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 )
2020-07-30 03:51:30 +08:00
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. "
" U s e a d i f f e r e n t M P I l i b r a r y o r a M V A P I C H 2 > = 2 . 4 "
" o r b u i l d M V A P I C H 2 w i t h - - d i s a b l e - r e g i s t r a t i o n - c a c h e c o n f i g u r e o p t i o n . " )
ENDIF ( )
2014-11-20 02:28:35 +08:00
ENDIF ( )
2015-09-26 03:51:10 +08:00
2020-03-04 02:12:19 +08:00
IF ( ${ MPI_CXX_LIBRARY_VERSION_STRING } MATCHES "Open MPI" )
IF ( NOT MPIEXEC_PREFLAGS )
SET ( MPIEXEC_PREFLAGS "--bind-to;none" )
2020-03-04 03:20:39 +08:00
MESSAGE ( STATUS "Detected Open MPI. Setting bind-to options for thread affinity in MPIEXEC_PREFLAGS." )
2020-03-04 02:12:19 +08:00
ELSE ( NOT MPIEXEC_PREFLAGS )
IF ( NOT "${MPIEXEC_PREFLAGS}" MATCHES "--bind-to" )
2020-03-04 03:05:47 +08:00
MESSAGE ( WARNING "Default Open MPI thread affinity policy may bind all the threads to a single core and "
" s i g n i f i c a n t l y s l o w d o w n t e s t i n g . A d d p r o p e r - - b i n d - t o o p t i o n s v i a M P I E X E C _ P R E F L A G S . "
2020-03-04 02:12:19 +08:00
" I f y o u d o n ' t k n o w e x a c t l y w h a t a f f i n i t y t o a d d , "
" a d d ' - - b i n d - t o ; n o n e ' t o y o u r c u r r e n t M P I E X E C _ P R E F L A G S t o s t o p t h i s w a r n i n g . " )
ENDIF ( )
ENDIF ( NOT MPIEXEC_PREFLAGS )
ENDIF ( )
2020-02-06 15:40:41 +08:00
IF ( NOT ${ CMAKE_CXX_COMPILER } STREQUAL ${ MPI_CXX_COMPILER } )
SET ( MPI_WARNING_LIST
" B u i l d i n g M P I v e r s i o n w i t h o u t u s i n g M P I c o m p i l e r w r a p p e r s . \ n "
" T h i s m a y n o t b u i l d q m c p a c k c o r r e c t l y . T o e n s u r e t h e c o r r e c t v e r s i o n , s p e c i f y t h e c o m p i l e r w r a p p e r s t o c m a k e . \ n "
" F o r e x a m p l e : c m a k e - D C M A K E _ C _ C O M P I L E R = m p i c c - D C M A K E _ C X X _ C O M P I L E R = m p i c + + \ n "
" T o b u i l d w i t h o u t M P I , p a s s ' - D Q M C _ M P I = 0 ' t o c m a k e " )
MESSAGE ( WARNING ${ MPI_WARNING_LIST } )
2019-11-26 04:55:20 +08:00
ENDIF ( )
2014-11-20 02:28:35 +08:00
IF ( NOT TEST_MAX_PROCS )
SET ( TEST_MAX_PROCS 100 )
ENDIF ( )
2016-02-02 04:57:00 +08:00
2020-02-06 15:40:41 +08:00
MESSAGE ( STATUS "MPI runner MPIEXEC_EXECUTABLE : ${MPIEXEC_EXECUTABLE}" )
MESSAGE ( STATUS "MPIEXEC_NUMPROC_FLAG : ${MPIEXEC_NUMPROC_FLAG}" )
MESSAGE ( STATUS "MPIEXEC_PREFLAGS : ${MPIEXEC_PREFLAGS}" )
2020-03-04 02:12:19 +08:00
STRING ( REPLACE ";" " " MPIEXEC_PREFLAGS_PRINT "${MPIEXEC_PREFLAGS}" )
MESSAGE ( STATUS "Tests run as : ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} NUM_PROCS ${MPIEXEC_PREFLAGS_PRINT} EXECUTABLE" )
2014-11-20 02:28:35 +08:00
2020-02-06 15:40:41 +08:00
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
2009-12-23 23:49:53 +08:00
####################################################################
#First check the required libraries. Abort if these are not found.
#Changed the fall-back versions to use similar conventions to 2.8.0 and higher
####################################################################
2010-01-05 01:14:34 +08:00
# use customized cmake file for boost so that we can deal with multiple
# installataions
2011-09-15 05:41:49 +08:00
# list of libraries to be linked with the main applications using I/O
2016-05-18 09:52:12 +08:00
2020-10-27 15:25:14 +08:00
#-------------------------------------------------------------------
# check lapack/blas
#-------------------------------------------------------------------
# Add Math::BLAS_LAPACK target
ADD_LIBRARY ( Math::BLAS_LAPACK INTERFACE IMPORTED )
2020-10-28 08:17:18 +08:00
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 )
2020-10-28 08:35:42 +08:00
MESSAGE ( STATUS "Trying to find LAPACK from Intel MKL" )
2020-10-31 12:00:04 +08:00
IF ( QMC_OMP AND CMAKE_CXX_COMPILER_ID MATCHES "Intel" )
2020-10-28 08:17:18 +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 )
2020-10-28 08:17:18 +08:00
IF ( NOT LAPACK_FOUND )
2020-10-28 08:35:42 +08:00
MESSAGE ( STATUS "Intel MKL library files not found via FindLAPACK." )
2020-10-28 08:17:18 +08:00
MESSAGE ( STATUS "Trying to find alternative LAPACK libraries" )
SET ( BLA_VENDOR All )
find_package ( LAPACK REQUIRED )
ENDIF ( )
ELSE ( )
MESSAGE ( STATUS "Trying to find LAPACK library as requested BLA_VENDOR=${BLA_VENDOR}" )
find_package ( LAPACK REQUIRED )
ENDIF ( )
2020-10-27 15:25:14 +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
# Detects MKL header files and other components.
2020-10-27 15:25:14 +08:00
IF ( LAPACK_LIBRARIES MATCHES "mkl_core" )
INCLUDE ( CMake/FindMKL.cmake )
ENDIF ( )
2020-10-28 08:17:18 +08:00
# AFQMC requires MKL sparse for good performance (roughly a factor of 2x)
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-02-08 19:55:57 +08:00
#-------------------------------------------------------------------
# set up scalar/vector math libraries
#-------------------------------------------------------------------
SET ( ENABLE_MASS FALSE CACHE BOOL "ENABLE MASS scalar and vector math libraries for Power architecture" )
# This needs to go before HAVE_SINCOS
IF ( ENABLE_MASS )
INCLUDE ( CMake/FindIBMMASS.cmake )
ENDIF ( ENABLE_MASS )
2020-06-21 06:36:09 +08:00
IF ( NOT MASS_FOUND AND NOT HAVE_MKL_VML )
2020-02-08 19:55:57 +08:00
MESSAGE ( STATUS "No usable vector math library detected." )
ADD_LIBRARY ( Math::scalar_vector_functions INTERFACE IMPORTED )
2020-06-21 06:36:09 +08:00
ENDIF ( NOT MASS_FOUND AND NOT HAVE_MKL_VML )
2020-02-08 19:55:57 +08:00
# CheckSincos relies on SINCOS_INCLUDE which may be modified based on vendor libraries
IF ( NOT SINCOS_INCLUDE )
SET ( SINCOS_INCLUDE cmath )
ENDIF ( NOT SINCOS_INCLUDE )
MESSAGE ( STATUS "SINCOS_INCLUDE : ${SINCOS_INCLUDE}" )
INCLUDE ( ${ PROJECT_CMAKE } /CheckSincos.cmake )
2019-11-06 05:39:49 +08:00
2020-02-08 19:55:57 +08:00
#-------------------------------------------------------------------
# set up FFTW3 library
#-------------------------------------------------------------------
2016-05-18 09:52:12 +08:00
SET ( FFTW_FOUND 0 )
IF ( HAVE_MKL )
IF ( HAVE_MKL_FFTW3 )
SET ( FFTW_FOUND 1 )
ENDIF ( )
ENDIF ( )
IF ( NOT FFTW_FOUND )
find_package ( FFTW )
ENDIF ( )
IF ( FFTW_FOUND )
SET ( HAVE_LIBFFTW 1 )
MESSAGE ( STATUS "Found FFTW" )
ELSE ( FFTW_FOUND )
2016-12-14 02:46:20 +08:00
# MESSAGE(STATUS "Disabling FFTW")
MESSAGE ( FATAL_ERROR "Could not find required library FFTW. Verify FFTW_HOME" )
2016-05-18 09:52:12 +08:00
ENDIF ( FFTW_FOUND )
2018-03-21 02:25:12 +08:00
2016-05-18 09:52:12 +08:00
SET ( QMC_UTIL_LIBS ${ QMC_UTIL_LIBS } ${ FORTRAN_LIBRARIES } )
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
#-------------------------------------------------------------------
2019-12-07 07:15:11 +08:00
IF ( HAVE_MPI )
2020-10-28 11:05:46 +08:00
SET ( HDF5_PREFER_PARALLEL TRUE CACHE BOOL "Request parallel/serial HDF5 library" )
2019-12-07 07:15:11 +08:00
ELSE ( HAVE_MPI )
2020-10-28 11:05:46 +08:00
SET ( HDF5_PREFER_PARALLEL FALSE CACHE BOOL "Request parallel/serial HDF5 library" )
2019-12-07 07:15:11 +08:00
IF ( HDF5_PREFER_PARALLEL )
MESSAGE ( FATAL_ERROR "Parallel HDF5 library cannot be selected with QMCPACK non-MPI build. "
" P l e a s e s e t H D F 5 _ P R E F E R _ P A R A L L E L = 0 . " )
ENDIF ( HDF5_PREFER_PARALLEL )
ENDIF ( HAVE_MPI )
2015-09-26 02:06:38 +08:00
if ( QMC_BUILD_STATIC )
2019-12-07 07:15:11 +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 ( )
MESSAGE ( STATUS "Linking dynamic HDF5 library" )
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
2009-12-23 23:49:53 +08:00
IF ( HDF5_FOUND )
2004-08-25 03:21:10 +08:00
SET ( HAVE_LIBHDF5 1 )
2019-12-07 07:15:11 +08:00
IF ( HDF5_IS_PARALLEL )
MESSAGE ( STATUS "Parallel HDF5 library found" )
2020-10-28 11:05:46 +08:00
OPTION ( ENABLE_PHDF5 "Enable code paths using parallel HDF5" ON )
2019-12-07 07:15:11 +08:00
ELSE ( HDF5_IS_PARALLEL )
MESSAGE ( STATUS "Serial HDF5 library found" )
2020-10-28 11:05:46 +08:00
OPTION ( ENABLE_PHDF5 "Enable code paths using parallel HDF5" OFF )
2019-12-07 07:15:11 +08:00
IF ( ENABLE_PHDF5 )
IF ( HAVE_MPI )
MESSAGE ( FATAL_ERROR "Parallel HDF5 code paths requested but serial HDF5 library found! "
" P l e a s e e i t h e r p r o v i d e p a r a l l e l H D F 5 l i b r a r y o r s e t E N A B L E _ P H D F 5 = 0 . " )
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 potential performance loss not using parallel HDF5!" )
ENDIF ( )
2015-12-05 04:28:01 +08:00
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 ( )
2020-02-08 20:59:39 +08:00
ADD_LIBRARY ( IO::HDF5 INTERFACE IMPORTED )
SET_TARGET_PROPERTIES ( IO::HDF5 PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${HDF5_INCLUDE_DIR}"
I N T E R F A C E _ C O M P I L E _ D E F I N I T I O N S " H A V E _ L I B H D F 5 ; H 5 _ U S E _ 1 6 _ A P I "
I N T E R F A C E _ L I N K _ L I B R A R I E S " $ { H D F 5 _ L I B R A R I E S } " )
IF ( ENABLE_PHDF5 )
SET_PROPERTY ( TARGET IO::HDF5 APPEND PROPERTY INTERFACE_COMPILE_DEFINITIONS "ENABLE_PHDF5" )
ENDIF ( ENABLE_PHDF5 )
2009-12-23 23:49:53 +08:00
ELSE ( HDF5_FOUND )
2020-01-31 03:53:48 +08:00
MESSAGE ( FATAL_ERROR "HDF5 not found. Set HDF5_ROOT" )
2009-12-23 23:49:53 +08:00
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
#make sure we can find boost if it's not in /usr
set ( Boost_NO_BOOST_CMAKE on )
2018-12-15 05:27:51 +08:00
find_package ( Boost 1.61.0 REQUIRED )
2009-12-23 23:49:53 +08:00
IF ( Boost_FOUND )
2020-02-08 20:59:39 +08:00
SET_PROPERTY ( TARGET Boost::boost APPEND PROPERTY INTERFACE_COMPILE_DEFINITIONS "HAVE_LIBBOOST" )
2015-09-26 02:06:38 +08:00
MESSAGE ( STATUS "Setting Boost_INCLUDE_DIRS=${Boost_INCLUDE_DIRS}" )
2009-12-23 23:49:53 +08:00
ELSE ( )
2018-12-15 05:27:51 +08:00
MESSAGE ( FATAL_ERROR "Need boost 1.61.0 or higher. Set BOOST_ROOT" )
2009-12-23 23:49:53 +08:00
ENDIF ( )
2020-02-08 20:59:39 +08:00
#-------------------------------------------------------------------
# set up CUDA compiler options and libraries
#-------------------------------------------------------------------
2015-09-26 02:06:38 +08:00
SET ( HAVE_CUDA 0 )
2019-03-13 07:43:48 +08:00
IF ( QMC_CUDA OR ENABLE_CUDA )
2020-06-27 11:31:36 +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.
OPTION ( CUDA_PROPAGATE_HOST_FLAGS "Propagate C/CXX_FLAGS and friends to the host compiler via -Xcompile" OFF )
2015-09-26 02:06:38 +08:00
FIND_PACKAGE ( CUDA REQUIRED )
2020-02-06 13:05:55 +08:00
SET ( CUDA_LINK_LIBRARIES_KEYWORD PRIVATE )
2015-09-26 02:06:38 +08:00
#set(CUDA_NVCC_FLAGS
# "-arch=sm_20;-Drestrict=__restrict__;-DNO_CUDA_MAIN;-O3;-use_fast_math")
2012-02-18 01:37:16 +08:00
if ( CUDA_NVCC_FLAGS MATCHES "arch" )
2015-12-19 00:56:57 +08:00
# User defined NVCC flags
2013-12-18 04:00:01 +08:00
MESSAGE ( STATUS "Setting CUDA FLAGS=${CUDA_NVCC_FLAGS}" )
2015-09-26 02:06:38 +08:00
else ( CUDA_NVCC_FLAGS MATCHES "arch" )
2015-12-19 00:56:57 +08:00
# Automatically set the default NVCC flags
2020-05-25 15:16:44 +08:00
SET ( CUDA_NVCC_FLAGS "-Drestrict=__restrict__;-DNO_CUDA_MAIN;-std=c++14" )
2017-01-20 07:03:57 +08:00
if ( QMC_COMPLEX )
SET ( CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS};-DQMC_COMPLEX" )
endif ( )
2015-12-19 00:56:57 +08:00
if ( CMAKE_BUILD_TYPE STREQUAL "DEBUG" )
SET ( CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS};-g;-G" )
else ( )
# Temporarily disable fast_math because it causes multiple test failures
# SET(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS};-O3;-use_fast_math")
SET ( CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS};-O3" )
ENDIF ( )
2020-06-11 01:49:32 +08:00
SET ( CUDA_ARCH sm_70 CACHE STRING "CUDA architecture sm_XX" )
2017-06-02 01:42:44 +08:00
SET ( CUDA_NVCC_FLAGS "-arch=${CUDA_ARCH};${CUDA_NVCC_FLAGS}" )
2015-09-26 02:06:38 +08:00
endif ( CUDA_NVCC_FLAGS MATCHES "arch" )
2018-11-09 01:24:08 +08:00
INCLUDE_DIRECTORIES ( ${ CUDA_INCLUDE_DIRS } )
2020-02-08 20:59:39 +08:00
SET ( HAVE_CUDA 1 )
2016-02-01 06:54:29 +08:00
MESSAGE ( " CUDA_NVCC_FLAGS=${CUDA_NVCC_FLAGS}" )
2019-03-13 07:43:48 +08:00
ELSE ( QMC_CUDA OR ENABLE_CUDA )
2015-12-19 00:56:57 +08:00
MESSAGE ( STATUS "Disabling CUDA" )
2019-03-13 07:43:48 +08:00
ENDIF ( QMC_CUDA OR ENABLE_CUDA )
2010-02-06 02:45:53 +08:00
2020-10-28 11:05:46 +08:00
OPTION ( USE_NVTX_API "Enable/disable NVTX regions in CUDA code." OFF )
2018-07-06 07:05:54 +08:00
IF ( USE_NVTX_API )
2020-11-12 07:17:05 +08:00
IF ( HAVE_CUDA OR ENABLE_OFFLOAD )
2018-07-06 07:05:54 +08:00
FIND_LIBRARY ( NVTX_API_LIB
N A M E n v T o o l s E x t
H I N T S $ { C U D A _ T O O L K I T _ R O O T _ D I R }
P A T H _ S U F F I X E S l i b l i b 6 4 )
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}" )
2018-07-06 07:45:59 +08:00
LINK_LIBRARIES ( ${ NVTX_API_LIB } )
2020-11-12 07:17:05 +08:00
ENDIF ( HAVE_CUDA OR ENABLE_OFFLOAD )
2018-07-06 07:05:54 +08:00
ENDIF ( USE_NVTX_API )
2020-06-23 13:44:19 +08:00
#-------------------------------------------------------------------
# set up ROCM compiler options and libraries
#-------------------------------------------------------------------
IF ( ENABLE_ROCM )
MESSAGE ( STATUS "ROCM_ROOT: ${ROCM_ROOT}" )
ADD_LIBRARY ( ROCM::libraries INTERFACE IMPORTED )
# temporarily put rocsolver rocrand here for convenience, should be moved to Platforms.
SET_TARGET_PROPERTIES ( ROCM::libraries PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${ROCM_ROOT}/include"
I N T E R F A C E _ L I N K _ L I B R A R I E S " - L $ { R O C M _ R O O T } / l i b ; - l r o c s o l v e r ; - l r o c r a n d " )
ENDIF ( ENABLE_ROCM )
#-------------------------------------------------------------------
# set up HIP compiler options
#-------------------------------------------------------------------
IF ( ENABLE_HIP )
IF ( NOT ENABLE_ROCM )
MESSAGE ( FATAL_ERROR "ROCM is required to use HIP. Please set ENABLE_ROCM=ON." )
ENDIF ( )
SET ( CMAKE_MODULE_PATH "${ROCM_ROOT}/hip/cmake" ${ CMAKE_MODULE_PATH } )
FIND_PACKAGE ( HIP REQUIRED )
ADD_LIBRARY ( HIP::HIP INTERFACE IMPORTED )
# temporarily put hipsparse hipblas here for convenience, should be moved to Platforms.
2020-06-23 13:56:34 +08:00
SET_TARGET_PROPERTIES ( HIP::HIP PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${ROCM_ROOT}/include"
2020-09-19 06:04:52 +08:00
I N T E R F A C E _ C O M P I L E _ D E F I N I T I O N S " E N A B L E _ H I P "
2020-09-22 07:36:00 +08:00
I N T E R F A C E _ L I N K _ L I B R A R I E S " - L $ { R O C M _ R O O T } / l i b ; - l h i p s p a r s e ; - l h i p b l a s ; - l a m d h i p 6 4 " )
2020-06-23 13:44:19 +08:00
ENDIF ( ENABLE_HIP )
2009-12-23 23:49:53 +08:00
######################################################
# Add optional macros
######################################################
2015-09-26 02:06:38 +08:00
2012-02-18 01:37:16 +08:00
#include qmcpack/src build/src
INCLUDE_DIRECTORIES ( ${ PROJECT_SOURCE_DIR } /src ${ PROJECT_BINARY_DIR } /src )
2018-01-17 03:54:45 +08:00
IF ( USE_VTUNE_TASKS )
IF ( NOT ENABLE_TIMERS )
2020-08-22 03:05:07 +08:00
MESSAGE ( FATAL_ERROR "USE_VTUNE_TASKS is set, but timers are not enabled. Set ENABLE_TIMERS=ON." )
2018-01-17 03:54:45 +08:00
ENDIF ( )
SET ( USE_VTUNE_API 1 )
ENDIF ( )
IF ( USE_VTUNE_API )
include ( CheckIncludeFileCXX )
CHECK_INCLUDE_FILE_CXX ( ittnotify.h HAVE_ITTNOTIFY_H )
IF ( NOT HAVE_ITTNOTIFY_H )
MESSAGE ( FATAL_ERROR "USE_VTUNE_API is defined, but the ittnotify.h include file is not found. Check that the correct include directory is present in CMAKE_CXX_FLAGS." )
ENDIF ( )
FIND_LIBRARY ( VTUNE_ITTNOTIFY_LIBRARY ittnotify )
IF ( NOT VTUNE_ITTNOTIFY_LIBRARY )
MESSAGE ( FATAL_ERROR "USE_VTUNE_API is defined, but the ittnotify library is not found. Check that correct library path is present in CMAKE_LIBRARY_PATH." )
ENDIF ( )
LINK_LIBRARIES ( "${VTUNE_ITTNOTIFY_LIBRARY}" )
ENDIF ( )
2020-10-28 11:05:46 +08:00
OPTION ( QMC_EXP_THREADING "Experimental non openmp threading models" OFF )
2019-08-16 04:19:41 +08:00
MARK_AS_ADVANCED ( QMC_EXP_THREADING )
IF ( QMC_EXP_THREADING )
include ( CheckAtomic )
IF ( HAVE_LIBATOMIC )
2019-08-16 05:43:17 +08:00
LINK_LIBRARIES ( "${HAVE_LIBATOMIC}" )
2019-08-16 04:19:41 +08:00
ENDIF ( HAVE_LIBATOMIC )
ADD_DEFINITIONS ( -DQMC_EXP_THREADING )
ENDIF ( QMC_EXP_THREADING )
2012-02-18 01:37:16 +08:00
#include(ExternalProject)
# set(einspline_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/einspline")
# set(einspline_INSTALL_DIR "${CMAKE_CURRENT_BINARY_DIR}/einspline")
# set(einspline_CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${einspline_INSTALL_DIR})
#ExternalProject_Add(
# einspline
# SVN_REPOSITORY http://qmctools.googlecode.com/svn/ext-packages/einspline
# )
# INSTALL_DIR ${einspline_INSTALL_DIR}
# CMAKE_ARGS ${einspline_CMAKE_ARGS}
# )
# find_package(einspline REQUIRED)
# set(HAVE_EINSPLINE 1)
2018-04-04 04:14:56 +08:00
2008-05-13 22:48:20 +08:00
2016-05-18 09:52:12 +08:00
###############################################################
# for specific linker in the case of profiling like hpctoolkit.
###############################################################
if ( CMAKE_CXX_LINKER )
set ( CMAKE_CXX_LINK_EXECUTABLE
" $ { C M A K E _ C X X _ L I N K E R } < F L A G S > < C M A K E _ C X X _ L I N K _ F L A G S > < L I N K _ F L A G S > < O B J E C T S > - o < T A R G E T > < L I N K _ L I B R A R I E S > " )
MESSAGE ( STATUS "Linker is specified as '${CMAKE_CXX_LINKER}' instead of '${CMAKE_CXX_COMPILER}'" )
endif ( )
2014-11-14 05:21:32 +08:00
###################################################
# Add user extra flags
###################################################
2016-01-06 03:37:18 +08:00
IF ( QMC_INCLUDE )
FOREACH ( tmp ${ QMC_INCLUDE } )
MESSAGE ( STATUS "Adding '${tmp}' to include directories" )
INCLUDE_DIRECTORIES ( "${tmp}" )
ENDFOREACH ( )
ENDIF ( )
2014-11-20 02:28:35 +08:00
IF ( QMC_EXTRA_LIBS )
string ( REPLACE " " ";" QMC_EXTRA_LIBS ${ QMC_EXTRA_LIBS } )
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
2016-02-06 13:16:11 +08:00
# Avoid unused variables warnings (for now) by using for information purposes
IF ( QMC_DATA )
MESSAGE ( STATUS "QMC_DATA is ${QMC_DATA}" )
ENDIF ( )
IF ( ENABLE_GCOV )
MESSAGE ( STATUS "GCOV is enabled" )
ENDIF ( )
2018-03-22 22:11:33 +08:00
############################################################
# FLAGS at the project level
############################################################
#this might be redundant but maybe not in all CMake versions.
2018-03-26 05:14:54 +08:00
STRING ( TOUPPER "${CMAKE_BUILD_TYPE}" THIS_CONFIG )
2018-03-22 22:11:33 +08:00
2018-03-26 05:14:54 +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
2018-03-26 05:14:54 +08:00
SET ( TMP_PROJECT_CMAKE_ ${ lang } _FLAGS "${PROJECT_CMAKE_${lang}_FLAGS} ${CMAKE_${lang}_FLAGS_${THIS_CONFIG}}" )
2018-03-22 22:23:28 +08:00
MESSAGE ( "Project ${lang}_FLAGS: ${TMP_PROJECT_CMAKE_${lang}_FLAGS}" )
2018-03-26 05:14:54 +08:00
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 )
MESSAGE ( "Project INCLUDE_DIRECTORIES: ${TMP_PROJECT_INCLUDE_DIRECTORIES}" )
2018-03-26 05:14:54 +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}}" )
2018-03-22 22:23:28 +08:00
MESSAGE ( "Project ${target_type}_LINKER_FLAGS: ${TMP_PROJECT_CMAKE_${target_type}_LINKER_FLAGS}" )
2018-03-26 05:14:54 +08:00
ENDFOREACH ( target_type IN ITEMS EXE SHARED )
2018-03-22 22:11:33 +08:00
2008-05-14 22:52:41 +08:00
###################################################
# Done searching libraries. Start building qmcpack
###################################################
2011-09-15 05:41:49 +08:00
MESSAGE ( STATUS "Ready to build qmcpack" )
2008-05-14 22:52:41 +08:00
2009-12-23 23:49:53 +08:00
####################################################################
# add definitions
####################################################################
2013-05-13 20:28:40 +08:00
2020-02-08 20:59:39 +08:00
ADD_DEFINITIONS ( -DHAVE_CONFIG_H -DUSE_REAL_STRUCT_FACTOR -DADD_ )
2013-12-03 02:09:25 +08:00
2013-12-18 04:00:01 +08:00
EXECUTE_PROCESS ( COMMAND hostname OUTPUT_VARIABLE QMC_HOSTNAME OUTPUT_STRIP_TRAILING_WHITESPACE )
2017-11-25 02:40:25 +08:00
CONFIGURE_FILE ( ${ qmcpack_SOURCE_DIR } /src/qmcpack.settings ${ qmcpack_BINARY_DIR } /bin/qmcpack.settings )
2018-12-05 11:40:54 +08:00
INSTALL ( FILES ${ qmcpack_BINARY_DIR } /bin/qmcpack.settings DESTINATION bin )
2018-12-12 06:23:02 +08:00
IF ( INSTALL_NEXUS )
INSTALL ( CODE "EXECUTE_PROCESS(COMMAND ${qmcpack_SOURCE_DIR}/nexus/install --leave_paths ${CMAKE_INSTALL_PREFIX}/bin)" )
ENDIF ( )
2013-10-19 04:27:59 +08:00
2004-08-25 03:21:10 +08:00
SUBDIRS ( src )
2013-12-18 04:00:01 +08:00
2019-01-30 08:06:37 +08:00
IF ( NOT QMC_BUILD_SANDBOX_ONLY )
2020-01-13 23:44:17 +08:00
IF ( NOT QMC_NO_SLOW_CUSTOM_TESTING_COMMANDS )
2020-01-09 02:32:17 +08:00
SUBDIRS ( tests )
SUBDIRS ( examples )
ENDIF ( )
IF ( IS_DIRECTORY "${PROJECT_SOURCE_DIR}/nexus" AND INSTALL_NEXUS )
2018-04-28 01:11:18 +08:00
SUBDIRS ( nexus/tests )
2017-10-04 22:47:44 +08:00
ENDIF ( )
2017-06-22 05:12:43 +08:00
ENDIF ( )