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