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