CMakeLists.txt revision f6acafcaf557fa8f89794ac08597a854475dfc73
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_list_test.cc
9  sanitizer_mutex_test.cc
10  sanitizer_printf_test.cc
11  sanitizer_scanf_interceptor_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
115if(ANDROID)
116  # We assume that unit tests on Android are built in a build
117  # tree with fresh Clang as a host compiler.
118  add_executable(SanitizerTest
119    ${SANITIZER_UNITTESTS}
120    ${COMPILER_RT_GTEST_SOURCE}
121    $<TARGET_OBJECTS:RTSanitizerCommon.arm.android>
122    )
123  set_target_compile_flags(SanitizerTest
124    ${SANITIZER_COMMON_CFLAGS}
125    ${COMPILER_RT_GTEST_INCLUDE_CFLAGS}
126    -I${COMPILER_RT_SOURCE_DIR}/include
127    -I${COMPILER_RT_SOURCE_DIR}/lib
128    -I${COMPILER_RT_SOURCE_DIR}/lib/sanitizer_common
129    -O2 -g
130    )
131  # Setup correct output directory and link flags.
132  set_target_properties(SanitizerTest PROPERTIES
133    RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
134  set_target_link_flags(SanitizerTest ${SANITIZER_TEST_LINK_FLAGS})
135  # Add unit test to test suite.
136  add_dependencies(SanitizerUnitTests SanitizerTest)
137endif()
138