Alexey Samsonov | 0414b25 | 2012-12-20 13:24:21 +0000 | [diff] [blame] | 1 | include(CompilerRTCompile) |
Alexey Samsonov | 0414b25 | 2012-12-20 13:24:21 +0000 | [diff] [blame] | 2 | |
Stephen Hines | 6d18623 | 2014-11-26 17:56:19 -0800 | [diff] [blame] | 3 | clang_compiler_add_cxx_check() |
| 4 | |
Stephen Hines | 86277eb | 2015-03-23 12:06:32 -0700 | [diff] [blame] | 5 | # FIXME: use SANITIZER_COMMON_SUPPORTED_ARCH here |
| 6 | filter_available_targets(SANITIZER_UNITTEST_SUPPORTED_ARCH x86_64 i386 mips64 mips64el) |
Pirama Arumuga Nainar | 799172d | 2016-03-03 15:50:30 -0800 | [diff] [blame^] | 7 | if(APPLE) |
| 8 | darwin_filter_host_archs(SANITIZER_UNITTEST_SUPPORTED_ARCH SANITIZER_COMMON_SUPPORTED_ARCH) |
| 9 | endif() |
Stephen Hines | 86277eb | 2015-03-23 12:06:32 -0700 | [diff] [blame] | 10 | |
Alexey Samsonov | 3f3ca96 | 2012-09-11 10:50:32 +0000 | [diff] [blame] | 11 | set(SANITIZER_UNITTESTS |
Alexey Samsonov | 3f3ca96 | 2012-09-11 10:50:32 +0000 | [diff] [blame] | 12 | sanitizer_allocator_test.cc |
Alexey Samsonov | d264ca0 | 2013-03-25 08:48:16 +0000 | [diff] [blame] | 13 | sanitizer_atomic_test.cc |
Stephen Hines | 2d1fdb2 | 2014-05-28 23:58:16 -0700 | [diff] [blame] | 14 | sanitizer_bitvector_test.cc |
| 15 | sanitizer_bvgraph_test.cc |
Alexey Samsonov | 3f3ca96 | 2012-09-11 10:50:32 +0000 | [diff] [blame] | 16 | sanitizer_common_test.cc |
Stephen Hines | 2d1fdb2 | 2014-05-28 23:58:16 -0700 | [diff] [blame] | 17 | sanitizer_deadlock_detector_test.cc |
Alexey Samsonov | 3f3ca96 | 2012-09-11 10:50:32 +0000 | [diff] [blame] | 18 | sanitizer_flags_test.cc |
Stephen Hines | 2d1fdb2 | 2014-05-28 23:58:16 -0700 | [diff] [blame] | 19 | sanitizer_format_interceptor_test.cc |
Evgeniy Stepanov | 4612aba | 2013-06-20 09:19:28 +0000 | [diff] [blame] | 20 | sanitizer_ioctl_test.cc |
Alexander Potapenko | 341588a | 2012-10-26 13:24:20 +0000 | [diff] [blame] | 21 | sanitizer_libc_test.cc |
Kostya Serebryany | 6fb47af | 2013-02-27 11:22:40 +0000 | [diff] [blame] | 22 | sanitizer_linux_test.cc |
Alexey Samsonov | 3f3ca96 | 2012-09-11 10:50:32 +0000 | [diff] [blame] | 23 | sanitizer_list_test.cc |
Dmitry Vyukov | f4f51f2 | 2013-01-14 07:51:39 +0000 | [diff] [blame] | 24 | sanitizer_mutex_test.cc |
Peter Collingbourne | cc8ed30 | 2013-05-28 12:37:34 +0000 | [diff] [blame] | 25 | sanitizer_nolibc_test.cc |
Sergey Matveev | 70db33e | 2013-10-11 14:19:14 +0000 | [diff] [blame] | 26 | sanitizer_posix_test.cc |
Alexey Samsonov | a517641 | 2012-11-02 12:36:11 +0000 | [diff] [blame] | 27 | sanitizer_printf_test.cc |
Stephen Hines | 2d1fdb2 | 2014-05-28 23:58:16 -0700 | [diff] [blame] | 28 | sanitizer_procmaps_test.cc |
Alexey Samsonov | 3f3ca96 | 2012-09-11 10:50:32 +0000 | [diff] [blame] | 29 | sanitizer_stackdepot_test.cc |
Stephen Hines | 6d18623 | 2014-11-26 17:56:19 -0800 | [diff] [blame] | 30 | sanitizer_stacktrace_printer_test.cc |
Reid Kleckner | 0b487c0 | 2013-02-22 15:10:16 +0000 | [diff] [blame] | 31 | sanitizer_stacktrace_test.cc |
Alexander Potapenko | 3614c16 | 2013-03-15 14:37:21 +0000 | [diff] [blame] | 32 | sanitizer_stoptheworld_test.cc |
Sergey Matveev | a52e5c6 | 2013-06-26 15:37:14 +0000 | [diff] [blame] | 33 | sanitizer_suppressions_test.cc |
Pirama Arumuga Nainar | 7c91505 | 2015-04-08 08:58:29 -0700 | [diff] [blame] | 34 | sanitizer_symbolizer_test.cc |
Alexey Samsonov | 3f3ca96 | 2012-09-11 10:50:32 +0000 | [diff] [blame] | 35 | sanitizer_test_main.cc |
Alexey Samsonov | 7bb2f9b | 2013-09-16 15:43:23 +0000 | [diff] [blame] | 36 | sanitizer_thread_registry_test.cc) |
Alexey Samsonov | 3f3ca96 | 2012-09-11 10:50:32 +0000 | [diff] [blame] | 37 | |
Alexey Samsonov | 7bb2f9b | 2013-09-16 15:43:23 +0000 | [diff] [blame] | 38 | set(SANITIZER_TEST_HEADERS |
Stephen Hines | 2d1fdb2 | 2014-05-28 23:58:16 -0700 | [diff] [blame] | 39 | sanitizer_pthread_wrappers.h |
| 40 | sanitizer_test_config.h |
Alexey Samsonov | 7bb2f9b | 2013-09-16 15:43:23 +0000 | [diff] [blame] | 41 | sanitizer_test_utils.h) |
Alexey Samsonov | 032e833 | 2012-12-21 14:04:52 +0000 | [diff] [blame] | 42 | foreach(header ${SANITIZER_HEADERS}) |
| 43 | list(APPEND SANITIZER_TEST_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/../${header}) |
| 44 | endforeach() |
| 45 | |
Alexey Samsonov | 6ef35e1 | 2013-03-15 10:39:26 +0000 | [diff] [blame] | 46 | set(SANITIZER_TEST_CFLAGS_COMMON |
Stephen Hines | 6a211c5 | 2014-07-21 00:49:56 -0700 | [diff] [blame] | 47 | ${COMPILER_RT_TEST_CFLAGS} |
Stephen Hines | 2d1fdb2 | 2014-05-28 23:58:16 -0700 | [diff] [blame] | 48 | ${COMPILER_RT_GTEST_CFLAGS} |
Alexey Samsonov | 6ef35e1 | 2013-03-15 10:39:26 +0000 | [diff] [blame] | 49 | -I${COMPILER_RT_SOURCE_DIR}/include |
| 50 | -I${COMPILER_RT_SOURCE_DIR}/lib |
| 51 | -I${COMPILER_RT_SOURCE_DIR}/lib/sanitizer_common |
Stephen Hines | 6a211c5 | 2014-07-21 00:49:56 -0700 | [diff] [blame] | 52 | -fno-rtti |
Stephen Hines | 2d1fdb2 | 2014-05-28 23:58:16 -0700 | [diff] [blame] | 53 | -O2 |
| 54 | -Werror=sign-compare |
| 55 | -Wno-non-virtual-dtor) |
Alexey Samsonov | 6ef35e1 | 2013-03-15 10:39:26 +0000 | [diff] [blame] | 56 | |
Pirama Arumuga Nainar | cdce50b | 2015-07-01 12:26:56 -0700 | [diff] [blame] | 57 | if(MSVC) |
| 58 | # Disable exceptions on Windows until they work reliably. |
| 59 | list(APPEND SANITIZER_TEST_CFLAGS_COMMON -fno-exceptions -DGTEST_HAS_SEH=0) |
| 60 | endif() |
| 61 | |
Stephen Hines | 6a211c5 | 2014-07-21 00:49:56 -0700 | [diff] [blame] | 62 | # -gline-tables-only must be enough for these tests, so use it if possible. |
| 63 | if(COMPILER_RT_TEST_COMPILER_ID MATCHES "Clang") |
Pirama Arumuga Nainar | cdce50b | 2015-07-01 12:26:56 -0700 | [diff] [blame] | 64 | list(APPEND SANITIZER_TEST_CFLAGS_COMMON -gline-tables-only) |
Stephen Hines | 6a211c5 | 2014-07-21 00:49:56 -0700 | [diff] [blame] | 65 | else() |
Pirama Arumuga Nainar | cdce50b | 2015-07-01 12:26:56 -0700 | [diff] [blame] | 66 | list(APPEND SANITIZER_TEST_CFLAGS_COMMON -g) |
Stephen Hines | 2d1fdb2 | 2014-05-28 23:58:16 -0700 | [diff] [blame] | 67 | endif() |
| 68 | |
| 69 | if(NOT MSVC) |
| 70 | list(APPEND SANITIZER_TEST_LINK_FLAGS_COMMON --driver-mode=g++) |
| 71 | endif() |
| 72 | |
Pirama Arumuga Nainar | 799172d | 2016-03-03 15:50:30 -0800 | [diff] [blame^] | 73 | if(ANDROID) |
| 74 | list(APPEND SANITIZER_TEST_LINK_FLAGS_COMMON -pie) |
| 75 | endif() |
| 76 | |
Stephen Hines | 6d18623 | 2014-11-26 17:56:19 -0800 | [diff] [blame] | 77 | set(SANITIZER_TEST_LINK_LIBS) |
Pirama Arumuga Nainar | 799172d | 2016-03-03 15:50:30 -0800 | [diff] [blame^] | 78 | append_list_if(COMPILER_RT_HAS_LIBLOG log SANITIZER_TEST_LINK_LIBS) |
Stephen Hines | 6d18623 | 2014-11-26 17:56:19 -0800 | [diff] [blame] | 79 | # NDK r10 requires -latomic almost always. |
| 80 | append_list_if(ANDROID atomic SANITIZER_TEST_LINK_LIBS) |
| 81 | |
| 82 | append_list_if(COMPILER_RT_HAS_LIBDL -ldl SANITIZER_TEST_LINK_FLAGS_COMMON) |
Pirama Arumuga Nainar | cdce50b | 2015-07-01 12:26:56 -0700 | [diff] [blame] | 83 | append_list_if(COMPILER_RT_HAS_LIBRT -lrt SANITIZER_TEST_LINK_FLAGS_COMMON) |
Stephen Hines | 6d18623 | 2014-11-26 17:56:19 -0800 | [diff] [blame] | 84 | append_list_if(COMPILER_RT_HAS_LIBPTHREAD -pthread SANITIZER_TEST_LINK_FLAGS_COMMON) |
Stephen Hines | 6a211c5 | 2014-07-21 00:49:56 -0700 | [diff] [blame] | 85 | # x86_64 FreeBSD 9.2 additionally requires libc++ to build the tests. Also, |
| 86 | # 'libm' shall be specified explicitly to build i386 tests. |
Stephen Hines | 2d1fdb2 | 2014-05-28 23:58:16 -0700 | [diff] [blame] | 87 | if(CMAKE_SYSTEM MATCHES "FreeBSD-9.2-RELEASE") |
Stephen Hines | 6a211c5 | 2014-07-21 00:49:56 -0700 | [diff] [blame] | 88 | list(APPEND SANITIZER_TEST_LINK_FLAGS_COMMON "-lc++ -lm") |
Stephen Hines | 2d1fdb2 | 2014-05-28 23:58:16 -0700 | [diff] [blame] | 89 | endif() |
Alexey Samsonov | 6ef35e1 | 2013-03-15 10:39:26 +0000 | [diff] [blame] | 90 | |
Alexey Samsonov | 3f3ca96 | 2012-09-11 10:50:32 +0000 | [diff] [blame] | 91 | include_directories(..) |
| 92 | include_directories(../..) |
| 93 | |
Alexey Samsonov | f85c06c | 2012-12-20 14:38:02 +0000 | [diff] [blame] | 94 | # Adds static library which contains sanitizer_common object file |
| 95 | # (universal binary on Mac and arch-specific object files on Linux). |
| 96 | macro(add_sanitizer_common_lib library) |
| 97 | add_library(${library} STATIC ${ARGN}) |
| 98 | set_target_properties(${library} PROPERTIES |
| 99 | ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) |
Alexey Samsonov | f85c06c | 2012-12-20 14:38:02 +0000 | [diff] [blame] | 100 | endmacro() |
| 101 | |
Alexey Samsonov | 32b8991 | 2012-12-21 08:56:14 +0000 | [diff] [blame] | 102 | function(get_sanitizer_common_lib_for_arch arch lib lib_name) |
Alexey Samsonov | f85c06c | 2012-12-20 14:38:02 +0000 | [diff] [blame] | 103 | if(APPLE) |
Alexey Samsonov | 32b8991 | 2012-12-21 08:56:14 +0000 | [diff] [blame] | 104 | set(tgt_name "RTSanitizerCommon.test.osx") |
Alexey Samsonov | f85c06c | 2012-12-20 14:38:02 +0000 | [diff] [blame] | 105 | else() |
Alexey Samsonov | 32b8991 | 2012-12-21 08:56:14 +0000 | [diff] [blame] | 106 | set(tgt_name "RTSanitizerCommon.test.${arch}") |
Alexey Samsonov | f85c06c | 2012-12-20 14:38:02 +0000 | [diff] [blame] | 107 | endif() |
Alexey Samsonov | 32b8991 | 2012-12-21 08:56:14 +0000 | [diff] [blame] | 108 | set(${lib} "${tgt_name}" PARENT_SCOPE) |
Stephen Hines | 2d1fdb2 | 2014-05-28 23:58:16 -0700 | [diff] [blame] | 109 | if(NOT MSVC) |
| 110 | set(${lib_name} "lib${tgt_name}.a" PARENT_SCOPE) |
| 111 | else() |
| 112 | set(${lib_name} "${tgt_name}.lib" PARENT_SCOPE) |
| 113 | endif() |
Alexey Samsonov | f85c06c | 2012-12-20 14:38:02 +0000 | [diff] [blame] | 114 | endfunction() |
| 115 | |
Alexey Samsonov | 0414b25 | 2012-12-20 13:24:21 +0000 | [diff] [blame] | 116 | # Sanitizer_common unit tests testsuite. |
Alexey Samsonov | 3f3ca96 | 2012-09-11 10:50:32 +0000 | [diff] [blame] | 117 | add_custom_target(SanitizerUnitTests) |
| 118 | set_target_properties(SanitizerUnitTests PROPERTIES |
| 119 | FOLDER "Sanitizer unittests") |
Alexey Samsonov | 0414b25 | 2012-12-20 13:24:21 +0000 | [diff] [blame] | 120 | |
| 121 | # Adds sanitizer tests for architecture. |
| 122 | macro(add_sanitizer_tests_for_arch arch) |
| 123 | get_target_flags_for_arch(${arch} TARGET_FLAGS) |
| 124 | set(SANITIZER_TEST_SOURCES ${SANITIZER_UNITTESTS} |
| 125 | ${COMPILER_RT_GTEST_SOURCE}) |
Stephen Hines | 2d1fdb2 | 2014-05-28 23:58:16 -0700 | [diff] [blame] | 126 | set(SANITIZER_TEST_COMPILE_DEPS ${SANITIZER_TEST_HEADERS}) |
| 127 | if(NOT COMPILER_RT_STANDALONE_BUILD) |
| 128 | list(APPEND SANITIZER_TEST_COMPILE_DEPS gtest) |
| 129 | endif() |
Alexey Samsonov | 0414b25 | 2012-12-20 13:24:21 +0000 | [diff] [blame] | 130 | set(SANITIZER_TEST_OBJECTS) |
| 131 | foreach(source ${SANITIZER_TEST_SOURCES}) |
| 132 | get_filename_component(basename ${source} NAME) |
| 133 | set(output_obj "${basename}.${arch}.o") |
| 134 | clang_compile(${output_obj} ${source} |
Alexey Samsonov | 6ef35e1 | 2013-03-15 10:39:26 +0000 | [diff] [blame] | 135 | CFLAGS ${SANITIZER_TEST_CFLAGS_COMMON} ${TARGET_FLAGS} |
Stephen Hines | 2d1fdb2 | 2014-05-28 23:58:16 -0700 | [diff] [blame] | 136 | DEPS ${SANITIZER_TEST_COMPILE_DEPS}) |
Alexey Samsonov | 0414b25 | 2012-12-20 13:24:21 +0000 | [diff] [blame] | 137 | list(APPEND SANITIZER_TEST_OBJECTS ${output_obj}) |
| 138 | endforeach() |
Alexey Samsonov | 32b8991 | 2012-12-21 08:56:14 +0000 | [diff] [blame] | 139 | get_sanitizer_common_lib_for_arch(${arch} SANITIZER_COMMON_LIB |
| 140 | SANITIZER_COMMON_LIB_NAME) |
Alexey Samsonov | 0414b25 | 2012-12-20 13:24:21 +0000 | [diff] [blame] | 141 | # Add unittest target. |
| 142 | set(SANITIZER_TEST_NAME "Sanitizer-${arch}-Test") |
| 143 | add_compiler_rt_test(SanitizerUnitTests ${SANITIZER_TEST_NAME} |
| 144 | OBJECTS ${SANITIZER_TEST_OBJECTS} |
| 145 | ${SANITIZER_COMMON_LIB_NAME} |
Alexey Samsonov | 32b8991 | 2012-12-21 08:56:14 +0000 | [diff] [blame] | 146 | DEPS ${SANITIZER_TEST_OBJECTS} ${SANITIZER_COMMON_LIB} |
Alexey Samsonov | 6ef35e1 | 2013-03-15 10:39:26 +0000 | [diff] [blame] | 147 | LINK_FLAGS ${SANITIZER_TEST_LINK_FLAGS_COMMON} |
Stephen Hines | 2d1fdb2 | 2014-05-28 23:58:16 -0700 | [diff] [blame] | 148 | ${TARGET_FLAGS}) |
Peter Collingbourne | cc8ed30 | 2013-05-28 12:37:34 +0000 | [diff] [blame] | 149 | |
| 150 | if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux" AND "${arch}" STREQUAL "x86_64") |
| 151 | # Test that the libc-independent part of sanitizer_common is indeed |
| 152 | # independent of libc, by linking this binary without libc (here) and |
| 153 | # executing it (unit test in sanitizer_nolibc_test.cc). |
| 154 | clang_compile(sanitizer_nolibc_test_main.${arch}.o |
| 155 | sanitizer_nolibc_test_main.cc |
| 156 | CFLAGS ${SANITIZER_TEST_CFLAGS_COMMON} ${TARGET_FLAGS} |
Stephen Hines | 2d1fdb2 | 2014-05-28 23:58:16 -0700 | [diff] [blame] | 157 | DEPS ${SANITIZER_TEST_COMPILE_DEPS}) |
Peter Collingbourne | cc8ed30 | 2013-05-28 12:37:34 +0000 | [diff] [blame] | 158 | add_compiler_rt_test(SanitizerUnitTests "Sanitizer-${arch}-Test-Nolibc" |
| 159 | OBJECTS sanitizer_nolibc_test_main.${arch}.o |
| 160 | -Wl,-whole-archive |
| 161 | libRTSanitizerCommon.test.nolibc.${arch}.a |
| 162 | -Wl,-no-whole-archive |
| 163 | DEPS sanitizer_nolibc_test_main.${arch}.o |
| 164 | RTSanitizerCommon.test.nolibc.${arch} |
| 165 | LINK_FLAGS -nostdlib ${TARGET_FLAGS}) |
| 166 | endif() |
Alexey Samsonov | 0414b25 | 2012-12-20 13:24:21 +0000 | [diff] [blame] | 167 | endmacro() |
| 168 | |
Stephen Hines | 6d18623 | 2014-11-26 17:56:19 -0800 | [diff] [blame] | 169 | if(COMPILER_RT_CAN_EXECUTE_TESTS AND NOT ANDROID) |
Alexey Samsonov | d7d7b5f | 2012-12-27 13:19:23 +0000 | [diff] [blame] | 170 | # We use just-built clang to build sanitizer_common unittests, so we must |
| 171 | # be sure that produced binaries would work. |
Alexey Samsonov | f85c06c | 2012-12-20 14:38:02 +0000 | [diff] [blame] | 172 | if(APPLE) |
| 173 | add_sanitizer_common_lib("RTSanitizerCommon.test.osx" |
Pirama Arumuga Nainar | 799172d | 2016-03-03 15:50:30 -0800 | [diff] [blame^] | 174 | $<TARGET_OBJECTS:RTSanitizerCommon.osx> |
| 175 | $<TARGET_OBJECTS:RTSanitizerCommonLibc.osx>) |
Alexey Samsonov | f85c06c | 2012-12-20 14:38:02 +0000 | [diff] [blame] | 176 | else() |
Alexey Samsonov | 2f3aef0 | 2013-01-18 12:45:44 +0000 | [diff] [blame] | 177 | if(CAN_TARGET_x86_64) |
Peter Collingbourne | cc8ed30 | 2013-05-28 12:37:34 +0000 | [diff] [blame] | 178 | add_sanitizer_common_lib("RTSanitizerCommon.test.nolibc.x86_64" |
Pirama Arumuga Nainar | 799172d | 2016-03-03 15:50:30 -0800 | [diff] [blame^] | 179 | $<TARGET_OBJECTS:RTSanitizerCommon.x86_64> |
| 180 | $<TARGET_OBJECTS:RTSanitizerCommonNoLibc.x86_64>) |
Alexey Samsonov | f85c06c | 2012-12-20 14:38:02 +0000 | [diff] [blame] | 181 | endif() |
Stephen Hines | 86277eb | 2015-03-23 12:06:32 -0700 | [diff] [blame] | 182 | foreach(arch ${SANITIZER_UNITTEST_SUPPORTED_ARCH}) |
| 183 | add_sanitizer_common_lib("RTSanitizerCommon.test.${arch}" |
| 184 | $<TARGET_OBJECTS:RTSanitizerCommon.${arch}> |
| 185 | $<TARGET_OBJECTS:RTSanitizerCommonLibc.${arch}>) |
| 186 | endforeach() |
Alexey Samsonov | f85c06c | 2012-12-20 14:38:02 +0000 | [diff] [blame] | 187 | endif() |
Stephen Hines | 86277eb | 2015-03-23 12:06:32 -0700 | [diff] [blame] | 188 | foreach(arch ${SANITIZER_UNITTEST_SUPPORTED_ARCH}) |
| 189 | add_sanitizer_tests_for_arch(${arch}) |
| 190 | endforeach() |
Alexey Samsonov | 0414b25 | 2012-12-20 13:24:21 +0000 | [diff] [blame] | 191 | endif() |
Evgeniy Stepanov | 539f5e7 | 2013-01-14 14:08:25 +0000 | [diff] [blame] | 192 | |
| 193 | if(ANDROID) |
Stephen Hines | 6d18623 | 2014-11-26 17:56:19 -0800 | [diff] [blame] | 194 | foreach(arch ${SANITIZER_COMMON_SUPPORTED_ARCH}) |
| 195 | add_executable(SanitizerTest |
| 196 | ${SANITIZER_UNITTESTS} |
| 197 | ${COMPILER_RT_GTEST_SOURCE} |
| 198 | $<TARGET_OBJECTS:RTSanitizerCommon.${arch}> |
| 199 | $<TARGET_OBJECTS:RTSanitizerCommonLibc.${arch}>) |
| 200 | set_target_compile_flags(SanitizerTest |
| 201 | ${SANITIZER_COMMON_CFLAGS} |
| 202 | ${SANITIZER_TEST_CFLAGS_COMMON}) |
| 203 | # Setup correct output directory and link flags. |
| 204 | set_target_properties(SanitizerTest PROPERTIES |
| 205 | RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) |
| 206 | set_target_link_flags(SanitizerTest ${SANITIZER_TEST_LINK_FLAGS_COMMON}) |
| 207 | target_link_libraries(SanitizerTest ${SANITIZER_TEST_LINK_LIBS}) |
| 208 | # Add unit test to test suite. |
| 209 | add_dependencies(SanitizerUnitTests SanitizerTest) |
| 210 | endforeach() |
Evgeniy Stepanov | 539f5e7 | 2013-01-14 14:08:25 +0000 | [diff] [blame] | 211 | endif() |