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