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