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