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