CMakeLists.txt revision 7907f1d0bd86e83677f8ae3bea7dc484546042cd
16f56ab789cb470620554d624c37f488285b3b04eDan Albertinclude(CompilerRTCompile) 26f56ab789cb470620554d624c37f488285b3b04eDan Albert 36f56ab789cb470620554d624c37f488285b3b04eDan Albertset(SANITIZER_UNITTESTS 46f56ab789cb470620554d624c37f488285b3b04eDan Albert sanitizer_allocator_test.cc 56f56ab789cb470620554d624c37f488285b3b04eDan Albert sanitizer_common_test.cc 66f56ab789cb470620554d624c37f488285b3b04eDan Albert sanitizer_flags_test.cc 76f56ab789cb470620554d624c37f488285b3b04eDan Albert sanitizer_libc_test.cc 86f56ab789cb470620554d624c37f488285b3b04eDan Albert sanitizer_list_test.cc 96f56ab789cb470620554d624c37f488285b3b04eDan Albert sanitizer_mutex_test.cc 106f56ab789cb470620554d624c37f488285b3b04eDan Albert sanitizer_printf_test.cc 116f56ab789cb470620554d624c37f488285b3b04eDan Albert sanitizer_scanf_interceptor_test.cc 126f56ab789cb470620554d624c37f488285b3b04eDan Albert sanitizer_stackdepot_test.cc 136f56ab789cb470620554d624c37f488285b3b04eDan Albert sanitizer_stacktrace_test.cc 146f56ab789cb470620554d624c37f488285b3b04eDan Albert sanitizer_test_main.cc 156f56ab789cb470620554d624c37f488285b3b04eDan Albert ) 166f56ab789cb470620554d624c37f488285b3b04eDan Albert 176f56ab789cb470620554d624c37f488285b3b04eDan Albertset(SANITIZER_TEST_HEADERS) 186f56ab789cb470620554d624c37f488285b3b04eDan Albertforeach(header ${SANITIZER_HEADERS}) 196f56ab789cb470620554d624c37f488285b3b04eDan Albert list(APPEND SANITIZER_TEST_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/../${header}) 206f56ab789cb470620554d624c37f488285b3b04eDan Albertendforeach() 216f56ab789cb470620554d624c37f488285b3b04eDan Albert 226f56ab789cb470620554d624c37f488285b3b04eDan Albertinclude_directories(..) 236f56ab789cb470620554d624c37f488285b3b04eDan Albertinclude_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 -Wall -Werror ${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 set_target_properties(SanitizerTest PROPERTIES 134 RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) 135 set_target_link_flags(SanitizerTest ${SANITIZER_TEST_LINK_FLAGS}) 136 # Add unit test to test suite. 137 add_dependencies(SanitizerUnitTests SanitizerTest) 138endif() 139