1*a65addddSAndroid Build Coastguard Worker 2*a65addddSAndroid Build Coastguard Workerinclude(CMakeParseArguments) 3*a65addddSAndroid Build Coastguard Worker 4*a65addddSAndroid Build Coastguard Workerif("${WIN32}") 5*a65addddSAndroid Build Coastguard Worker # This defaults to OFF on Windows, since we don't support PCHs there. 6*a65addddSAndroid Build Coastguard Worker option(FRUIT_TESTS_USE_PRECOMPILED_HEADERS "Whether to use pre-compiled headers (PCHs) in Fruit tests." OFF) 7*a65addddSAndroid Build Coastguard Worker 8*a65addddSAndroid Build Coastguard Worker if ("${FRUIT_TESTS_USE_PRECOMPILED_HEADERS}") 9*a65addddSAndroid Build Coastguard Worker # TODO: consider adding support for PCHs on Windows (at least when using MinGW). 10*a65addddSAndroid Build Coastguard Worker message(FATAL_ERROR "Please rerun CMake without -DFRUIT_TESTS_USE_PRECOMPILED_HEADERS, precompiled headers are not supported on Windows.") 11*a65addddSAndroid Build Coastguard Worker endif() 12*a65addddSAndroid Build Coastguard Workerelse() 13*a65addddSAndroid Build Coastguard Worker option(FRUIT_TESTS_USE_PRECOMPILED_HEADERS "Whether to use pre-compiled headers (PCHs) in Fruit tests." ON) 14*a65addddSAndroid Build Coastguard Workerendif() 15*a65addddSAndroid Build Coastguard Worker 16*a65addddSAndroid Build Coastguard Workerif("${WIN32}") 17*a65addddSAndroid Build Coastguard Worker # No timeout on windows, the `timeout' executable has a different syntax. 18*a65addddSAndroid Build Coastguard Worker set(TIMEOUT_COMMAND_PREFIX "") 19*a65addddSAndroid Build Coastguard Worker set(TIMEOUT_COMMAND_PREFIX_STR "") 20*a65addddSAndroid Build Coastguard Workerelse() 21*a65addddSAndroid Build Coastguard Worker set(TIMEOUT_COMMAND_PREFIX "timeout" "30") 22*a65addddSAndroid Build Coastguard Worker set(TIMEOUT_COMMAND_PREFIX_STR "timeout 30") 23*a65addddSAndroid Build Coastguard Workerendif() 24*a65addddSAndroid Build Coastguard Worker 25*a65addddSAndroid Build Coastguard Workerset(VALGRIND_FLAGS 26*a65addddSAndroid Build Coastguard Worker --leak-check=full --malloc-fill=AA --track-origins=yes --read-var-info=yes --num-callers=50 --error-exitcode=1 --gen-suppressions=all --suppressions=${CMAKE_SOURCE_DIR}/tests/valgrind_suppressions.supp) 27*a65addddSAndroid Build Coastguard Workerstring(REPLACE ";" " " VALGRIND_FLAGS_STR "${VALGRIND_FLAGS}") 28*a65addddSAndroid Build Coastguard Worker 29*a65addddSAndroid Build Coastguard Workerif(NOT "${WIN32}") 30*a65addddSAndroid Build Coastguard Worker function(check_all_python_tests_listed DIRNAME) 31*a65addddSAndroid Build Coastguard Worker # Join the list with " ". 32*a65addddSAndroid Build Coastguard Worker string(REPLACE ";" " " STR "${ARGN}") 33*a65addddSAndroid Build Coastguard Worker add_test(NAME check-all-python-tests-listed-${DIRNAME} 34*a65addddSAndroid Build Coastguard Worker WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} 35*a65addddSAndroid Build Coastguard Worker COMMAND bash -c -x "pwd; for f in \$(ls test_*.py); do echo \" ${STR} \" | fgrep -q \" \$f \" || { echo \"\$f not listed.\" && exit 1; }; done") 36*a65addddSAndroid Build Coastguard Worker endfunction(check_all_python_tests_listed) 37*a65addddSAndroid Build Coastguard Workerendif() 38*a65addddSAndroid Build Coastguard Worker 39*a65addddSAndroid Build Coastguard Workerif("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU") 40*a65addddSAndroid Build Coastguard Worker set(FRUIT_ADDITIONAL_TEST_COMPILE_FLAGS ${FRUIT_ADDITIONAL_COMPILE_FLAGS_GNU}) 41*a65addddSAndroid Build Coastguard Workerelseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "^Clang$") 42*a65addddSAndroid Build Coastguard Worker set(FRUIT_ADDITIONAL_TEST_COMPILE_FLAGS ${FRUIT_ADDITIONAL_COMPILE_FLAGS_Clang}) 43*a65addddSAndroid Build Coastguard Workerelseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "Intel") 44*a65addddSAndroid Build Coastguard Worker set(FRUIT_ADDITIONAL_TEST_COMPILE_FLAGS ${FRUIT_ADDITIONAL_COMPILE_FLAGS_Intel}) 45*a65addddSAndroid Build Coastguard Workerelseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "AppleClang") 46*a65addddSAndroid Build Coastguard Worker set(FRUIT_ADDITIONAL_TEST_COMPILE_FLAGS ${FRUIT_ADDITIONAL_COMPILE_FLAGS_AppleClang}) 47*a65addddSAndroid Build Coastguard Workerelseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "MSVC") 48*a65addddSAndroid Build Coastguard Worker set(FRUIT_ADDITIONAL_TEST_COMPILE_FLAGS ${FRUIT_ADDITIONAL_COMPILE_FLAGS_MSVC}) 49*a65addddSAndroid Build Coastguard Workerendif() 50*a65addddSAndroid Build Coastguard Worker 51*a65addddSAndroid Build Coastguard Worker# Convert CMake list variable `FRUIT_ADDITIONAL_TEST_COMPILE_FLAGS` to string variable. 52*a65addddSAndroid Build Coastguard Worker# CMake list variable becomes ";" delimiter when expanded. 53*a65addddSAndroid Build Coastguard Worker# Expand list items one by one into a string variable and separate them by spaces. 54*a65addddSAndroid Build Coastguard Workerforeach(FRUIT_ADDITIONAL_TEST_COMPILE_FLAGS_ITEM IN LISTS FRUIT_ADDITIONAL_TEST_COMPILE_FLAGS) 55*a65addddSAndroid Build Coastguard Worker set(FRUIT_TEST_COMPILE_FLAGS "${FRUIT_TEST_COMPILE_FLAGS} ${FRUIT_ADDITIONAL_TEST_COMPILE_FLAGS_ITEM}") 56*a65addddSAndroid Build Coastguard Workerendforeach() 57*a65addddSAndroid Build Coastguard Worker 58*a65addddSAndroid Build Coastguard Workerif ("${CMAKE_BUILD_TYPE}" STREQUAL "Release") 59*a65addddSAndroid Build Coastguard Worker set(FRUIT_TEST_COMPILE_FLAGS "${FRUIT_TEST_COMPILE_FLAGS} ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE} ${FRUIT_CXX_STANDARD_FLAGS}") 60*a65addddSAndroid Build Coastguard Workerelse() 61*a65addddSAndroid Build Coastguard Worker set(FRUIT_TEST_COMPILE_FLAGS "${FRUIT_TEST_COMPILE_FLAGS} ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG} ${FRUIT_CXX_STANDARD_FLAGS}") 62*a65addddSAndroid Build Coastguard Workerendif() 63*a65addddSAndroid Build Coastguard Worker 64*a65addddSAndroid Build Coastguard Workerif ("${FRUIT_TESTS_USE_PRECOMPILED_HEADERS}") 65*a65addddSAndroid Build Coastguard Worker if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") 66*a65addddSAndroid Build Coastguard Worker add_custom_command( 67*a65addddSAndroid Build Coastguard Worker OUTPUT test_common-precompiled.h.gch 68*a65addddSAndroid Build Coastguard Worker WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} 69*a65addddSAndroid Build Coastguard Worker DEPENDS test_common.h fruit 70*a65addddSAndroid Build Coastguard Worker COMMAND bash -c "${CMAKE_CXX_COMPILER} -x c++-header ${FRUIT_TEST_COMPILE_FLAGS} -I${CMAKE_CURRENT_SOURCE_DIR}/../include -I${CMAKE_CURRENT_SOURCE_DIR} -I${CMAKE_CURRENT_BINARY_DIR}/../include ${CMAKE_CURRENT_SOURCE_DIR}/test_common.h -o test_common-precompiled.h.gch") 71*a65addddSAndroid Build Coastguard Worker add_custom_target(test-common-precompiled-header ALL DEPENDS test_common-precompiled.h.gch) 72*a65addddSAndroid Build Coastguard Worker # Note that the "test_common-precompiled.h" header doesn't exist, but it's ok because GCC looks for 73*a65addddSAndroid Build Coastguard Worker # test_common-precompiled.h.gch first. We don't call the precompiled header test_common.h.gch so that if GCC doesn't 74*a65addddSAndroid Build Coastguard Worker # find it it reports an error instead of using the normal header. 75*a65addddSAndroid Build Coastguard Worker set(FRUIT_TESTONLY_CXXFLAGS "-include${CMAKE_CURRENT_BINARY_DIR}/test_common-precompiled.h") 76*a65addddSAndroid Build Coastguard Worker 77*a65addddSAndroid Build Coastguard Worker elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "^(Clang|AppleClang)$") 78*a65addddSAndroid Build Coastguard Worker add_custom_command( 79*a65addddSAndroid Build Coastguard Worker OUTPUT test_common.pch 80*a65addddSAndroid Build Coastguard Worker WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} 81*a65addddSAndroid Build Coastguard Worker DEPENDS test_common.h fruit 82*a65addddSAndroid Build Coastguard Worker COMMAND bash -c "${CMAKE_CXX_COMPILER} -x c++-header ${FRUIT_TEST_COMPILE_FLAGS} -I${CMAKE_CURRENT_SOURCE_DIR}/../include -I${CMAKE_CURRENT_SOURCE_DIR} -I${CMAKE_CURRENT_BINARY_DIR}/../include ${CMAKE_CURRENT_SOURCE_DIR}/test_common.h -o test_common.pch") 83*a65addddSAndroid Build Coastguard Worker add_custom_target(test-common-precompiled-header ALL DEPENDS test_common.pch) 84*a65addddSAndroid Build Coastguard Worker set(FRUIT_TESTONLY_CXXFLAGS "-include-pch ${CMAKE_CURRENT_BINARY_DIR}/test_common.pch") 85*a65addddSAndroid Build Coastguard Worker else() 86*a65addddSAndroid Build Coastguard Worker 87*a65addddSAndroid Build Coastguard Worker message(ERROR "Using pre-compiled headers in tests is only supported with GCC and Clang. Please add -DFRUIT_TESTS_USE_PRECOMPILED_HEADERS=OFF to your cmake invocation and try again.") 88*a65addddSAndroid Build Coastguard Worker endif() 89*a65addddSAndroid Build Coastguard Workerelse() 90*a65addddSAndroid Build Coastguard Worker set(FRUIT_TESTONLY_CXXFLAGS "") 91*a65addddSAndroid Build Coastguard Workerendif() 92*a65addddSAndroid Build Coastguard Worker 93*a65addddSAndroid Build Coastguard Workerif("${FRUIT_ENABLE_COVERAGE}") 94*a65addddSAndroid Build Coastguard Worker set(FRUIT_ENABLE_COVERAGE_PYTHON_BOOL "True") 95*a65addddSAndroid Build Coastguard Workerelse() 96*a65addddSAndroid Build Coastguard Worker set(FRUIT_ENABLE_COVERAGE_PYTHON_BOOL "False") 97*a65addddSAndroid Build Coastguard Workerendif() 98*a65addddSAndroid Build Coastguard Worker 99*a65addddSAndroid Build Coastguard Workerif("${CMAKE_CXX_COMPILER_ID}" MATCHES "^(MSVC)$") 100*a65addddSAndroid Build Coastguard Worker # These warnings are disabled for tests only, since they can only be produced when using fruit as a client. Also, they cannot be disabled via pragma pushes/pops, 101*a65addddSAndroid Build Coastguard Worker # so we leave it up to clients to disable them if desired. 102*a65addddSAndroid Build Coastguard Worker # The warning C4702 is disabled because if MSVC optimizes the call to InvokeLambdaWithInjectedArgVector::operator() when cPtr is null, it will inline 103*a65addddSAndroid Build Coastguard Worker # a FRUIT_UNREACHABLE statement, which makes all statements succeeding the operator() call unreachable. 104*a65addddSAndroid Build Coastguard Worker # The warning C4503 is disabled because some of the test_class_destruction.py tests suchs as "test_injector_creation_and_injection" 105*a65addddSAndroid Build Coastguard Worker # produce extremely long decorator names. This has no effect on the actual results of the test. 106*a65addddSAndroid Build Coastguard Worker set(FRUIT_TESTONLY_CXXFLAGS "${FRUIT_TESTONLY_CXXFLAGS} /wd4702 /wd4503") 107*a65addddSAndroid Build Coastguard Workerendif() 108*a65addddSAndroid Build Coastguard Worker 109*a65addddSAndroid Build Coastguard Workeradd_library(test_headers_copy STATIC test_common.cpp) 110*a65addddSAndroid Build Coastguard Workertarget_link_libraries(test_headers_copy fruit) 111*a65addddSAndroid Build Coastguard Worker 112*a65addddSAndroid Build Coastguard Workerif(FRUIT_USES_BOOST) 113*a65addddSAndroid Build Coastguard Worker find_package(Boost REQUIRED) 114*a65addddSAndroid Build Coastguard Worker target_include_directories(test_headers_copy PRIVATE ${Boost_INCLUDE_DIRS}) 115*a65addddSAndroid Build Coastguard Workerendif() 116*a65addddSAndroid Build Coastguard Worker 117*a65addddSAndroid Build Coastguard Worker# Escape the backslash which is a Windows path separator. 118*a65addddSAndroid Build Coastguard Workerstring(REPLACE "\\" "\\\\" ADDITIONAL_INCLUDE_DIRS "${Boost_INCLUDE_DIRS}") 119*a65addddSAndroid Build Coastguard Worker 120*a65addddSAndroid Build Coastguard Worker# `file(GENERATE)` generates a file for each configuration (CMAKE_BUILD_TYPE) 121*a65addddSAndroid Build Coastguard Worker# supported by the current CMake Generator. If you generate a file with an 122*a65addddSAndroid Build Coastguard Worker# absolute path, only the file generated by the first configuration (often 123*a65addddSAndroid Build Coastguard Worker# `Debug` configuration) will remain. 124*a65addddSAndroid Build Coastguard Worker# To support CMake multi-configuration generator, output files in configuration 125*a65addddSAndroid Build Coastguard Worker# subdirectories. 126*a65addddSAndroid Build Coastguard Workerfile(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/fruit_test_config.py" 127*a65addddSAndroid Build Coastguard Worker CONTENT " 128*a65addddSAndroid Build Coastguard WorkerCXX='${CMAKE_CXX_COMPILER}' 129*a65addddSAndroid Build Coastguard WorkerCXX_COMPILER_NAME='${CMAKE_CXX_COMPILER_ID}' 130*a65addddSAndroid Build Coastguard WorkerCXX_COMPILER_VERSION='${CMAKE_CXX_COMPILER_VERSION}' 131*a65addddSAndroid Build Coastguard WorkerFRUIT_TEST_COMPILE_FLAGS='${FRUIT_TEST_COMPILE_FLAGS} ${FRUIT_TESTONLY_CXXFLAGS}' 132*a65addddSAndroid Build Coastguard WorkerADDITIONAL_INCLUDE_DIRS='${ADDITIONAL_INCLUDE_DIRS}' 133*a65addddSAndroid Build Coastguard WorkerADDITIONAL_LINKER_FLAGS='${CMAKE_EXE_LINKER_FLAGS}' 134*a65addddSAndroid Build Coastguard WorkerRUN_TESTS_UNDER_VALGRIND='${RUN_TESTS_UNDER_VALGRIND_FLAG}' 135*a65addddSAndroid Build Coastguard WorkerVALGRIND_FLAGS='${VALGRIND_FLAGS_STR}' 136*a65addddSAndroid Build Coastguard WorkerCMAKE_BUILD_TYPE='${CMAKE_BUILD_TYPE}' 137*a65addddSAndroid Build Coastguard Worker 138*a65addddSAndroid Build Coastguard WorkerPATH_TO_COMPILED_FRUIT='$<TARGET_FILE_DIR:fruit>' 139*a65addddSAndroid Build Coastguard WorkerPATH_TO_COMPILED_FRUIT_LIB='$<TARGET_FILE:fruit>' 140*a65addddSAndroid Build Coastguard WorkerPATH_TO_COMPILED_TEST_HEADERS='$<TARGET_FILE_DIR:test_headers_copy>' 141*a65addddSAndroid Build Coastguard WorkerPATH_TO_COMPILED_TEST_HEADERS_LIB='$<TARGET_FILE:test_headers_copy>' 142*a65addddSAndroid Build Coastguard WorkerPATH_TO_FRUIT_STATIC_HEADERS='${CMAKE_CURRENT_SOURCE_DIR}/../include' 143*a65addddSAndroid Build Coastguard WorkerPATH_TO_FRUIT_GENERATED_HEADERS='${CMAKE_CURRENT_BINARY_DIR}/../include' 144*a65addddSAndroid Build Coastguard WorkerPATH_TO_FRUIT_TEST_HEADERS='${CMAKE_CURRENT_SOURCE_DIR}' 145*a65addddSAndroid Build Coastguard WorkerENABLE_COVERAGE=${FRUIT_ENABLE_COVERAGE_PYTHON_BOOL} 146*a65addddSAndroid Build Coastguard Worker") 147*a65addddSAndroid Build Coastguard Worker 148*a65addddSAndroid Build Coastguard Workeradd_custom_target(copy_fruit_test_config ALL 149*a65addddSAndroid Build Coastguard Worker BYPRODUCTS "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE}/fruit_test_config.py" 150*a65addddSAndroid Build Coastguard Worker COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE}/fruit_test_config.py" "${CMAKE_CURRENT_BINARY_DIR}/fruit_test_config.py" 151*a65addddSAndroid Build Coastguard Worker VERBATIM 152*a65addddSAndroid Build Coastguard Worker COMMAND_EXPAND_LISTS) 153*a65addddSAndroid Build Coastguard Worker 154*a65addddSAndroid Build Coastguard Workerfile(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/pytest.ini" 155*a65addddSAndroid Build Coastguard Worker CONTENT " 156*a65addddSAndroid Build Coastguard Worker[pytest] 157*a65addddSAndroid Build Coastguard Workertestpaths = \"${CMAKE_CURRENT_SOURCE_DIR}\" 158*a65addddSAndroid Build Coastguard Workeraddopts = -r a 159*a65addddSAndroid Build Coastguard Workertimeout = 300 160*a65addddSAndroid Build Coastguard Worker") 161