CMakeLists.txt revision 2d1fdb26e458c4ddc04155c1d421bced3ba90cd0
1include(CompilerRTCompile) 2 3set(SANITIZER_UNITTESTS 4 sanitizer_allocator_test.cc 5 sanitizer_atomic_test.cc 6 sanitizer_bitvector_test.cc 7 sanitizer_bvgraph_test.cc 8 sanitizer_common_test.cc 9 sanitizer_deadlock_detector_test.cc 10 sanitizer_flags_test.cc 11 sanitizer_format_interceptor_test.cc 12 sanitizer_ioctl_test.cc 13 sanitizer_libc_test.cc 14 sanitizer_linux_test.cc 15 sanitizer_list_test.cc 16 sanitizer_mutex_test.cc 17 sanitizer_nolibc_test.cc 18 sanitizer_posix_test.cc 19 sanitizer_printf_test.cc 20 sanitizer_procmaps_test.cc 21 sanitizer_stackdepot_test.cc 22 sanitizer_stacktrace_test.cc 23 sanitizer_stoptheworld_test.cc 24 sanitizer_suppressions_test.cc 25 sanitizer_test_main.cc 26 sanitizer_thread_registry_test.cc) 27 28set(SANITIZER_TEST_HEADERS 29 sanitizer_pthread_wrappers.h 30 sanitizer_test_config.h 31 sanitizer_test_utils.h) 32foreach(header ${SANITIZER_HEADERS}) 33 list(APPEND SANITIZER_TEST_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/../${header}) 34endforeach() 35 36set(SANITIZER_TEST_CFLAGS_COMMON 37 ${COMPILER_RT_GTEST_CFLAGS} 38 -I${COMPILER_RT_SOURCE_DIR}/include 39 -I${COMPILER_RT_SOURCE_DIR}/lib 40 -I${COMPILER_RT_SOURCE_DIR}/lib/sanitizer_common 41 -DGTEST_HAS_RTTI=0 42 -O2 43 -Werror=sign-compare 44 -Wno-non-virtual-dtor) 45 46append_if(COMPILER_RT_HAS_G_FLAG -g SANITIZER_TEST_CFLAGS_COMMON) 47append_if(COMPILER_RT_HAS_Zi_FLAG -Zi SANITIZER_TEST_CFLAGS_COMMON) 48 49append_if(COMPILER_RT_HAS_FNO_RTTI_FLAG -fno-rtti SANITIZER_TEST_CFLAGS_COMMON) 50append_if(COMPILER_RT_HAS_GR_FLAG -GR- SANITIZER_TEST_CFLAGS_COMMON) 51 52if(MSVC) 53 # System headers and gtest use a lot of deprecated stuff. 54 list(APPEND SANITIZER_TEST_CFLAGS_COMMON 55 -Wno-deprecated-declarations) 56 57 # clang-cl doesn't support exceptions yet. 58 list(APPEND SANITIZER_TEST_CFLAGS_COMMON 59 /fallback 60 -D_HAS_EXCEPTIONS=0) 61 62 # We should teach clang-cl to understand more pragmas. 63 list(APPEND SANITIZER_TEST_CFLAGS_COMMON 64 -Wno-unknown-pragmas 65 -Wno-undefined-inline) 66endif() 67 68if(NOT MSVC) 69 list(APPEND SANITIZER_TEST_LINK_FLAGS_COMMON --driver-mode=g++) 70endif() 71 72append_if(COMPILER_RT_HAS_LIBDL -ldl SANITIZER_TEST_LINK_FLAGS_COMMON) 73append_if(COMPILER_RT_HAS_LIBPTHREAD -lpthread SANITIZER_TEST_LINK_FLAGS_COMMON) 74# x86_64 FreeBSD 9.2 additionally requires libc++ to build the tests. 75if(CMAKE_SYSTEM MATCHES "FreeBSD-9.2-RELEASE") 76 list(APPEND SANITIZER_TEST_LINK_FLAGS_COMMON "-lc++") 77endif() 78 79include_directories(..) 80include_directories(../..) 81 82# Adds static library which contains sanitizer_common object file 83# (universal binary on Mac and arch-specific object files on Linux). 84macro(add_sanitizer_common_lib library) 85 add_library(${library} STATIC ${ARGN}) 86 set_target_properties(${library} PROPERTIES 87 ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) 88endmacro() 89 90function(get_sanitizer_common_lib_for_arch arch lib lib_name) 91 if(APPLE) 92 set(tgt_name "RTSanitizerCommon.test.osx") 93 else() 94 set(tgt_name "RTSanitizerCommon.test.${arch}") 95 endif() 96 set(${lib} "${tgt_name}" PARENT_SCOPE) 97 if(NOT MSVC) 98 set(${lib_name} "lib${tgt_name}.a" PARENT_SCOPE) 99 else() 100 set(${lib_name} "${tgt_name}.lib" PARENT_SCOPE) 101 endif() 102endfunction() 103 104# Sanitizer_common unit tests testsuite. 105add_custom_target(SanitizerUnitTests) 106set_target_properties(SanitizerUnitTests PROPERTIES 107 FOLDER "Sanitizer unittests") 108 109# Adds sanitizer tests for architecture. 110macro(add_sanitizer_tests_for_arch arch) 111 get_target_flags_for_arch(${arch} TARGET_FLAGS) 112 set(SANITIZER_TEST_SOURCES ${SANITIZER_UNITTESTS} 113 ${COMPILER_RT_GTEST_SOURCE}) 114 set(SANITIZER_TEST_COMPILE_DEPS ${SANITIZER_TEST_HEADERS}) 115 if(NOT COMPILER_RT_STANDALONE_BUILD) 116 list(APPEND SANITIZER_TEST_COMPILE_DEPS gtest) 117 endif() 118 set(SANITIZER_TEST_OBJECTS) 119 foreach(source ${SANITIZER_TEST_SOURCES}) 120 get_filename_component(basename ${source} NAME) 121 set(output_obj "${basename}.${arch}.o") 122 clang_compile(${output_obj} ${source} 123 CFLAGS ${SANITIZER_TEST_CFLAGS_COMMON} ${TARGET_FLAGS} 124 DEPS ${SANITIZER_TEST_COMPILE_DEPS}) 125 list(APPEND SANITIZER_TEST_OBJECTS ${output_obj}) 126 endforeach() 127 get_sanitizer_common_lib_for_arch(${arch} SANITIZER_COMMON_LIB 128 SANITIZER_COMMON_LIB_NAME) 129 # Add unittest target. 130 set(SANITIZER_TEST_NAME "Sanitizer-${arch}-Test") 131 add_compiler_rt_test(SanitizerUnitTests ${SANITIZER_TEST_NAME} 132 OBJECTS ${SANITIZER_TEST_OBJECTS} 133 ${SANITIZER_COMMON_LIB_NAME} 134 DEPS ${SANITIZER_TEST_OBJECTS} ${SANITIZER_COMMON_LIB} 135 LINK_FLAGS ${SANITIZER_TEST_LINK_FLAGS_COMMON} 136 ${TARGET_FLAGS}) 137 138 if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux" AND "${arch}" STREQUAL "x86_64") 139 # Test that the libc-independent part of sanitizer_common is indeed 140 # independent of libc, by linking this binary without libc (here) and 141 # executing it (unit test in sanitizer_nolibc_test.cc). 142 clang_compile(sanitizer_nolibc_test_main.${arch}.o 143 sanitizer_nolibc_test_main.cc 144 CFLAGS ${SANITIZER_TEST_CFLAGS_COMMON} ${TARGET_FLAGS} 145 DEPS ${SANITIZER_TEST_COMPILE_DEPS}) 146 add_compiler_rt_test(SanitizerUnitTests "Sanitizer-${arch}-Test-Nolibc" 147 OBJECTS sanitizer_nolibc_test_main.${arch}.o 148 -Wl,-whole-archive 149 libRTSanitizerCommon.test.nolibc.${arch}.a 150 -Wl,-no-whole-archive 151 DEPS sanitizer_nolibc_test_main.${arch}.o 152 RTSanitizerCommon.test.nolibc.${arch} 153 LINK_FLAGS -nostdlib ${TARGET_FLAGS}) 154 endif() 155endmacro() 156 157if(COMPILER_RT_CAN_EXECUTE_TESTS) 158 # We use just-built clang to build sanitizer_common unittests, so we must 159 # be sure that produced binaries would work. 160 if(APPLE) 161 add_sanitizer_common_lib("RTSanitizerCommon.test.osx" 162 $<TARGET_OBJECTS:RTSanitizerCommon.osx>) 163 else() 164 if(CAN_TARGET_x86_64) 165 add_sanitizer_common_lib("RTSanitizerCommon.test.x86_64" 166 $<TARGET_OBJECTS:RTSanitizerCommon.x86_64> 167 $<TARGET_OBJECTS:RTSanitizerCommonLibc.x86_64>) 168 add_sanitizer_common_lib("RTSanitizerCommon.test.nolibc.x86_64" 169 $<TARGET_OBJECTS:RTSanitizerCommon.x86_64>) 170 endif() 171 if(CAN_TARGET_i386) 172 add_sanitizer_common_lib("RTSanitizerCommon.test.i386" 173 $<TARGET_OBJECTS:RTSanitizerCommon.i386> 174 $<TARGET_OBJECTS:RTSanitizerCommonLibc.i386>) 175 endif() 176 endif() 177 if(CAN_TARGET_x86_64) 178 add_sanitizer_tests_for_arch(x86_64) 179 endif() 180 if(CAN_TARGET_i386) 181 add_sanitizer_tests_for_arch(i386) 182 endif() 183endif() 184 185if(ANDROID) 186 # We assume that unit tests on Android are built in a build 187 # tree with fresh Clang as a host compiler. 188 add_executable(SanitizerTest 189 ${SANITIZER_UNITTESTS} 190 ${COMPILER_RT_GTEST_SOURCE} 191 $<TARGET_OBJECTS:RTSanitizerCommon.arm.android>) 192 set_target_compile_flags(SanitizerTest 193 ${SANITIZER_COMMON_CFLAGS} 194 ${SANITIZER_TEST_CFLAGS_COMMON}) 195 # Setup correct output directory and link flags. 196 set_target_properties(SanitizerTest PROPERTIES 197 RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) 198 set_target_link_flags(SanitizerTest ${SANITIZER_TEST_LINK_FLAGS_COMMON}) 199 target_link_libraries(SanitizerTest log) 200 # Add unit test to test suite. 201 add_dependencies(SanitizerUnitTests SanitizerTest) 202endif() 203