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