portable_concurrency
82 строки · 3.7 Кб
1if (MSVC)
2list(APPEND CMAKE_CONFIGURATION_TYPES ReleaseStatic)
3set(BUILD_SHARED_LIBS Off)
4set(CMAKE_C_FLAGS_RELEASESTATIC ${CMAKE_C_FLAGS_RELEASE})
5set(CMAKE_CXX_FLAGS_RELEASESTATIC ${CMAKE_CXX_FLAGS_RELEASE})
6set(CMAKE_EXE_LINKER_FLAGS_RELEASESTATIC ${CMAKE_EXE_LINKER_FLAGS_RELEASE})
7foreach(flag_var CMAKE_C_FLAGS_RELEASESTATIC CMAKE_CXX_FLAGS_RELEASESTATIC)
8if(${flag_var} MATCHES "/MD")
9string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
10endif()
11endforeach()
12
13list(APPEND CMAKE_CONFIGURATION_TYPES DebugStatic)
14set(BUILD_SHARED_LIBS Off)
15set(CMAKE_C_FLAGS_DEBUGSTATIC ${CMAKE_C_FLAGS_DEBUG})
16set(CMAKE_CXX_FLAGS_DEBUGSTATIC ${CMAKE_CXX_FLAGS_DEBUG})
17set(CMAKE_EXE_LINKER_FLAGS_DEBUGSTATIC ${CMAKE_EXE_LINKER_FLAGS_DEBUG})
18foreach(flag_var CMAKE_C_FLAGS_DEBUGSTATIC CMAKE_CXX_FLAGS_DEBUGSTATIC)
19if(${flag_var} MATCHES "/MDd")
20string(REGEX REPLACE "/MDd" "/MTd" ${flag_var} "${${flag_var}}")
21endif()
22endforeach()
23else()
24include(CheckCXXCompilerFlag)
25
26set(CMAKE_REQUIRED_LIBRARIES "-fsanitize=undefined")
27check_cxx_compiler_flag("-fsanitize=undefined -fno-sanitize-recover=all" UBSAN_FOUND)
28
29set(CMAKE_REQUIRED_LIBRARIES "-fsanitize=thread")
30check_cxx_compiler_flag("-fsanitize=thread -fno-sanitize-recover=all" TSAN_FOUND)
31
32set(CMAKE_REQUIRED_LIBRARIES "-fsanitize=address")
33check_cxx_compiler_flag("-fsanitize=address -fno-sanitize-recover=all" ASAN_FOUND)
34
35set(CMAKE_REQUIRED_LIBRARIES "-pg")
36check_cxx_compiler_flag("-pg" GPROF_FOUND)
37
38set(CMAKE_REQUIRED_LIBRARIES "--coverage")
39check_cxx_compiler_flag("--coverage" GCOV_FOUND)
40
41unset(CMAKE_REQUIRED_LIBRARIES)
42
43if (UBSAN_FOUND)
44message(STATUS "UB sanitizer available. Adding UBsan build type")
45list(APPEND CMAKE_CONFIGURATION_TYPES UBsan)
46set(CMAKE_C_FLAGS_UBSAN "${CMAKE_C_FLAGS_DEBUG} -fsanitize=undefined -fno-sanitize-recover=all")
47set(CMAKE_CXX_FLAGS_UBSAN "${CMAKE_CXX_FLAGS_DEBUG} -fsanitize=undefined -fno-sanitize-recover=all")
48set(CMAKE_EXE_LINKER_FLAGS_UBSAN "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -fsanitize=undefined -fno-sanitize-recover=all")
49endif()
50
51if (TSAN_FOUND)
52message(STATUS "Thread sanitizer available. Adding Tsan build type")
53list(APPEND CMAKE_CONFIGURATION_TYPES Tsan)
54set(CMAKE_C_FLAGS_TSAN "${CMAKE_C_FLAGS_DEBUG} -fsanitize=thread -fno-sanitize-recover=all")
55set(CMAKE_CXX_FLAGS_TSAN "${CMAKE_CXX_FLAGS_DEBUG} -fsanitize=thread -fno-sanitize-recover=all")
56set(CMAKE_EXE_LINKER_FLAGS_TSAN "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -fsanitize=thread -fno-sanitize-recover=all")
57endif()
58
59if (ASAN_FOUND)
60message(STATUS "Address sanitizer available. Adding Asan build type")
61list(APPEND CMAKE_CONFIGURATION_TYPES Asan)
62set(CMAKE_C_FLAGS_ASAN "${CMAKE_C_FLAGS_DEBUG} -fsanitize=address -fno-sanitize-recover=all")
63set(CMAKE_CXX_FLAGS_ASAN "${CMAKE_CXX_FLAGS_DEBUG} -fsanitize=address -fno-sanitize-recover=all")
64set(CMAKE_EXE_LINKER_FLAGS_ASAN "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -fsanitize=address -fno-sanitize-recover=all")
65endif()
66
67if (GPROF_FOUND)
68message(STATUS "GProf profiler available. Adding GProf build type")
69list(APPEND CMAKE_CONFIGURATION_TYPES GProf)
70set(CMAKE_C_FLAGS_GPROF "${CMAKE_C_FLAGS_RELWITHDEBINFO} -pg")
71set(CMAKE_CXX_FLAGS_GPROF "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -pg")
72set(CMAKE_EXE_LINKER_FLAGS_GPROF "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO} -pg")
73endif()
74
75if (GCOV_FOUND)
76message(STATUS "GCov coverage measurment available. Adding GCov build type")
77list(APPEND CMAKE_CONFIGURATION_TYPES GCov)
78set(CMAKE_C_FLAGS_GCOV "${CMAKE_C_FLAGS_DEBUG} --coverage")
79set(CMAKE_CXX_FLAGS_GCOV "${CMAKE_CXX_FLAGS_DEBUG} --coverage")
80set(CMAKE_EXE_LINKER_FLAGS_GCOV "${CMAKE_EXE_LINKER_FLAGS_DEBUG}")
81endif()
82endif()
83