1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227
|
# ##############################################################################
#
# Handles the build settings
#
# ##############################################################################
include(GNUInstallDirs)
include(Compilers)
# ---------------------------------------------------------------------------- #
# compiler features
set(CMAKE_CXX_COMPILE_FEATURES
cxx_std_11
cxx_lambdas
cxx_thread_local
cxx_constexpr
cxx_decltype
cxx_nullptr
cxx_variable_templates
cxx_deleted_functions
cxx_auto_type
cxx_alias_templates)
# ---------------------------------------------------------------------------- #
#
set(CMAKE_INSTALL_MESSAGE LAZY)
set(CMAKE_C_STANDARD
11
CACHE STRING "C language standard")
set(CMAKE_CXX_STANDARD
11
CACHE STRING "CXX language standard")
set(CMAKE_C_STANDARD_REQUIRED
ON
CACHE BOOL "Require the C language standard")
set(CMAKE_CXX_STANDARD_REQUIRED
ON
CACHE BOOL "Require the CXX language standard")
set(CMAKE_CUDA_STANDARD
${CMAKE_CXX_STANDARD}
CACHE STRING "CUDA language standard")
set(CMAKE_CUDA_STANDARD_REQUIRED
ON
CACHE BOOL "Require the CUDA language standard")
# ---------------------------------------------------------------------------- #
# set the output directory (critical on Windows)
#
foreach(_TYPE ARCHIVE LIBRARY RUNTIME)
# if ${PROJECT_NAME}_OUTPUT_DIR is not defined, set to CMAKE_BINARY_DIR
if(NOT DEFINED ${PROJECT_NAME}_OUTPUT_DIR OR "${${PROJECT_NAME}_OUTPUT_DIR}"
STREQUAL "")
set(${PROJECT_NAME}_OUTPUT_DIR ${CMAKE_BINARY_DIR})
endif(NOT DEFINED ${PROJECT_NAME}_OUTPUT_DIR
OR "${${PROJECT_NAME}_OUTPUT_DIR}" STREQUAL "")
# set the CMAKE_{ARCHIVE,LIBRARY,RUNTIME}_OUTPUT_DIRECTORY variables
if(WIN32)
# on Windows, separate types into different directories
string(TOLOWER "${_TYPE}" _LTYPE)
set(CMAKE_${_TYPE}_OUTPUT_DIRECTORY
${${PROJECT_NAME}_OUTPUT_DIR}/outputs/${_LTYPE})
else(WIN32)
# on UNIX, just set to same directory
set(CMAKE_${_TYPE}_OUTPUT_DIRECTORY ${${PROJECT_NAME}_OUTPUT_DIR})
endif(WIN32)
endforeach(_TYPE ARCHIVE LIBRARY RUNTIME)
# ---------------------------------------------------------------------------- #
# debug macro
#
if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
list(APPEND ${PROJECT_NAME}_DEFINITIONS DEBUG)
else("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
list(APPEND ${PROJECT_NAME}_DEFINITIONS NDEBUG)
endif("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
# ---------------------------------------------------------------------------- #
# used by configure_package_*
set(LIBNAME tomopy)
# ---------------------------------------------------------------------------- #
# set the compiler flags
add_c_flag_if_avail("-W")
if(NOT WIN32)
add_c_flag_if_avail("-Wall")
endif()
add_c_flag_if_avail("-Wextra")
add_c_flag_if_avail("-Wno-attributes")
add_c_flag_if_avail("-Wno-unused-variable")
add_c_flag_if_avail("-Wno-unknown-pragmas")
add_c_flag_if_avail("-Wno-unused-parameter")
add_c_flag_if_avail("-Wno-reserved-id-macro")
add_c_flag_if_avail("-Wunused-but-set-parameter")
# SIMD OpenMP
add_c_flag_if_avail("-fopenmp-simd")
add_cxx_flag_if_avail("-fopenmp-simd")
# Intel floating-point model
add_c_flag_if_avail("-fp-model=precise")
add_cxx_flag_if_avail("-fp-model=precise")
add_cxx_flag_if_avail("-W")
if(NOT WIN32)
add_cxx_flag_if_avail("-Wall")
endif()
add_cxx_flag_if_avail("-Wextra")
add_cxx_flag_if_avail("-Wno-attributes")
add_cxx_flag_if_avail("-Wno-unused-value")
add_cxx_flag_if_avail("-Wno-unused-variable")
add_cxx_flag_if_avail("-Wno-unknown-pragmas")
add_cxx_flag_if_avail("-Wno-unused-parameter")
add_cxx_flag_if_avail("-Wno-reserved-id-macro")
add_cxx_flag_if_avail("-Wno-implicit-fallthrough")
add_cxx_flag_if_avail("-Wunused-but-set-parameter")
add_cxx_flag_if_avail("-faligned-new")
if(TOMOPY_USE_ARCH)
if(CMAKE_C_COMPILER_IS_INTEL)
add_c_flag_if_avail("-xHOST")
if(TOMOPY_USE_AVX512)
add_c_flag_if_avail("-axMIC-AVX512")
endif()
else()
add_c_flag_if_avail("-march=native")
add_c_flag_if_avail("-mtune=native")
add_c_flag_if_avail("-msse2")
add_c_flag_if_avail("-msse3")
add_c_flag_if_avail("-mssse3")
add_c_flag_if_avail("-msse4")
add_c_flag_if_avail("-msse4.1")
add_c_flag_if_avail("-msse4.2")
add_c_flag_if_avail("-mavx")
add_c_flag_if_avail("-mavx2")
if(TOMOPY_USE_AVX512)
add_c_flag_if_avail("-mavx512f")
add_c_flag_if_avail("-mavx512pf")
add_c_flag_if_avail("-mavx512er")
add_c_flag_if_avail("-mavx512cd")
add_c_flag_if_avail("-mavx512vl")
add_c_flag_if_avail("-mavx512bw")
add_c_flag_if_avail("-mavx512dq")
add_c_flag_if_avail("-mavx512ifma")
add_c_flag_if_avail("-mavx512vbmi")
endif()
endif()
if(CMAKE_CXX_COMPILER_IS_INTEL)
add_cxx_flag_if_avail("-xHOST")
if(TOMOPY_USE_AVX512)
add_cxx_flag_if_avail("-axMIC-AVX512")
endif()
else()
add_cxx_flag_if_avail("-march=native")
add_cxx_flag_if_avail("-mtune=native")
add_cxx_flag_if_avail("-msse2")
add_cxx_flag_if_avail("-msse3")
add_cxx_flag_if_avail("-mssse3")
add_cxx_flag_if_avail("-msse4")
add_cxx_flag_if_avail("-msse4.1")
add_cxx_flag_if_avail("-msse4.2")
add_cxx_flag_if_avail("-mavx")
add_cxx_flag_if_avail("-mavx2")
if(TOMOPY_USE_AVX512)
add_cxx_flag_if_avail("-mavx512f")
add_cxx_flag_if_avail("-mavx512pf")
add_cxx_flag_if_avail("-mavx512er")
add_cxx_flag_if_avail("-mavx512cd")
add_cxx_flag_if_avail("-mavx512vl")
add_cxx_flag_if_avail("-mavx512bw")
add_cxx_flag_if_avail("-mavx512dq")
add_cxx_flag_if_avail("-mavx512ifma")
add_cxx_flag_if_avail("-mavx512vbmi")
endif()
endif()
endif()
if(TOMOPY_USE_SANITIZER)
add_c_flag_if_avail("-fsanitize=${SANITIZER_TYPE}")
add_cxx_flag_if_avail("-fsanitize=${SANITIZER_TYPE}")
if(c_fsanitize_${SANITIZER_TYPE} AND cxx_fsanitize_${SANITIZER_TYPE})
if("${SANITIZER_TYPE}" STREQUAL "memory")
list(APPEND TOMOPY_EXTERNAL_LIBRARIES msan)
elseif("${SANITIZER_TYPE}" STREQUAL "thread")
list(APPEND EXTERNAL_LIBRARUES tsan)
elseif("${SANITIZER_TYPE}" STREQUAL "leak")
list(APPEND TOMOPY_EXTERNAL_LIBRARIES lsan)
endif()
else()
unset(SANITIZER_TYPE CACHE)
set(TOMOPY_USE_SANITIZER OFF)
endif()
endif()
if(TOMOPY_USE_COVERAGE)
add_c_flag_if_avail("-ftest-coverage")
if(c_ftest_coverage)
list(APPEND ${PROJECT_NAME}_C_FLAGS "-fprofile-arcs")
endif()
add_cxx_flag_if_avail("-ftest-coverage")
if(cxx_ftest_coverage)
list(APPEND ${PROJECT_NAME}_CXX_FLAGS "-fprofile-arcs")
add(CMAKE_EXE_LINKER_FLAGS "-fprofile-arcs")
add_feature(CMAKE_EXE_LINKER_FLAGS "Linker flags")
endif()
endif()
# ---------------------------------------------------------------------------- #
# user customization
to_list(_CFLAGS "${CFLAGS};$ENV{CFLAGS}")
foreach(_FLAG ${_CFLAGS})
if(TOMOPY_USER_FLAGS)
list(APPEND ${PROJECT_NAME}_C_FLAGS "${_FLAG}")
else()
add_c_flag_if_avail("${_FLAG}")
endif()
endforeach()
to_list(_CXXFLAGS "${CXXFLAGS};$ENV{CXXFLAGS}")
foreach(_FLAG ${_CXXFLAGS})
if(TOMOPY_USER_FLAGS)
list(APPEND ${PROJECT_NAME}_CXX_FLAGS "${_FLAG}")
else()
add_cxx_flag_if_avail("${_FLAG}")
endif()
endforeach()
|