CMakeLists.txt revision cc8ed30ebfb4ff6f9d9c7e77760dd5c7841a1af8
1include(CompilerRTCompile) 2 3set(SANITIZER_UNITTESTS 4 sanitizer_allocator_test.cc 5 sanitizer_atomic_test.cc 6 sanitizer_common_test.cc 7 sanitizer_flags_test.cc 8 sanitizer_libc_test.cc 9 sanitizer_linux_test.cc 10 sanitizer_list_test.cc 11 sanitizer_mutex_test.cc 12 sanitizer_nolibc_test.cc 13 sanitizer_printf_test.cc 14 sanitizer_scanf_interceptor_test.cc 15 sanitizer_stackdepot_test.cc 16 sanitizer_stacktrace_test.cc 17 sanitizer_stoptheworld_test.cc 18 sanitizer_test_main.cc 19 sanitizer_thread_registry_test.cc 20 ) 21 22set(SANITIZER_TEST_HEADERS) 23foreach(header ${SANITIZER_HEADERS}) 24 list(APPEND SANITIZER_TEST_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/../${header}) 25endforeach() 26 27set(SANITIZER_TEST_CFLAGS_COMMON 28 ${COMPILER_RT_GTEST_INCLUDE_CFLAGS} 29 -I${COMPILER_RT_SOURCE_DIR}/include 30 -I${COMPILER_RT_SOURCE_DIR}/lib 31 -I${COMPILER_RT_SOURCE_DIR}/lib/sanitizer_common 32 -DGTEST_HAS_RTTI=0 33 -O2 -g -fno-rtti 34 -Wall -Werror -Werror=sign-compare) 35 36set(SANITIZER_TEST_LINK_FLAGS_COMMON 37 -lstdc++ -ldl) 38 39include_directories(..) 40include_directories(../..) 41 42# Adds static library which contains sanitizer_common object file 43# (universal binary on Mac and arch-specific object files on Linux). 44macro(add_sanitizer_common_lib library) 45 add_library(${library} STATIC ${ARGN}) 46 set_target_properties(${library} PROPERTIES 47 ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) 48endmacro() 49 50function(get_sanitizer_common_lib_for_arch arch lib lib_name) 51 if(APPLE) 52 set(tgt_name "RTSanitizerCommon.test.osx") 53 else() 54 set(tgt_name "RTSanitizerCommon.test.${arch}") 55 endif() 56 set(${lib} "${tgt_name}" PARENT_SCOPE) 57 set(${lib_name} "lib${tgt_name}.a" PARENT_SCOPE) 58endfunction() 59 60# Sanitizer_common unit tests testsuite. 61add_custom_target(SanitizerUnitTests) 62set_target_properties(SanitizerUnitTests PROPERTIES 63 FOLDER "Sanitizer unittests") 64 65# Adds sanitizer tests for architecture. 66macro(add_sanitizer_tests_for_arch arch) 67 get_target_flags_for_arch(${arch} TARGET_FLAGS) 68 set(SANITIZER_TEST_SOURCES ${SANITIZER_UNITTESTS} 69 ${COMPILER_RT_GTEST_SOURCE}) 70 set(SANITIZER_TEST_OBJECTS) 71 foreach(source ${SANITIZER_TEST_SOURCES}) 72 get_filename_component(basename ${source} NAME) 73 set(output_obj "${basename}.${arch}.o") 74 clang_compile(${output_obj} ${source} 75 CFLAGS ${SANITIZER_TEST_CFLAGS_COMMON} ${TARGET_FLAGS} 76 DEPS gtest ${SANITIZER_RUNTIME_LIBRARIES} 77 ${SANITIZER_TEST_HEADERS}) 78 list(APPEND SANITIZER_TEST_OBJECTS ${output_obj}) 79 endforeach() 80 get_sanitizer_common_lib_for_arch(${arch} SANITIZER_COMMON_LIB 81 SANITIZER_COMMON_LIB_NAME) 82 # Add unittest target. 83 set(SANITIZER_TEST_NAME "Sanitizer-${arch}-Test") 84 add_compiler_rt_test(SanitizerUnitTests ${SANITIZER_TEST_NAME} 85 OBJECTS ${SANITIZER_TEST_OBJECTS} 86 ${SANITIZER_COMMON_LIB_NAME} 87 DEPS ${SANITIZER_TEST_OBJECTS} ${SANITIZER_COMMON_LIB} 88 LINK_FLAGS ${SANITIZER_TEST_LINK_FLAGS_COMMON} 89 -lpthread ${TARGET_FLAGS}) 90 91 if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux" AND "${arch}" STREQUAL "x86_64") 92 # Test that the libc-independent part of sanitizer_common is indeed 93 # independent of libc, by linking this binary without libc (here) and 94 # executing it (unit test in sanitizer_nolibc_test.cc). 95 clang_compile(sanitizer_nolibc_test_main.${arch}.o 96 sanitizer_nolibc_test_main.cc 97 CFLAGS ${SANITIZER_TEST_CFLAGS_COMMON} ${TARGET_FLAGS} 98 DEPS ${SANITIZER_RUNTIME_LIBRARIES} ${SANITIZER_TEST_HEADERS}) 99 add_compiler_rt_test(SanitizerUnitTests "Sanitizer-${arch}-Test-Nolibc" 100 OBJECTS sanitizer_nolibc_test_main.${arch}.o 101 -Wl,-whole-archive 102 libRTSanitizerCommon.test.nolibc.${arch}.a 103 -Wl,-no-whole-archive 104 DEPS sanitizer_nolibc_test_main.${arch}.o 105 RTSanitizerCommon.test.nolibc.${arch} 106 LINK_FLAGS -nostdlib ${TARGET_FLAGS}) 107 endif() 108endmacro() 109 110if(COMPILER_RT_CAN_EXECUTE_TESTS) 111 # We use just-built clang to build sanitizer_common unittests, so we must 112 # be sure that produced binaries would work. 113 if(APPLE) 114 add_sanitizer_common_lib("RTSanitizerCommon.test.osx" 115 $<TARGET_OBJECTS:RTSanitizerCommon.osx>) 116 else() 117 if(CAN_TARGET_x86_64) 118 add_sanitizer_common_lib("RTSanitizerCommon.test.x86_64" 119 $<TARGET_OBJECTS:RTSanitizerCommon.x86_64> 120 $<TARGET_OBJECTS:RTSanitizerCommonLibc.x86_64>) 121 add_sanitizer_common_lib("RTSanitizerCommon.test.nolibc.x86_64" 122 $<TARGET_OBJECTS:RTSanitizerCommon.x86_64>) 123 endif() 124 if(CAN_TARGET_i386) 125 add_sanitizer_common_lib("RTSanitizerCommon.test.i386" 126 $<TARGET_OBJECTS:RTSanitizerCommon.i386> 127 $<TARGET_OBJECTS:RTSanitizerCommonLibc.i386>) 128 endif() 129 endif() 130 if(CAN_TARGET_x86_64) 131 add_sanitizer_tests_for_arch(x86_64) 132 endif() 133 if(CAN_TARGET_i386) 134 add_sanitizer_tests_for_arch(i386) 135 endif() 136 137 # Run unittests as a part of lit testsuite. 138 configure_lit_site_cfg( 139 ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.in 140 ${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg 141 ) 142 143 add_lit_testsuite(check-sanitizer "Running sanitizer library unittests" 144 ${CMAKE_CURRENT_BINARY_DIR} 145 DEPENDS SanitizerUnitTests 146 ) 147 set_target_properties(check-sanitizer PROPERTIES FOLDER "Sanitizer unittests") 148endif() 149 150if(ANDROID) 151 # We assume that unit tests on Android are built in a build 152 # tree with fresh Clang as a host compiler. 153 add_executable(SanitizerTest 154 ${SANITIZER_UNITTESTS} 155 ${COMPILER_RT_GTEST_SOURCE} 156 $<TARGET_OBJECTS:RTSanitizerCommon.arm.android>) 157 set_target_compile_flags(SanitizerTest 158 ${SANITIZER_COMMON_CFLAGS} 159 ${SANITIZER_TEST_CFLAGS_COMMON}) 160 # Setup correct output directory and link flags. 161 set_target_properties(SanitizerTest PROPERTIES 162 RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) 163 set_target_link_flags(SanitizerTest ${SANITIZER_TEST_LINK_FLAGS_COMMON}) 164 # Add unit test to test suite. 165 add_dependencies(SanitizerUnitTests SanitizerTest) 166endif() 167