2019-10-10 20:54:53 +08:00
######################################################################
# CMake version and policies
######################################################################
2020-02-06 15:40:41 +08:00
CMAKE_MINIMUM_REQUIRED ( VERSION 3.10.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
2019-10-17 03:58:42 +08:00
IF ( ${ CMAKE_VERSION } VERSION_GREATER_EQUAL "3.12.0" )
cmake_policy ( SET CMP0074 NEW )
2019-11-06 05:39:49 +08:00
cmake_policy ( SET CMP0075 NEW )
2019-10-17 03:58:42 +08:00
ENDIF ( ${ CMAKE_VERSION } VERSION_GREATER_EQUAL "3.12.0" )
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-02-12 03:02:40 +08:00
SET ( QMCPACK_VERSION_MINOR 9 )
2020-04-29 23:47:14 +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 )
IF ( ${ CMAKE_VERSION } VERSION_LESS "3.12.0" )
TEST_PYTHON_MODULE ( "os" Python3_FOUND )
ELSE ( )
find_package ( Python3 )
ENDIF ( )
2020-01-09 14:01:55 +08:00
IF ( NOT Python3_FOUND )
MESSAGE ( FATAL_ERROR "Could not find required python3" )
ENDIF ( NOT Python3_FOUND )
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 )
2017-02-08 05:19:13 +08:00
SET ( QMC_SYMLINK_TEST_FILES TRUE CACHE BOOL "Use symbolic links for test files to save space. Set to false to copy files instead." )
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
SET ( QMC_NO_SLOW_CUSTOM_TESTING_COMMANDS FALSE CACHE BOOL "Disable the slow cmake custom commands for integration tests." )
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
2019-04-25 06:24:52 +08:00
SET ( QMC_BUILD_SANDBOX_ONLY OFF CACHE BOOL "Build only applications in Sandbox directory" )
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." )
2009-12-23 23:49:53 +08:00
######################################################################
# build include and library paths required for the projects
# For XYZ library, set an environment as
# export XYZ_HOME='root-of-the-library'
# XYZ_HOME/include
# XYZ_HOME/lib
# IF XYZ library is found, XYZ_FOUND is set to true
#
# find_package is used with cmake 2.8 and higher
######################################################################
2011-09-15 05:41:49 +08:00
#if(APPLE)
# set(QMC_INCLUDE_PATHS ${QMC_INCLUDE_PATHS} /sw/include)
# set(QMC_LIBRARY_PATHS ${QMC_LIBRARY_PATHS} /sw/lib)
#endif(APPLE)
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 )
SET ( ENABLE_GCOV FALSE CACHE BOOL "Enable code coverage" )
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
######################################################################
2008-04-05 01:31:32 +08:00
SET ( QMC_MPI 1 CACHE BOOL "Enable/disable MPI" )
2009-02-22 03:08:23 +08:00
SET ( QMC_OMP 1 CACHE BOOL "Enable/disable OpenMP" )
2019-04-25 06:24:52 +08:00
SET ( QMC_COMPLEX 0 CACHE BOOL "Build for complex binary" )
2009-08-13 05:23:52 +08:00
SET ( PRINT_DEBUG 0 CACHE BOOL "Enable/disable debug printing" )
2011-07-21 21:35:43 +08:00
SET ( QMC_CUDA 0 CACHE BOOL "Build with GPU support through CUDA" )
2019-03-21 06:03:03 +08:00
SET ( ENABLE_CUDA 0 CACHE BOOL "Build with the second generation of GPU support through CUDA (production quality for AFQMC, experimental for real space)" )
2019-03-27 09:06:10 +08:00
SET ( ENABLE_SOA 1 CACHE BOOL "Enable/disable SoA optimization" )
2020-04-02 06:15:55 +08:00
OPTION ( ENABLE_OFFLOAD "Enable OpenMP offload" OFF )
CMAKE_DEPENDENT_OPTION ( USE_OBJECT_TARGET "USE CMake object target" OFF "ENABLE_OFFLOAD" OFF )
2012-02-18 01:37:16 +08:00
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
2019-07-15 23:27:22 +08:00
SET ( QMC_VERBOSE_CONFIGURATION 0 CACHE BOOL "Give details why specific tests are/are not added" )
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
######################################################################
SET ( DEBUG_PSIBUFFER_ON 0 CACHE BOOL "Build with GPU support through CUDA" )
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)
2017-05-05 02:41:57 +08:00
SET ( QMC_BUILD_STATIC 0 CACHE BOOL "Link to static libraries" )
2017-01-06 03:53:00 +08:00
SET ( ENABLE_TIMERS 0 CACHE BOOL "Enable internal timers" )
2020-05-07 06:36:16 +08:00
SET ( ENABLE_STACKTRACE 0 CACHE BOOL "Enable use of boost::stacktrace" )
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 ( INTEL_COMPILER 0 )
SET ( HAVE_ACML 0 )
2007-10-11 01:23:18 +08:00
2009-08-13 05:23:52 +08:00
######################################################
# Try to identify CPU identity
######################################################
SET ( CPU_IDENTITY "generic" )
2015-09-26 02:06:38 +08:00
#INCLUDE(${PROJECT_CMAKE}/CheckProcessorID.cmake)
2009-12-23 23:49:53 +08:00
2015-09-26 03:51:10 +08:00
#------------------------
# On Cray's machine
#------------------------
2016-07-07 02:09:02 +08:00
IF ( $ENV{ CRAYPE_VERSION } MATCHES "." )
MESSAGE ( STATUS "Running on a Cray machine." )
2009-12-23 23:49:53 +08:00
SET ( CMAKE_SKIP_RPATH TRUE )
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 ( )
2015-09-26 03:51:10 +08:00
2015-09-26 02:06:38 +08:00
IF ( QMC_CUDA )
2017-05-05 02:41:57 +08:00
IF ( QMC_BUILD_STATIC )
2017-05-05 06:21:13 +08:00
MESSAGE ( FATAL_ERROR "Static linking is not supported with CUDA build. Set QMC_BUILD_STATIC=0 (default)!" )
2017-05-05 02:41:57 +08:00
ENDIF ( QMC_BUILD_STATIC )
2015-09-26 02:06:38 +08:00
MESSAGE ( STATUS "Building GPU code. Linking dynamically." )
ELSE ( QMC_CUDA )
2017-05-05 02:05:56 +08:00
IF ( QMC_BUILD_STATIC )
MESSAGE ( STATUS "Building CPU code. Linking statically." )
SET ( BUILD_SHARED_LIBS off )
SET ( CMAKE_FIND_LIBRARY_SUFFIXES .a )
FOREACH ( type SHARED_LIBRARY SHARED_MODULE EXE )
SET ( CMAKE_ ${ type } _LINK_STATIC_C_FLAGS "-Wl,-Bstatic" )
SET ( CMAKE_ ${ type } _LINK_DYNAMIC_C_FLAGS "-static" )
SET ( CMAKE_ ${ type } _LINK_STATIC_CXX_FLAGS "-Wl,-Bstatic" )
SET ( CMAKE_ ${ type } _LINK_DYNAMIC_CXX_FLAGS "-static" )
ENDFOREACH ( type )
ELSE ( QMC_BUILD_STATIC )
MESSAGE ( STATUS "Building CPU code. Linking dynamically." )
ENDIF ( QMC_BUILD_STATIC )
2015-09-26 02:06:38 +08:00
ENDIF ( QMC_CUDA )
2016-07-07 02:09:02 +08:00
ENDIF ( $ENV{ CRAYPE_VERSION } MATCHES "." )
2006-11-24 07:00:56 +08:00
2018-12-12 07:15:22 +08:00
#--------------------------------
# C++ 14 is the minimum standard
#--------------------------------
set ( CMAKE_CXX_STANDARD 14 )
set ( CMAKE_CXX_STANDARD_REQUIRED ON )
set ( CMAKE_CXX_EXTENSIONS OFF )
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
2018-03-26 11:10:05 +08:00
2019-03-05 12:11:04 +08:00
#--------------------------------------------------------------------------
# Check that a C++ compiler is compatiable with the underlying libstdc++
#--------------------------------------------------------------------------
include ( CMake/Testlibstdc++.cmake )
2018-12-12 07:15:22 +08:00
#---------------------------------------------------
2018-11-01 05:34:21 +08:00
# Check that a C++ 14 standard library is configured
2018-12-12 07:15:22 +08:00
#---------------------------------------------------
2018-10-26 06:22:07 +08:00
include ( CMake/TestCxx14Library.cmake )
2009-08-13 05:23:52 +08:00
#-------------------------------------------------------------------
# check lapack/blas
#-------------------------------------------------------------------
2018-03-17 00:48:25 +08:00
# Quick search for MKL (this will need to be improved).
2018-03-17 01:28:15 +08:00
# This reproduces the old intel -mkl behavior or
2018-03-26 10:53:23 +08:00
# if ENABLE_MKL is set to 1 supports other compilers
2016-01-06 06:58:25 +08:00
IF ( INTEL_COMPILER )
2018-03-26 10:53:23 +08:00
SET ( ENABLE_MKL TRUE CACHE BOOL "ENABLE MKL for Intel compilers" )
ELSE ( INTEL_COMPILER )
SET ( ENABLE_MKL FALSE CACHE BOOL "ENABLE MKL for non-intel compilers (Experimental)" )
ENDIF ( INTEL_COMPILER )
IF ( ENABLE_MKL )
2020-04-12 04:25:14 +08:00
INCLUDE ( CMake/FindMKL.cmake )
2018-03-26 10:53:23 +08:00
ENDIF ( ENABLE_MKL )
2016-01-06 04:57:37 +08:00
IF ( HAVE_MKL )
2020-02-08 19:55:57 +08:00
# Skip adding Math::BLAS_LAPACK target which has been imported by FindMKL.
2016-07-13 22:37:36 +08:00
ELSEIF ( $ENV{ CRAYPE_VERSION } MATCHES "." )
# Cray specific environment variable indicates we are on a cray. Assume libsci will be linked
2018-03-21 02:25:12 +08:00
# preferable to attempt a compile/link
2016-07-13 22:37:36 +08:00
MESSAGE ( STATUS "Assuming Cray libsci or other BLAS/LAPACK will be linked by compiler wrappers" )
2020-02-08 19:55:57 +08:00
ADD_LIBRARY ( Math::BLAS_LAPACK INTERFACE IMPORTED )
2018-03-21 02:25:12 +08:00
ELSE ( )
2020-02-08 19:55:57 +08:00
# The last search for Blas/Lapack
find_package ( LAPACK REQUIRED )
2016-12-08 09:16:47 +08:00
IF ( "${LAPACK_LIBRARIES}" MATCHES "mkl" )
2019-12-07 07:15:11 +08:00
MESSAGE ( FATAL_ERROR "MKL found via LAPACK/BLAS. Please pass -DENABLE_MKL=1 to cmake for full Intel MKL utilization. -DMKL_ROOT may also be needed for the include files to be found." )
2016-12-08 09:16:47 +08:00
ENDIF ( )
2015-09-26 02:06:38 +08:00
MESSAGE ( STATUS "LAPACK linker flags: ${LAPACK_LINKER_FLAGS}" )
2020-04-12 04:25:14 +08:00
MESSAGE ( STATUS "LAPACK libraries: ${LAPACK_LIBRARIES}" )
SET ( LAPACK_LIBRARY ${ LAPACK_LIBRARIES } ${ LAPACK_LINKER_FLAGS } )
2020-02-08 19:55:57 +08:00
# Add Math::BLAS_LAPACK target
ADD_LIBRARY ( Math::BLAS_LAPACK INTERFACE IMPORTED )
SET_TARGET_PROPERTIES ( Math::BLAS_LAPACK PROPERTIES INTERFACE_LINK_LIBRARIES "${LAPACK_LIBRARY}" )
2016-01-06 03:37:18 +08:00
ENDIF ( )
2009-08-13 05:23:52 +08:00
ENDIF ( CMAKE_TOOLCHAIN_FILE )
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-17 21:54:11 +08:00
# AFQMC requires MKL sparse for good performance (roughly a factor of 2x)
2016-12-16 06:13:21 +08:00
IF ( BUILD_AFQMC AND NOT MKL_FOUND )
2017-03-17 21:54:11 +08:00
MESSAGE ( WARNING "AFQMC - MKL not found, using simple sparse matrix routines. Link with MKL sparse libraries for better performance." )
2016-12-16 06:13:21 +08:00
ENDIF ( )
2016-12-16 12:57:17 +08:00
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-02-06 15:40:41 +08:00
SET ( MPI_DETERMINE_LIBRARY_VERSION TRUE )
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" AND NOT ${ MPI_CXX_LIBRARY_VERSION_STRING } MATCHES "disable-registration-cache" )
MESSAGE ( FATAL_ERROR "MVAPICH2 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 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 . " )
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-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 )
IF ( NOT HAVE_MASS AND NOT HAVE_MKL_VML )
MESSAGE ( STATUS "No usable vector math library detected." )
ADD_LIBRARY ( Math::scalar_vector_functions INTERFACE IMPORTED )
ENDIF ( NOT HAVE_MASS AND NOT HAVE_MKL_VML )
# 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 )
2019-07-02 05:45:23 +08:00
find_package ( LibXml2 )
2015-09-26 02:06:38 +08:00
IF ( LIBXML2_FOUND )
2020-02-08 20:59:39 +08:00
IF ( ${ CMAKE_VERSION } VERSION_LESS "3.12.0" )
ADD_LIBRARY ( LibXml2::LibXml2 INTERFACE IMPORTED )
SET_TARGET_PROPERTIES ( LibXml2::LibXml2 PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${LIBXML2_INCLUDE_DIR}"
I N T E R F A C E _ L I N K _ L I B R A R I E S " $ { L I B X M L 2 _ L I B R A R I E S } " )
ENDIF ( )
2015-09-26 02:06:38 +08:00
ELSE ( )
2016-12-14 02:46:20 +08:00
MESSAGE ( FATAL_ERROR "Could not find required library Libxml2" )
2015-09-26 02:06:38 +08:00
ENDIF ( LIBXML2_FOUND )
2020-02-06 15:40:41 +08:00
#-------------------------------------------------------------------
# set up HDF5 library
#-------------------------------------------------------------------
2019-12-07 07:15:11 +08:00
IF ( HAVE_MPI )
SET ( HDF5_PREFER_PARALLEL 1 CACHE BOOL "Request parallel/serial HDF5 library" )
ELSE ( HAVE_MPI )
SET ( HDF5_PREFER_PARALLEL 0 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. "
" 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" )
SET ( ENABLE_PHDF5 1 CACHE BOOL "Enable code paths using parallel HDF5" )
ELSE ( HDF5_IS_PARALLEL )
MESSAGE ( STATUS "Serial HDF5 library found" )
SET ( ENABLE_PHDF5 0 CACHE BOOL "Enable code paths using parallel HDF5" )
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 )
2018-06-17 07:57:21 +08:00
IF ( CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
2020-02-08 20:59:39 +08:00
SET ( CUDA_PROPAGATE_HOST_FLAGS ON )
2018-06-17 07:57:21 +08:00
ELSE ( CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
2020-02-08 20:59:39 +08:00
SET ( CUDA_PROPAGATE_HOST_FLAGS OFF )
2018-06-17 07:57:21 +08:00
ENDIF ( CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
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
SET ( CUDA_NVCC_FLAGS "-Drestrict=__restrict__;-DNO_CUDA_MAIN" )
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 ( )
2017-06-02 01:47:35 +08:00
SET ( CUDA_ARCH sm_35 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
2018-07-06 07:05:54 +08:00
SET ( USE_NVTX_API 0 CACHE BOOL "Enable/disable NVTX regions in CUDA code." )
IF ( USE_NVTX_API )
IF ( HAVE_CUDA )
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 } )
2018-07-06 07:05:54 +08:00
ENDIF ( HAVE_CUDA )
ENDIF ( USE_NVTX_API )
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 )
MESSAGE ( FATAL_ERROR "USE_VTUNE_TASKS is set, but timers are not enabled. Set ENABLE_TIMERS=1." )
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 ( )
2019-08-16 04:19:41 +08:00
SET ( QMC_EXP_THREADING FALSE CACHE BOOL "Experimental non openmp threading models" )
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 ( )
2016-08-24 11:41:52 +08:00
2013-12-18 04:00:01 +08:00
#ADD_CUSTOM_TARGET(print_settings ALL
# ${CMAKE_COMMAND} -E echo "Print build settings"
# VERBATIM)
#
#add_custom_command(TARGET print_settings
# POST_BUILD
# COMMAND svn info ${qmcpack_SOURCE_DIR})
#
#file(APPEND ${qmcpack_BINARY_DIR}/bin/qmcpack.settings ${print_settings})