CMakeLists.txt revision f4f51f2cc6fa936f0c65577f82e6b62989d546ee
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_stackdepot_test.cc 13 sanitizer_test_main.cc 14 ) 15 16set(SANITIZER_TEST_HEADERS) 17foreach(header ${SANITIZER_HEADERS}) 18 list(APPEND SANITIZER_TEST_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/../${header}) 19endforeach() 20 21include_directories(..) 22include_directories(../..) 23 24# Adds static library which contains sanitizer_common object file 25# (universal binary on Mac and arch-specific object files on Linux). 26macro(add_sanitizer_common_lib library) 27 add_library(${library} STATIC ${ARGN}) 28 set_target_properties(${library} PROPERTIES 29 ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) 30endmacro() 31 32function(get_sanitizer_common_lib_for_arch arch lib lib_name) 33 if(APPLE) 34 set(tgt_name "RTSanitizerCommon.test.osx") 35 else() 36 set(tgt_name "RTSanitizerCommon.test.${arch}") 37 endif() 38 set(${lib} "${tgt_name}" PARENT_SCOPE) 39 set(${lib_name} "lib${tgt_name}.a" PARENT_SCOPE) 40endfunction() 41 42# Sanitizer_common unit tests testsuite. 43add_custom_target(SanitizerUnitTests) 44set_target_properties(SanitizerUnitTests PROPERTIES 45 FOLDER "Sanitizer unittests") 46 47# Adds sanitizer tests for architecture. 48macro(add_sanitizer_tests_for_arch arch) 49 get_target_flags_for_arch(${arch} TARGET_FLAGS) 50 set(SANITIZER_TEST_SOURCES ${SANITIZER_UNITTESTS} 51 ${COMPILER_RT_GTEST_SOURCE}) 52 set(SANITIZER_TEST_CFLAGS ${COMPILER_RT_GTEST_INCLUDE_CFLAGS} 53 -I${COMPILER_RT_SOURCE_DIR}/include 54 -I${COMPILER_RT_SOURCE_DIR}/lib 55 -I${COMPILER_RT_SOURCE_DIR}/lib/sanitizer_common 56 -O2 -g ${TARGET_FLAGS}) 57 set(SANITIZER_TEST_LINK_FLAGS -lstdc++ -lpthread ${TARGET_FLAGS}) 58 set(SANITIZER_TEST_OBJECTS) 59 foreach(source ${SANITIZER_TEST_SOURCES}) 60 get_filename_component(basename ${source} NAME) 61 set(output_obj "${basename}.${arch}.o") 62 clang_compile(${output_obj} ${source} 63 CFLAGS ${SANITIZER_TEST_CFLAGS} 64 DEPS gtest ${SANITIZER_RUNTIME_LIBRARIES} 65 ${SANITIZER_TEST_HEADERS}) 66 list(APPEND SANITIZER_TEST_OBJECTS ${output_obj}) 67 endforeach() 68 get_sanitizer_common_lib_for_arch(${arch} SANITIZER_COMMON_LIB 69 SANITIZER_COMMON_LIB_NAME) 70 # Add unittest target. 71 set(SANITIZER_TEST_NAME "Sanitizer-${arch}-Test") 72 add_compiler_rt_test(SanitizerUnitTests ${SANITIZER_TEST_NAME} 73 OBJECTS ${SANITIZER_TEST_OBJECTS} 74 ${SANITIZER_COMMON_LIB_NAME} 75 DEPS ${SANITIZER_TEST_OBJECTS} ${SANITIZER_COMMON_LIB} 76 LINK_FLAGS ${SANITIZER_TEST_LINK_FLAGS}) 77endmacro() 78 79if(COMPILER_RT_CAN_EXECUTE_TESTS) 80 # We use just-built clang to build sanitizer_common unittests, so we must 81 # be sure that produced binaries would work. 82 if(APPLE) 83 add_sanitizer_common_lib("RTSanitizerCommon.test.osx" 84 $<TARGET_OBJECTS:RTSanitizerCommon.osx>) 85 else() 86 if(CAN_TARGET_X86_64) 87 add_sanitizer_common_lib("RTSanitizerCommon.test.x86_64" 88 $<TARGET_OBJECTS:RTSanitizerCommon.x86_64>) 89 endif() 90 if(CAN_TARGET_I386) 91 add_sanitizer_common_lib("RTSanitizerCommon.test.i386" 92 $<TARGET_OBJECTS:RTSanitizerCommon.i386>) 93 endif() 94 endif() 95 if(CAN_TARGET_X86_64) 96 add_sanitizer_tests_for_arch(x86_64) 97 endif() 98 if(CAN_TARGET_I386) 99 add_sanitizer_tests_for_arch(i386) 100 endif() 101 102 # Run unittests as a part of lit testsuite. 103 configure_lit_site_cfg( 104 ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.in 105 ${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg 106 ) 107 108 add_lit_testsuite(check-sanitizer "Running sanitizer library unittests" 109 ${CMAKE_CURRENT_BINARY_DIR} 110 DEPENDS SanitizerUnitTests 111 ) 112 set_target_properties(check-sanitizer PROPERTIES FOLDER "Sanitizer unittests") 113endif() 114