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