130 lines · plain
1include(CompilerRTCompile)2 3filter_available_targets(INTERCEPTION_UNITTEST_SUPPORTED_ARCH x86_64 i386 mips64 mips64el)4 5set(INTERCEPTION_UNITTESTS6 interception_linux_test.cpp7 interception_linux_foreign_test.cpp8 interception_test_main.cpp9 interception_win_test.cpp10 )11 12set(INTERCEPTION_TEST_HEADERS)13 14set(INTERCEPTION_TEST_CFLAGS_COMMON15 ${COMPILER_RT_UNITTEST_CFLAGS}16 ${COMPILER_RT_GTEST_CFLAGS}17 ${SANITIZER_TEST_CXX_CFLAGS}18 -I${COMPILER_RT_SOURCE_DIR}/include19 -I${COMPILER_RT_SOURCE_DIR}/lib20 -I${COMPILER_RT_SOURCE_DIR}/lib/interception21 -DSANITIZER_COMMON_NO_REDEFINE_BUILTINS22 -fno-rtti23 -fno-builtin-isdigit24 -fno-builtin-isalpha25 -fno-builtin-isalnum26 -fno-builtin-islower27 -O228 -Werror=sign-compare)29 30set(INTERCEPTION_TEST_LINK_FLAGS_COMMON31 ${COMPILER_RT_UNITTEST_LINK_FLAGS}32 ${COMPILER_RT_UNWINDER_LINK_LIBS}33 ${SANITIZER_TEST_CXX_LIBRARIES})34 35# -gline-tables-only must be enough for these tests, so use it if possible.36if(COMPILER_RT_TEST_COMPILER_ID MATCHES "Clang")37 list(APPEND INTERCEPTION_TEST_CFLAGS_COMMON -gline-tables-only)38else()39 list(APPEND INTERCEPTION_TEST_CFLAGS_COMMON -g)40endif()41if(MSVC)42 list(APPEND INTERCEPTION_TEST_CFLAGS_COMMON -gcodeview)43 list(APPEND INTERCEPTION_TEST_LINK_FLAGS_COMMON44 -Wl,-largeaddressaware45 -Wl,-nodefaultlib:libcmt,-defaultlib:msvcrt,-defaultlib:oldnames46 )47endif()48if(MINGW)49 list(APPEND INTERCEPTION_TEST_LINK_FLAGS_COMMON50 -Wl,--large-address-aware51 )52endif()53list(APPEND INTERCEPTION_TEST_LINK_FLAGS_COMMON -g)54 55if(NOT MSVC)56 list(APPEND INTERCEPTION_TEST_LINK_FLAGS_COMMON --driver-mode=g++)57endif()58 59if(ANDROID)60 list(APPEND INTERCEPTION_TEST_LINK_FLAGS_COMMON -pie)61endif()62 63set(INTERCEPTION_TEST_LINK_LIBS)64append_list_if(COMPILER_RT_HAS_LIBLOG log INTERCEPTION_TEST_LINK_LIBS)65 66append_list_if(COMPILER_RT_HAS_LIBDL -ldl INTERCEPTION_TEST_LINK_FLAGS_COMMON)67append_list_if(COMPILER_RT_HAS_LIBRT -lrt INTERCEPTION_TEST_LINK_FLAGS_COMMON)68append_list_if(COMPILER_RT_HAS_LIBPTHREAD -pthread INTERCEPTION_TEST_LINK_FLAGS_COMMON)69# x86_64 FreeBSD 9.2 additionally requires libc++ to build the tests. Also,70# 'libm' shall be specified explicitly to build i386 tests.71if(CMAKE_SYSTEM MATCHES "FreeBSD-9.2-RELEASE")72 list(APPEND INTERCEPTION_TEST_LINK_FLAGS_COMMON "-lc++ -lm")73endif()74 75include_directories(..)76include_directories(../..)77 78# Adds static library which contains interception object file79# (universal binary on Mac and arch-specific object files on Linux).80macro(add_interceptor_lib library)81 add_library(${library} STATIC ${ARGN})82 set_target_properties(${library} PROPERTIES83 ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}84 FOLDER "Compiler-RT/Tests/Runtime")85endmacro()86 87function(get_interception_lib_for_arch arch lib)88 if(APPLE)89 set(tgt_name "RTInterception.test.osx")90 else()91 set(tgt_name "RTInterception.test.${arch}")92 endif()93 set(${lib} "${tgt_name}" PARENT_SCOPE)94endfunction()95 96# Interception unit tests testsuite.97add_custom_target(InterceptionUnitTests)98set_target_properties(InterceptionUnitTests PROPERTIES99 FOLDER "Compiler-RT/Tests")100 101# Adds interception tests for architecture.102macro(add_interception_tests_for_arch arch)103 set(INTERCEPTION_TEST_OBJECTS)104 get_interception_lib_for_arch(${arch} INTERCEPTION_COMMON_LIB)105 generate_compiler_rt_tests(INTERCEPTION_TEST_OBJECTS106 InterceptionUnitTests "Interception-${arch}-Test" ${arch}107 RUNTIME ${INTERCEPTION_COMMON_LIB}108 SOURCES ${INTERCEPTION_UNITTESTS} ${COMPILER_RT_GTEST_SOURCE}109 COMPILE_DEPS ${INTERCEPTION_TEST_HEADERS}110 CFLAGS ${INTERCEPTION_TEST_CFLAGS_COMMON}111 LINK_FLAGS ${INTERCEPTION_TEST_LINK_FLAGS_COMMON})112endmacro()113 114if(COMPILER_RT_CAN_EXECUTE_TESTS AND NOT ANDROID AND NOT APPLE)115 # We use just-built clang to build interception unittests, so we must116 # be sure that produced binaries would work.117 if(APPLE)118 add_interceptor_lib("RTInterception.test.osx"119 $<TARGET_OBJECTS:RTInterception.osx>)120 else()121 foreach(arch ${INTERCEPTION_UNITTEST_SUPPORTED_ARCH})122 add_interceptor_lib("RTInterception.test.${arch}"123 $<TARGET_OBJECTS:RTInterception.${arch}>)124 endforeach()125 endif()126 foreach(arch ${INTERCEPTION_UNITTEST_SUPPORTED_ARCH})127 add_interception_tests_for_arch(${arch})128 endforeach()129endif()130