1# Check compiler version 2IF ( CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.0 ) 3 MESSAGE(STATUS "Compiler Version ${CMAKE_CXX_COMPILER_VERSION}") 4 MESSAGE(FATAL_ERROR "Requires clang 7.0 or higher ") 5ENDIF() 6 7IF ( CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 11.0.0 AND QMC_CXX_STANDARD EQUAL 17 AND BUILD_AFQMC ) 8 MESSAGE(FATAL_ERROR "Avoid Clang 11.0.0 which cannot compile AFQMC properly with C++17!") 9ENDIF() 10 11# Set the std 12SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99") 13 14# Enable OpenMP 15IF(QMC_OMP) 16 SET(ENABLE_OPENMP 1) 17 IF(ENABLE_OFFLOAD AND NOT CMAKE_SYSTEM_NAME STREQUAL "CrayLinuxEnvironment") 18 SET(OFFLOAD_TARGET "nvptx64-nvidia-cuda" CACHE STRING "Offload target architecture") 19 SET(OPENMP_OFFLOAD_COMPILE_OPTIONS "-fopenmp-targets=${OFFLOAD_TARGET}") 20 21 IF(DEFINED OFFLOAD_ARCH) 22 SET(OPENMP_OFFLOAD_COMPILE_OPTIONS "${OPENMP_OFFLOAD_COMPILE_OPTIONS} -Xopenmp-target=${OFFLOAD_TARGET} -march=${OFFLOAD_ARCH}") 23 ENDIF() 24 25 IF(OFFLOAD_TARGET MATCHES "nvptx64") 26 SET(OPENMP_OFFLOAD_COMPILE_OPTIONS "${OPENMP_OFFLOAD_COMPILE_OPTIONS} -Wno-unknown-cuda-version") 27 ENDIF() 28 29 # Intel clang compiler needs a different flag for the host side OpenMP library when offload is used. 30 IF(OFFLOAD_TARGET MATCHES "spir64") 31 SET(OMP_FLAG "-fiopenmp") 32 ELSE(OFFLOAD_TARGET MATCHES "spir64") 33 SET(OMP_FLAG "-fopenmp") 34 ENDIF(OFFLOAD_TARGET MATCHES "spir64") 35 36 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OMP_FLAG}") 37 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OMP_FLAG}") 38 ELSE() 39 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fopenmp") 40 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp") 41 ENDIF() 42ENDIF(QMC_OMP) 43 44# Set clang specific flags (which we always want) 45ADD_DEFINITIONS( -Drestrict=__restrict__ ) 46 47SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstrict-aliasing") 48SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstrict-aliasing -D__forceinline=inline") 49 50# treat VLA as error 51SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror=vla") 52SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wvla") 53 54# set compiler warnings 55SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-unused-variable -Wno-overloaded-virtual -Wno-unused-private-field -Wno-unused-local-typedef") 56SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unknown-pragmas") 57IF( CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 10.0 ) 58 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wmisleading-indentation") 59ENDIF() 60 61 62# Set extra optimization specific flags 63SET( CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -fomit-frame-pointer -ffast-math" ) 64SET( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fomit-frame-pointer -ffast-math" ) 65SET( CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -fomit-frame-pointer -ffast-math" ) 66SET( CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -fomit-frame-pointer -ffast-math" ) 67 68# Set extra debug flags 69SET( CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -fno-omit-frame-pointer -fstandalone-debug" ) 70SET( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fno-omit-frame-pointer -fstandalone-debug" ) 71 72# Special architectural flags 73#-------------------------------------- 74# case arch 75# x86_64: -march 76# powerpc: -mpcu 77# arm: -mpcu 78# default or cray: none 79#-------------------------------------- 80IF(CMAKE_SYSTEM_NAME STREQUAL "CrayLinuxEnvironment") 81 # It's a cray machine. Don't do anything 82ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64") 83 # the case for x86_64 84 # check if the user has already specified -march=XXXX option for cross-compiling. 85 if(CMAKE_CXX_FLAGS MATCHES "-march=" OR CMAKE_C_FLAGS MATCHES "-march=") 86 # make sure that the user specifies -march= for both CMAKE_CXX_FLAGS and CMAKE_C_FLAGS. 87 if(CMAKE_CXX_FLAGS MATCHES "-march=" AND CMAKE_C_FLAGS MATCHES "-march=") 88 else() #(CMAKE_CXX_FLAGS MATCHES "-march=" AND CMAKE_C_FLAGS MATCHES "-march=") 89 MESSAGE(FATAL_ERROR "if -march=ARCH is specified by the user, it should be added in both CMAKE_CXX_FLAGS and CMAKE_C_FLAGS!") 90 endif() #(CMAKE_CXX_FLAGS MATCHES "-march=" AND CMAKE_C_FLAGS MATCHES "-march=") 91 else() #(CMAKE_CXX_FLAGS MATCHES "-march=" OR CMAKE_C_FLAGS MATCHES "-march=") 92 # use -march=native 93 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=native") 94 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native") 95 endif() #(CMAKE_CXX_FLAGS MATCHES "-march=" OR CMAKE_C_FLAGS MATCHES "-march=") 96ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "ppc64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64") 97 # the case for PowerPC and ARM 98 # check if the user has already specified -mcpu=XXXX option for cross-compiling. 99 if(CMAKE_CXX_FLAGS MATCHES "-mcpu=" OR CMAKE_C_FLAGS MATCHES "-mcpu=") 100 # make sure that the user specifies -mcpu= for both CMAKE_CXX_FLAGS and CMAKE_C_FLAGS. 101 if(CMAKE_CXX_FLAGS MATCHES "-mcpu=" AND CMAKE_C_FLAGS MATCHES "-mcpu=") 102 else() #(CMAKE_CXX_FLAGS MATCHES "-mcpu=" AND CMAKE_C_FLAGS MATCHES "-mcpu=") 103 MESSAGE(FATAL_ERROR "if -mcpu=ARCH is specified by the user, it should be added in both CMAKE_CXX_FLAGS and CMAKE_C_FLAGS!") 104 endif() #(CMAKE_CXX_FLAGS MATCHES "-mcpu=" AND CMAKE_C_FLAGS MATCHES "-mcpu=") 105 else() #(CMAKE_CXX_FLAGS MATCHES "-mcpu=" OR CMAKE_C_FLAGS MATCHES "-mcpu=") 106 # use -mcpu=native 107 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mcpu=native") 108 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mcpu=native") 109 endif() #(CMAKE_CXX_FLAGS MATCHES "-mcpu=" OR CMAKE_C_FLAGS MATCHES "-mcpu=") 110 111 IF(CMAKE_SYSTEM_PROCESSOR MATCHES "ppc64") 112 # Ensure PowerPC builds include optimization flags in release and release-with-debug builds 113 # Otherwise these are missing (2020-06-22) 114 SET( CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3 -DNDEBUG" ) 115 SET( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -DNDEBUG" ) 116 SET( CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -O3 -DNDEBUG" ) 117 SET( CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -O3 -DNDEBUG" ) 118 ENDIF() 119ENDIF() 120 121# Add static flags if necessary 122IF(QMC_BUILD_STATIC) 123 SET(CMAKE_CXX_LINK_FLAGS " -static") 124ENDIF(QMC_BUILD_STATIC) 125 126# Coverage 127IF (ENABLE_GCOV) 128 SET(GCOV_COVERAGE TRUE) 129 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --coverage") 130 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --coverage") 131 SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage") 132 SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} --coverage") 133ENDIF(ENABLE_GCOV) 134 135SET(XRAY_PROFILE FALSE CACHE BOOL "Use llvm xray profiling") 136SET(XRAY_INSTRUCTION_THRESHOLD 200 CACHE STRING "Instruction threshold for xray instrumentation") 137 138IF(XRAY_PROFILE) 139 set(XRAY_FLAGS "-fxray-instrument -fxray-instruction-threshold=${XRAY_INSTRUCTION_THRESHOLD}") 140 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${XRAY_FLAGS}") 141 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${XRAY_FLAGS}") 142 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${XRAY_FLAGS}") 143ENDIF(XRAY_PROFILE) 144