1include(CheckCXXCompilerFlag) 2include(CpuMarch) 3include(CheckCXXCompilerFlagAndEnableIt) 4 5# yes, need to keep both the CMAKE_CXX_FLAGS and CMAKE_CXX_STANDARD. 6# with just the CMAKE_CXX_STANDARD, try_compile() breaks: 7# https://gitlab.kitware.com/cmake/cmake/issues/16456 8# with just the CMAKE_CXX_FLAGS, 'bundled' pugixml breaks tests 9# https://github.com/darktable-org/rawspeed/issues/112#issuecomment-321517003 10 11message(STATUS "Checking for -std=c++14 support") 12CHECK_CXX_COMPILER_FLAG("-std=c++14" COMPILER_SUPPORTS_CXX14) 13if(NOT COMPILER_SUPPORTS_CXX14) 14 message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++14 support. Please use a different C++ compiler.") 15else() 16 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14") 17 message(STATUS "Checking for -std=c++14 support - works") 18endif() 19 20set(CMAKE_CXX_STANDARD 14) 21set(CMAKE_CXX_STANDARD_REQUIRED ON) 22set(CMAKE_CXX_EXTENSIONS OFF) 23 24include(debug-info) 25 26if(RAWSPEED_RELEASE_BUILD) 27 # want assertions in all but Release build type. 28 add_definitions(-DNDEBUG) 29elseif(NOT (RAWSPEED_RELWITHDEBINFO_BUILD OR RAWSPEED_FUZZ_BUILD)) 30 # if not Release/RelWithDebInfo/Fuzz build, enable extra debug mode 31 add_definitions(-DDEBUG) 32 33 # all this does not work with integer sanitizer 34 # add_definitions(-D_GLIBCXX_ASSERTIONS) 35 # add_definitions(-D_GLIBCXX_DEBUG) 36 # add_definitions(-D_GLIBCXX_DEBUG_PEDANTIC) 37 38 add_definitions(-D_GLIBCXX_SANITIZE_VECTOR) 39endif() 40 41set(CMAKE_C_VISIBILITY_PRESET hidden) 42set(CMAKE_CXX_VISIBILITY_PRESET hidden) 43set(CMAKE_VISIBILITY_INLINES_HIDDEN 1) 44 45IF(NOT APPLE) 46 set(linkerflags "-Wl,--as-needed") 47ELSE() 48 set(linkerflags "") 49ENDIF() 50# NOT CMAKE_STATIC_LINKER_FLAGS 51SET(CMAKE_SHARED_LINKER_FLAGS 52 "${CMAKE_SHARED_LINKER_FLAGS} ${linkerflags}" 53 CACHE STRING "" FORCE ) 54SET(CMAKE_EXE_LINKER_FLAGS 55 "${CMAKE_EXE_LINKER_FLAGS} ${linkerflags}" 56 CACHE STRING "" FORCE ) 57SET(CMAKE_MODULE_LINKER_FLAGS 58 "${CMAKE_MODULE_LINKER_FLAGS} ${linkerflags}" 59 CACHE STRING "" FORCE ) 60MARK_AS_ADVANCED( 61 CMAKE_SHARED_LINKER_FLAGS 62 CMAKE_EXE_LINKER_FLAGS 63 CMAKE_MODULE_LINKER_FLAGS ) 64 65if(RAWSPEED_ENABLE_LTO) 66 if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") 67 include(llvm-toolchain) 68 set(lto_compile "-flto=thin -fforce-emit-vtables -fwhole-program-vtables -fstrict-vtable-pointers") 69 set(lto_link "-flto=thin -fuse-ld=\"${LLVMLLD_EXECUTABLE}\" ${LLVMLLD_INCREMENTAL_LDFLAGS}") 70 elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") 71 include(gcc-toolchain) 72 set(lto_compile "-flto") 73 set(lto_link "-flto") 74 elseif(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") 75 set(lto_compile "-flto=thin -fstrict-vtable-pointers") 76 set(lto_link "-flto=thin") 77 endif() 78 79 set(CMAKE_C_FLAGS 80 "${CMAKE_C_FLAGS} ${lto_compile}" 81 CACHE STRING "Flags used by the C compiler during all builds." 82 FORCE ) 83 set(CMAKE_CXX_FLAGS 84 "${CMAKE_CXX_FLAGS} ${lto_compile}" 85 CACHE STRING "Flags used by the C++ compiler during all builds." 86 FORCE ) 87 set(CMAKE_EXE_LINKER_FLAGS 88 "${CMAKE_EXE_LINKER_FLAGS} ${lto_link}" 89 CACHE STRING "Flags used for linking binaries during all builds." 90 FORCE ) 91 set(CMAKE_SHARED_LINKER_FLAGS 92 "${CMAKE_SHARED_LINKER_FLAGS} ${lto_link}" 93 CACHE STRING "Flags used by the shared libraries linker during all builds." 94 FORCE ) 95 set(CMAKE_MODULE_LINKER_FLAGS 96 "${CMAKE_MODULE_LINKER_FLAGS} ${lto_link}" 97 CACHE STRING "Flags used by the module linker during all builds." 98 FORCE ) 99 mark_as_advanced( 100 CMAKE_C_FLAGS 101 CMAKE_CXX_FLAGS 102 CMAKE_EXE_LINKER_FLAGS 103 CMAKE_SHARED_LINKER_FLAGS 104 CMAKE_MODULE_LINKER_FLAGS ) 105endif() 106 107set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0") 108set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0") 109 110if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") 111 set(coverage_compilation "-fprofile-instr-generate=\"default-%m-%p.profraw\" -fcoverage-mapping") 112 set(coverage_link "") 113elseif(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") 114 set(coverage_compilation "-fprofile-arcs -ftest-coverage") 115 set(coverage_link "--coverage") 116endif() 117 118SET(CMAKE_CXX_FLAGS_COVERAGE 119 "${coverage_compilation}" 120 CACHE STRING "Flags used by the C++ compiler during coverage builds." 121 FORCE ) 122SET(CMAKE_C_FLAGS_COVERAGE 123 "${coverage_compilation}" 124 CACHE STRING "Flags used by the C compiler during coverage builds." 125 FORCE ) 126SET(CMAKE_EXE_LINKER_FLAGS_COVERAGE 127 "${coverage_compilation} ${coverage_link}" 128 CACHE STRING "Flags used for linking binaries during coverage builds." 129 FORCE ) 130SET(CMAKE_SHARED_LINKER_FLAGS_COVERAGE 131 "${coverage_compilation} ${coverage_link}" 132 CACHE STRING "Flags used by the shared libraries linker during coverage builds." 133 FORCE ) 134SET(CMAKE_MODULE_LINKER_FLAGS_COVERAGE 135 "${coverage_compilation} ${coverage_link}" 136 CACHE STRING "Flags used by the module linker during coverage builds." 137 FORCE ) 138MARK_AS_ADVANCED( 139 CMAKE_CXX_FLAGS_COVERAGE 140 CMAKE_C_FLAGS_COVERAGE 141 CMAKE_EXE_LINKER_FLAGS_COVERAGE 142 CMAKE_SHARED_LINKER_FLAGS_COVERAGE 143 CMAKE_MODULE_LINKER_FLAGS_COVERAGE ) 144 145# -fstack-protector-all 146set(SANITIZATION_DEFAULTS "-O3 -fno-optimize-sibling-calls") 147 148set(asan "-fsanitize=address -fno-omit-frame-pointer -fno-common -U_FORTIFY_SOURCE") 149if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") 150 set(asan "${asan} -fsanitize-address-use-after-scope") 151endif() 152 153set(ubsan "-fsanitize=undefined -fno-sanitize-recover=undefined") 154if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") 155 set(ubsan "${ubsan} -fsanitize=integer -fno-sanitize-recover=integer") 156endif() 157 158SET(CMAKE_CXX_FLAGS_SANITIZE 159 "${SANITIZATION_DEFAULTS} ${asan} ${ubsan}" 160 CACHE STRING "Flags used by the C++ compiler during sanitized (ASAN+UBSAN) builds." 161 FORCE ) 162SET(CMAKE_C_FLAGS_SANITIZE 163 "${SANITIZATION_DEFAULTS} ${asan} ${ubsan}" 164 CACHE STRING "Flags used by the C compiler during sanitized (ASAN+UBSAN) builds." 165 FORCE ) 166MARK_AS_ADVANCED( 167 CMAKE_CXX_FLAGS_SANITIZE 168 CMAKE_C_FLAGS_SANITIZE ) 169 170set(fuzz "-O3 -ffast-math") 171 172if(NOT LIB_FUZZING_ENGINE) 173 set(fuzz "${fuzz} ${asan} ${ubsan}") 174 set(fuzz "${fuzz} -fsanitize=fuzzer-no-link") 175else() 176 # specialhandling: oss-fuzz provides all the needed flags already. 177 message(STATUS "LIB_FUZZING_ENGINE override option is passed, not setting special compiler flags.") 178endif() 179 180set(fuzz "${fuzz} -DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION") 181set(fuzz "${fuzz} -ffunction-sections -fdata-sections") 182set(fuzz_link "-Wl,--gc-sections") 183SET(CMAKE_CXX_FLAGS_FUZZ 184 "${fuzz}" 185 CACHE STRING "Flags used by the C++ compiler during FUZZ builds." 186 FORCE ) 187SET(CMAKE_C_FLAGS_FUZZ 188 "${fuzz}" 189 CACHE STRING "Flags used by the C compiler during FUZZ builds." 190 FORCE ) 191SET(CMAKE_EXE_LINKER_FLAGS_FUZZ 192 "${fuzz} ${fuzz_link}" 193 CACHE STRING "Flags used for linking binaries during FUZZ builds." 194 FORCE ) 195SET(CMAKE_SHARED_LINKER_FLAGS_FUZZ 196 "${fuzz} ${fuzz_link}" 197 CACHE STRING "Flags used by the shared libraries linker during FUZZ builds." 198 FORCE ) 199SET(CMAKE_MODULE_LINKER_FLAGS_FUZZ 200 "${fuzz} ${fuzz_link}" 201 CACHE STRING "Flags used by the module linker during FUZZ builds." 202 FORCE ) 203MARK_AS_ADVANCED( 204 CMAKE_CXX_FLAGS_FUZZ 205 CMAKE_C_FLAGS_FUZZ 206 CMAKE_EXE_LINKER_FLAGS_FUZZ 207 CMAKE_SHARED_LINKER_FLAGS_FUZZ 208 CMAKE_MODULE_LINKER_FLAGS_FUZZ ) 209 210set(ubsan "${SANITIZATION_DEFAULTS} -fsanitize=thread") 211SET(CMAKE_CXX_FLAGS_TSAN 212 "${ubsan}" 213 CACHE STRING "Flags used by the C++ compiler during TSAN builds." 214 FORCE ) 215SET(CMAKE_C_FLAGS_TSAN 216 "${ubsan}" 217 CACHE STRING "Flags used by the C compiler during TSAN builds." 218 FORCE ) 219# SET(CMAKE_EXE_LINKER_FLAGS_TSAN 220# "-no-pie" 221# CACHE STRING "Flags used for linking binaries during TSAN builds." 222# FORCE ) 223# SET(CMAKE_SHARED_LINKER_FLAGS_TSAN 224# "-no-pie" 225# CACHE STRING "Flags used by the shared libraries linker during TSAN builds." 226# FORCE ) 227# SET(CMAKE_SHARED_MODULE_FLAGS_TSAN 228# "-no-pie" 229# CACHE STRING "Flags used by the module linker during TSAN builds." 230# FORCE ) 231MARK_AS_ADVANCED( 232 CMAKE_CXX_FLAGS_TSAN 233 CMAKE_C_FLAGS_TSAN 234 CMAKE_EXE_LINKER_FLAGS_TSAN 235 CMAKE_SHARED_LINKER_FLAGS_TSAN 236 CMAKE_SHARED_MODULE_FLAGS_TSAN ) 237 238set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -O2") 239set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -O2") 240 241set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3") 242set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3") 243