2006-10-19 04:57:15 +08:00
PROJECT ( qmcpack )
2005-11-18 01:29:59 +08:00
2008-05-14 02:12:10 +08:00
2009-12-23 23:49:53 +08:00
#####################################################
2018-10-20 06:03:50 +08:00
CMAKE_MINIMUM_REQUIRED ( VERSION 3.6.0 )
2015-12-03 04:08:42 +08:00
IF ( COMMAND cmake_policy )
2011-08-31 00:01:08 +08:00
cmake_policy ( SET CMP0003 NEW )
2018-10-24 05:31:53 +08:00
IF ( COMPILING_ON_BGQ )
# On BG/Q, the HDF libraries variable includes some supporting shared libraries
# such as libm.so. With the old behavior of CMP0060, these were converted
# to -lm for the linker, which then correctly selects the static version.
# With the new behavior of CMP0060, the form of the libraries are left alone
# on the link line (eg. /usr/lib64/libm.so), and this causes a linker error
# because shared libraries are not allowed with static linking.
cmake_policy ( SET CMP0060 OLD )
ENDIF ( )
2018-10-20 06:03:50 +08:00
IF ( NOT $ENV{ CRAYPE_VERSION } MATCHES "." )
2018-03-21 03:19:35 +08:00
cmake_policy ( SET CMP0056 NEW )
# This policy insures that the CMAKE_EXE_LINKER_FLAGS of the calling project
2018-03-22 06:49:57 +08:00
# are used in try_compile test cmake projects.
# CHECK_CXX_SOURCE_COMPILES and others depend on try_compile
2018-10-20 06:03:50 +08:00
endif ( NOT $ENV{ CRAYPE_VERSION } MATCHES "." )
2018-05-24 23:59:15 +08:00
IF ( CMAKE_GENERATOR MATCHES "Ninja" )
cmake_policy ( SET CMP0058 NEW )
ENDIF ( CMAKE_GENERATOR MATCHES "Ninja" )
2019-07-09 01:35:00 +08:00
# CMake find_package will use <PackageName>_ROOT CMake variable
# and environment variable in search path.
# various Find<Package>.cmake modules may not follow this policy
2019-07-10 01:30:53 +08:00
IF ( ${ CMAKE_VERSION } VERSION_GREATER_EQUAL "3.12.0" )
2019-07-10 01:18:21 +08:00
cmake_policy ( SET CMP0074 NEW )
2019-07-10 01:30:53 +08:00
ENDIF ( ${ CMAKE_VERSION } VERSION_GREATER_EQUAL "3.12.0" )
2015-12-03 04:08:42 +08:00
ENDIF ( COMMAND cmake_policy )
2011-08-31 00:01:08 +08:00
2013-12-18 04:00:01 +08:00
2005-11-18 01:29:59 +08:00
######################################################################
2018-03-21 02:25:12 +08:00
# Version
2005-11-18 01:29:59 +08:00
######################################################################
2017-01-28 07:20:36 +08:00
SET ( QMCPACK_VERSION_MAJOR 3 )
2019-03-29 23:52:36 +08:00
SET ( QMCPACK_VERSION_MINOR 7 )
2019-03-30 04:01:03 +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-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}" )
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
# 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
######################################################################
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
######################################################################
# enable MPI and OPNEMP if possible
######################################################################
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" )
2019-02-05 11:50:09 +08:00
SET ( ENABLE_OFFLOAD 0 CACHE BOOL "Enable OpenMP offload" )
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 )
2008-05-13 22:48:20 +08:00
INCLUDE ( ${ CMAKE_ROOT } /Modules/CheckIncludeFile.cmake )
INCLUDE ( ${ CMAKE_ROOT } /Modules/CheckTypeSize.cmake )
2017-10-24 23:55:45 +08:00
INCLUDE ( ${ CMAKE_ROOT } /Modules/CheckCXXSourceCompiles.cmake )
2011-09-15 05:41:49 +08:00
2007-05-23 00:35:35 +08:00
CHECK_FUNCTION_EXISTS ( sincos HAVE_SINCOS )
2008-05-13 22:48:20 +08:00
CHECK_FUNCTION_EXISTS ( posix_memalign HAVE_POSIX_MEMALIGN )
2017-10-24 23:55:45 +08:00
SET ( CHECK_ISZERO_SOURCE " #include <math.h>
i n t main ( ) { iszero ( 1.0 ) ; r e t u r n 0 ; } " )
CHECK_CXX_SOURCE_COMPILES ( "${CHECK_ISZERO_SOURCE}" HAVE_ISZERO )
2008-05-13 22:48:20 +08:00
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 ( QMC_ADIOS 0 CACHE BOOL "Build with ADIOS" )
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-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 ( )
2019-03-28 04:56:19 +08:00
If ( BUILD_AFQMC AND ENABLE_CUDA AND NOT QMC_COMPLEX )
2019-03-28 02:21:21 +08:00
MESSAGE ( FATAL_ERROR "AFQMC only works on GPUs if QMC_COMPLEX=1." )
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" )
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
######################################################################
2017-07-01 07:02:18 +08:00
SET ( ENABLE_PHDF5 1 CACHE BOOL "Enable phdf5 for output" )
2006-09-05 00:01:08 +08:00
SET ( HAVE_LIBXML2 1 )
2006-06-06 04:02:37 +08:00
SET ( HAVE_LIBFFTW 0 )
2006-04-15 05:54:50 +08:00
SET ( HAVE_LIBXMLPP 0 )
SET ( HAVE_LIBHDF5 0 )
SET ( HAVE_LIBSPRNG 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
2006-04-15 05:54:50 +08:00
######################################################
# Directory where customize cmake files reside
######################################################
2006-10-19 05:13:15 +08:00
SET ( PROJECT_CMAKE ${ qmcpack_SOURCE_DIR } /CMake )
2006-04-15 05:54:50 +08:00
2013-10-19 04:27:59 +08:00
######################################################
2018-03-21 02:25:12 +08:00
# set ADIOS flags
2013-10-19 04:27:59 +08:00
######################################################
IF ( QMC_ADIOS )
IF ( NOT HAVE_ADIOS )
SET ( ADIOS_FOUND 0 )
INCLUDE ( ${ PROJECT_CMAKE } /FindADIOS.cmake )
IF ( ${ ADIOS_FOUND } EQUAL 1 )
INCLUDE_DIRECTORIES ( ${ ADIOS_INCLUDES } )
MESSAGE ( STATUS "Found ADIOS" )
LINK_LIBRARIES ( ${ ADIOS_LIBRARIES } )
ADD_DEFINITIONS ( -DHAVE_ADIOS )
ELSE ( )
2016-12-14 02:46:20 +08:00
MESSAGE ( STATUS "Couldn't find required library ADIOS" )
2013-10-19 04:27:59 +08:00
MESSAGE ( FATAL_ERROR "ADIOS_HOME: export ADIOS_HOME=/path/to/adios" )
ENDIF ( )
2016-12-08 23:40:59 +08:00
ELSE ( )
ADD_DEFINITIONS ( -DHAVE_ADIOS )
ENDIF ( )
2013-10-19 04:27:59 +08:00
ENDIF ( QMC_ADIOS )
2016-08-11 11:37:37 +08:00
SET ( QMCPACK_UNIT_TEST_DIR ${ qmcpack_BINARY_DIR } /tests/bin )
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_MPI 0 )
SET ( INTEL_COMPILER 0 )
SET ( HAVE_MKL 0 )
2009-12-23 23:49:53 +08:00
SET ( HAVE_MKL_VML 0 )
2009-08-13 05:23:52 +08:00
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
2015-09-26 03:51:10 +08:00
# Flags for ctest
SET ( USE_EXT_MPI_FOR_SERIAL_TESTS 1 )
FIND_PROGRAM ( MPIEXEC aprun )
2016-02-02 04:57:00 +08:00
IF ( NOT MPIEXEC )
2016-02-02 04:46:18 +08:00
# For slurm use srun
2016-02-02 04:57:00 +08:00
FIND_PROGRAM ( MPIEXEC srun )
ENDIF ( NOT MPIEXEC )
2015-09-26 03:51:10 +08:00
SET ( MPIEXEC_NUMPROC_FLAG "-n" )
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
#-------------------------------------------------------------------
2009-12-23 23:49:53 +08:00
# check MPI installation
2009-08-13 05:23:52 +08:00
#-------------------------------------------------------------------
2009-12-23 23:49:53 +08:00
IF ( QMC_MPI )
## mpi compilers
2017-03-16 00:33:12 +08:00
GET_FILENAME_COMPONENT ( BASE_CXX_COMPILER_NAME ${ CMAKE_CXX_COMPILER } NAME )
if ( ${ BASE_CXX_COMPILER_NAME } MATCHES "^mp" )
2009-12-23 23:49:53 +08:00
SET ( HAVE_MPI 1 )
SET ( MPI_FOUND TRUE )
2016-07-13 22:37:36 +08:00
elseif ( $ENV{ CRAYPE_VERSION } MATCHES "." )
2015-09-26 03:51:10 +08:00
SET ( HAVE_MPI 1 )
SET ( MPI_FOUND TRUE )
else ( )
2009-12-23 23:49:53 +08:00
include ( FindMPI )
IF ( MPI_FOUND )
MESSAGE ( STATUS "Found mpi.h and libraries. Check for working mpi compiler " )
2017-03-15 12:50:29 +08:00
INCLUDE_DIRECTORIES ( ${ MPI_CXX_INCLUDE_PATH } )
2018-03-21 02:25:12 +08:00
FILE ( WRITE ${ CMAKE_BINARY_DIR } ${ CMAKE_FILES_DIRECTORY } /CMakeTmp/testmpi.cxx
2009-12-23 23:49:53 +08:00
" #include <mpi.h>"
" i n t main ( int argc, char** argv ) { MPI_Init ( &argc,&argv ) ; MPI_Finalize ( ) ; r e t u r n 0 ; } \ n " )
2018-03-21 02:25:12 +08:00
#TRY_COMPILE(MPI_WORKS ${CMAKE_BINARY_DIR}
2015-09-26 02:06:38 +08:00
#${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testmpi.cxx
#OUTPUT_VARIABLE OUTPUT)
set ( MPI_WORKS 1 )
2017-03-16 00:33:12 +08:00
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 } )
2009-12-23 23:49:53 +08:00
IF ( MPI_WORKS )
MESSAGE ( STATUS "MPI is enabled" )
SET ( HAVE_MPI 1 )
2017-03-15 12:50:29 +08:00
LINK_LIBRARIES ( ${ MPI_CXX_LIBRARIES } )
2009-12-23 23:49:53 +08:00
ELSE ( MPI_WORKS )
MESSAGE ( STATUS "MPI is disabled" )
SET ( HAVE_MPI 0 )
2017-07-07 02:08:39 +08:00
SET ( MPI_LIBRARY "" )
2009-12-23 23:49:53 +08:00
ENDIF ( MPI_WORKS )
2017-07-07 02:08:39 +08:00
ELSE ( MPI_FOUND )
2017-07-07 05:16:28 +08:00
MESSAGE ( STATUS "MPI not found" )
2017-07-07 02:08:39 +08:00
SET ( MPI_LIBRARY "" )
2009-12-23 23:49:53 +08:00
ENDIF ( MPI_FOUND )
2017-03-16 00:33:12 +08:00
ENDIF ( )
2009-12-23 23:49:53 +08:00
ENDIF ( QMC_MPI )
2009-02-22 00:30:49 +08:00
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 )
2016-01-06 06:58:25 +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 )
2016-12-08 09:16:47 +08:00
# We found MKL, add the link library
2016-01-06 03:37:18 +08:00
SET ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${MKL_FLAGS}" )
SET ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${MKL_FLAGS}" )
SET ( LAPACK_FOUND 1 )
SET ( LAPACK_LIBRARIES "${MKL_LIBRARIES}" )
SET ( LAPACK_LINKER_FLAGS "${MKL_LINKER_FLAGS}" )
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
SET ( LAPACK_FOUND 1 )
MESSAGE ( STATUS "Assuming Cray libsci or other BLAS/LAPACK will be linked by compiler wrappers" )
2018-03-21 02:25:12 +08:00
ELSE ( )
2016-01-06 03:37:18 +08:00
# Search for Blas/Lapack
find_package ( LAPACK )
2016-12-08 09:16:47 +08:00
# When cmake finds and sets up the MKL libraries with a non-Intel compiler, set the flag
# This should be tidied up when FindMKL.cmake supports non-Intel compilers.
IF ( "${LAPACK_LIBRARIES}" MATCHES "mkl" )
MESSAGE ( STATUS "MKL found via LAPACK/BLAS" )
SET ( MKL_FOUND 1 )
2016-12-17 01:19:14 +08:00
SET ( HAVE_MKL 1 )
2016-12-08 09:16:47 +08:00
ENDIF ( )
2016-01-06 03:37:18 +08:00
ENDIF ( )
IF ( LAPACK_FOUND )
2015-09-26 02:06:38 +08:00
MESSAGE ( STATUS "LAPACK libraries: ${LAPACK_LIBRARIES}" )
MESSAGE ( STATUS "LAPACK linker flags: ${LAPACK_LINKER_FLAGS}" )
2016-05-18 09:52:12 +08:00
SET ( LAPACK_LIBRARY ${ LAPACK_LIBRARIES } ${ LAPACK_LINKER_FLAGS } )
2016-07-07 08:03:49 +08:00
ELSE ( )
2018-03-21 02:25:12 +08:00
MESSAGE ( FATAL_ERROR "Could not find required libraries LAPACK &/or BLAS" )
2016-01-06 03:37:18 +08:00
ENDIF ( )
2009-12-23 23:49:53 +08:00
2016-07-07 05:10:38 +08:00
INCLUDE ( CMake/FindVectorMath.cmake )
2009-12-23 23:49:53 +08:00
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
2014-11-20 02:28:35 +08:00
# setup ctest variables
IF ( HAVE_MPI )
SET ( USE_MPI 1 )
IF ( NOT MPIEXEC )
SET ( MPIEXEC "mpirun" )
ENDIF ( )
2015-09-26 03:51:10 +08:00
IF ( NOT DEFINED MPIEXEC_NUMPROC_FLAG )
2014-11-20 02:28:35 +08:00
SET ( MPIEXEC_NUMPROC_FLAG "-np" )
ENDIF ( )
2015-09-26 03:51:10 +08:00
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
MESSAGE ( STATUS "MPI runner is ${MPIEXEC}" )
2014-11-20 02:28:35 +08:00
ENDIF ( HAVE_MPI )
2006-04-15 05:54:50 +08:00
INCLUDE ( ${ CMAKE_ROOT } /Modules/FindThreads.cmake )
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
SET ( QMC_UTIL_LIBS ${ LAPACK_LIBRARY } ${ BLAS_LIBRARY } )
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 )
INCLUDE_DIRECTORIES ( ${ FFTW_INCLUDE_DIR } )
SET ( QMC_UTIL_LIBS ${ QMC_UTIL_LIBS } ${ FFTW_LIBRARIES } )
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 } )
2015-09-26 02:06:38 +08:00
find_package ( ZLIB )
2019-07-02 05:45:23 +08:00
find_package ( LibXml2 )
2018-03-21 02:25:12 +08:00
2015-09-26 02:06:38 +08:00
IF ( LIBXML2_FOUND )
INCLUDE_DIRECTORIES ( ${ LIBXML2_INCLUDE_DIR } )
SET ( HAVE_LIBXML2 1 )
SET ( QMC_UTIL_LIBS ${ QMC_UTIL_LIBS } ${ LIBXML2_LIBRARIES } )
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 )
set ( HDF5_USE_STATIC_LIBRARIES off )
if ( QMC_BUILD_STATIC )
set ( HDF5_USE_STATIC_LIBRARIES on )
endif ( )
2017-08-29 04:11:24 +08:00
SET ( HDF5_PREFER_PARALLEL 0 )
IF ( HAVE_MPI )
SET ( HDF5_PREFER_PARALLEL 1 )
ENDIF ( )
find_package ( HDF5 COMPONENTS C )
2009-12-23 23:49:53 +08:00
IF ( HDF5_FOUND )
2004-08-25 03:21:10 +08:00
SET ( HAVE_LIBHDF5 1 )
INCLUDE_DIRECTORIES ( ${ HDF5_INCLUDE_DIR } )
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 ( )
2011-09-15 05:41:49 +08:00
SET ( QMC_UTIL_LIBS ${ QMC_UTIL_LIBS } ${ HDF5_LIBRARIES } )
if ( ZLIB_LIBRARY )
SET ( QMC_UTIL_LIBS ${ QMC_UTIL_LIBS } ${ ZLIB_LIBRARY } )
endif ( ZLIB_LIBRARY )
2015-09-26 02:06:38 +08:00
#IF(SZLIB_FOUND)
# SET(QMC_UTIL_LIBS ${QMC_UTIL_LIBS} ${SZLIB_LIBRARIES})
#ENDIF(SZLIB_FOUND)
2017-07-01 07:02:18 +08:00
IF ( HDF5_IS_PARALLEL )
IF ( ENABLE_PHDF5 )
2017-08-02 01:01:17 +08:00
MESSAGE ( STATUS "Using HDF5 parallel collective I/O" )
2017-07-01 07:02:18 +08:00
ELSE ( ENABLE_PHDF5 )
2017-08-03 08:00:03 +08:00
MESSAGE ( STATUS "Using HDF5 non-scalable serial I/O" )
2017-07-01 07:02:18 +08:00
ENDIF ( ENABLE_PHDF5 )
ELSE ( HDF5_IS_PARALLEL )
IF ( ENABLE_PHDF5 )
2017-08-03 08:00:03 +08:00
MESSAGE ( STATUS "Using HDF5 non-scalable serial I/O due to the lack of library support for parallel" )
2017-07-01 07:02:18 +08:00
SET ( ENABLE_PHDF5 0 )
ELSE ( ENABLE_PHDF5 )
2017-08-03 08:00:03 +08:00
MESSAGE ( STATUS "Using HDF5 non-scalable serial I/O" )
2017-07-01 07:02:18 +08:00
ENDIF ( ENABLE_PHDF5 )
ENDIF ( HDF5_IS_PARALLEL )
2009-12-23 23:49:53 +08:00
ELSE ( HDF5_FOUND )
2019-02-02 12:00:54 +08:00
MESSAGE ( FATAL_ERROR "Require hdf5 1.6.4 or higher. Set HDF5_ROOT" )
2009-12-23 23:49:53 +08:00
ENDIF ( HDF5_FOUND )
2004-08-25 03:21:10 +08:00
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 )
SET ( HAVE_LIBBOOST 1 )
2015-09-26 02:06:38 +08:00
INCLUDE_DIRECTORIES ( ${ Boost_INCLUDE_DIRS } )
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 ( )
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" )
set ( CUDA_PROPAGATE_HOST_FLAGS ON )
ELSE ( CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
set ( CUDA_PROPAGATE_HOST_FLAGS OFF )
ENDIF ( CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
2015-09-26 02:06:38 +08:00
FIND_PACKAGE ( CUDA REQUIRED )
#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 } )
2012-02-18 01:37:16 +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 )
2008-05-14 22:52:41 +08:00
######################################################################
# Manage Einspline library
2018-03-21 02:25:12 +08:00
# - toolchain file can set
2009-02-21 04:16:43 +08:00
# - check if libeinspline can be found in $EINSPLINE_HOME/include and
# $EINSPLINE_HOME/lib
# - if not found, build it from the source directory in $EINSPLINE_HOME
2008-05-14 22:52:41 +08:00
# - if everything fails, do not use it
######################################################################
2012-04-22 22:24:14 +08:00
SET ( HAVE_EINSPLINE 1 )
set ( build_einspline 1 )
2013-11-27 05:48:53 +08:00
#if(HAVE_EINSPLINE_EXT)
# set(HAVE_EINSPLINE 0)
# INCLUDE(${PROJECT_CMAKE}/FindEinspline.cmake)
# IF(EINSPLINE_FOUND)
# INCLUDE_DIRECTORIES(${EINSPLINE_INCLUDE_DIR})
# SET(QMC_UTIL_LIBS ${EINSPLINE_LIBRARIES} ${QMC_UTIL_LIBS})
# set(build_einspline 0)
# endif()
#endif()
2012-04-22 22:24:14 +08:00
if ( build_einspline )
2012-03-23 18:43:07 +08:00
SUBDIRS ( src/einspline )
INCLUDE_DIRECTORIES ( ${ PROJECT_BINARY_DIR } /include )
2016-10-28 05:25:10 +08:00
SET ( QMC_UTIL_LIBS ${ QMC_UTIL_LIBS } einspline )
2009-12-23 23:49:53 +08:00
endif ( )
2012-04-22 22:24:14 +08:00
2016-11-17 12:19:48 +08:00
IF ( BUILD_LMYENGINE_INTERFACE )
2016-12-08 23:40:59 +08:00
ADD_DEFINITIONS ( -DHAVE_LMY_ENGINE )
SET ( FORMIC_BINARY_DIR ${ qmcpack_BINARY_DIR } )
SUBDIRS ( src/formic/utils )
SET ( QMC_UTIL_LIBS formic_utils ${ QMC_UTIL_LIBS } )
2016-11-17 12:19:48 +08:00
ENDIF ( BUILD_LMYENGINE_INTERFACE )
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 ( )
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
# -DH5_USE_16_API for HDF5
# -DMPICH_SKIP_MPICXX : disable C++ binding of MPICH
####################################################################
2013-05-13 20:28:40 +08:00
2017-08-17 13:10:04 +08:00
ADD_DEFINITIONS ( -DHAVE_CONFIG_H -DH5_USE_16_API -DUSE_REAL_STRUCT_FACTOR -DINLINE_ALL=inline -DADD_ )
2013-12-03 02:09:25 +08:00
2009-12-23 23:49:53 +08:00
if ( HAVE_MPI )
ADD_DEFINITIONS ( -DMPICH_SKIP_MPICXX )
endif ( )
2008-10-30 08:22:11 +08:00
#ADD_DEFINITIONS(-DDISABLE_WS_CELL)
2004-08-25 03:21:10 +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
2014-01-22 00:39:29 +08:00
#########################
# add definitions for adios profile
# add definitions for adios verification
########################
IF ( QMC_ADIOS )
#ADD_DEFINITIONS(-DIO_PROFILE)
#ADD_DEFINITIONS(-DADIOS_VERIFY)
2014-06-12 00:53:45 +08:00
ADD_DEFINITIONS ( -DWRITE_GLOBAL )
2014-01-22 00:39:29 +08:00
ENDIF ( QMC_ADIOS )
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 )
2017-06-22 05:12:43 +08:00
SUBDIRS ( tests )
SUBDIRS ( examples )
2018-04-28 01:11:18 +08:00
IF ( IS_DIRECTORY "${PROJECT_SOURCE_DIR}/nexus" )
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})