CMakeLists.txt revision 996c4f2fa53cce8f9d7b517073f38569460de505
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_scanf_interceptor_test.cc
13  sanitizer_stackdepot_test.cc
14  sanitizer_test_main.cc
15  )
16
17set(SANITIZER_TEST_HEADERS)
18foreach(header ${SANITIZER_HEADERS})
19  list(APPEND SANITIZER_TEST_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/../${header})
20endforeach()
21
22include_directories(..)
23include_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 ${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  get_unittest_directory(OUTPUT_DIR)
134  set_target_properties(SanitizerTest PROPERTIES
135    RUNTIME_OUTPUT_DIRECTORY ${OUTPUT_DIR})
136  set_target_link_flags(SanitizerTest ${SANITIZER_TEST_LINK_FLAGS})
137  # Add unit test to test suite.
138  add_dependencies(SanitizerUnitTests SanitizerTest)
139endif()
140