Jonas Hahnfeld | 18bec60 | 2017-11-29 19:31:52 +0000 | [diff] [blame] | 1 | # Keep track if we have all dependencies. |
| 2 | set(ENABLE_CHECK_TARGETS TRUE) |
| 3 | |
| 4 | # Function to find required dependencies for testing. |
| 5 | function(find_standalone_test_dependencies) |
| 6 | include(FindPythonInterp) |
| 7 | |
| 8 | if (NOT PYTHONINTERP_FOUND) |
| 9 | message(STATUS "Could not find Python.") |
| 10 | message(WARNING "The check targets will not be available!") |
| 11 | set(ENABLE_CHECK_TARGETS FALSE PARENT_SCOPE) |
| 12 | return() |
| 13 | endif() |
| 14 | |
| 15 | # Find executables. |
| 16 | find_program(OPENMP_LLVM_LIT_EXECUTABLE |
| 17 | NAMES llvm-lit lit.py lit |
| 18 | PATHS ${OPENMP_LLVM_TOOLS_DIR}) |
| 19 | if (NOT OPENMP_LLVM_LIT_EXECUTABLE) |
| 20 | message(STATUS "Cannot find llvm-lit.") |
| 21 | message(STATUS "Please put llvm-lit in your PATH, set OPENMP_LLVM_LIT_EXECUTABLE to its full path, or point OPENMP_LLVM_TOOLS_DIR to its directory.") |
| 22 | message(WARNING "The check targets will not be available!") |
| 23 | set(ENABLE_CHECK_TARGETS FALSE PARENT_SCOPE) |
| 24 | return() |
| 25 | endif() |
| 26 | |
| 27 | find_program(OPENMP_FILECHECK_EXECUTABLE |
| 28 | NAMES FileCheck |
| 29 | PATHS ${OPENMP_LLVM_TOOLS_DIR}) |
| 30 | if (NOT OPENMP_FILECHECK_EXECUTABLE) |
| 31 | message(STATUS "Cannot find FileCheck.") |
| 32 | message(STATUS "Please put FileCheck in your PATH, set OPENMP_FILECHECK_EXECUTABLE to its full path, or point OPENMP_LLVM_TOOLS_DIR to its directory.") |
| 33 | message(WARNING "The check targets will not be available!") |
| 34 | set(ENABLE_CHECK_TARGETS FALSE PARENT_SCOPE) |
| 35 | return() |
| 36 | endif() |
| 37 | endfunction() |
| 38 | |
| 39 | if (${OPENMP_STANDALONE_BUILD}) |
| 40 | find_standalone_test_dependencies() |
| 41 | |
| 42 | # Make sure we can use the console pool for recent CMake and Ninja > 1.5. |
| 43 | if (CMAKE_VERSION VERSION_LESS 3.1.20141117) |
| 44 | set(cmake_3_2_USES_TERMINAL) |
| 45 | else() |
| 46 | set(cmake_3_2_USES_TERMINAL USES_TERMINAL) |
| 47 | endif() |
| 48 | |
| 49 | # Set lit arguments. |
| 50 | set(DEFAULT_LIT_ARGS "-sv --show-unsupported --show-xfail") |
| 51 | if (MSVC OR XCODE) |
| 52 | set(DEFAULT_LIT_ARGS "${DEFAULT_LIT_ARGS} --no-progress-bar") |
| 53 | endif() |
Jonas Hahnfeld | 18bec60 | 2017-11-29 19:31:52 +0000 | [diff] [blame] | 54 | set(OPENMP_LIT_ARGS "${DEFAULT_LIT_ARGS}" CACHE STRING "Options for lit.") |
| 55 | separate_arguments(OPENMP_LIT_ARGS) |
| 56 | else() |
| 57 | set(OPENMP_FILECHECK_EXECUTABLE ${LLVM_RUNTIME_OUTPUT_INTDIR}/FileCheck) |
| 58 | endif() |
| 59 | |
Jonas Hahnfeld | fc473de | 2017-11-30 17:08:31 +0000 | [diff] [blame] | 60 | # Macro to extract information about compiler from file. (no own scope) |
| 61 | macro(extract_test_compiler_information lang file) |
| 62 | file(READ ${file} information) |
| 63 | list(GET information 0 path) |
| 64 | list(GET information 1 id) |
| 65 | list(GET information 2 version) |
| 66 | list(GET information 3 openmp_flags) |
| 67 | |
| 68 | set(OPENMP_TEST_${lang}_COMPILER_PATH ${path}) |
| 69 | set(OPENMP_TEST_${lang}_COMPILER_ID ${id}) |
| 70 | set(OPENMP_TEST_${lang}_COMPILER_VERSION ${version}) |
| 71 | set(OPENMP_TEST_${lang}_COMPILER_OPENMP_FLAGS ${openmp_flags}) |
| 72 | endmacro() |
| 73 | |
| 74 | # Function to set variables with information about the test compiler. |
| 75 | function(set_test_compiler_information dir) |
| 76 | extract_test_compiler_information(C ${dir}/CCompilerInformation.txt) |
| 77 | extract_test_compiler_information(CXX ${dir}/CXXCompilerInformation.txt) |
| 78 | if (NOT("${OPENMP_TEST_C_COMPILER_ID}" STREQUAL "${OPENMP_TEST_CXX_COMPILER_ID}" AND |
| 79 | "${OPENMP_TEST_C_COMPILER_VERSION}" STREQUAL "${OPENMP_TEST_CXX_COMPILER_VERSION}")) |
| 80 | message(STATUS "Test compilers for C and C++ don't match.") |
| 81 | message(WARNING "The check targets will not be available!") |
| 82 | set(ENABLE_CHECK_TARGETS FALSE PARENT_SCOPE) |
| 83 | else() |
| 84 | set(OPENMP_TEST_COMPILER_ID "${OPENMP_TEST_C_COMPILER_ID}" PARENT_SCOPE) |
| 85 | set(OPENMP_TEST_COMPILER_VERSION "${OPENMP_TEST_C_COMPILER_VERSION}" PARENT_SCOPE) |
| 86 | set(OPENMP_TEST_COMPILER_OPENMP_FLAGS "${OPENMP_TEST_C_COMPILER_OPENMP_FLAGS}" PARENT_SCOPE) |
| 87 | |
| 88 | # Determine major version. |
| 89 | string(REGEX MATCH "[0-9]+" major "${OPENMP_TEST_C_COMPILER_VERSION}") |
| 90 | set(OPENMP_TEST_COMPILER_VERSION_MAJOR "${major}" PARENT_SCOPE) |
| 91 | endif() |
| 92 | endfunction() |
| 93 | |
| 94 | if (${OPENMP_STANDALONE_BUILD}) |
| 95 | # Detect compiler that should be used for testing. |
| 96 | # We cannot use ExternalProject_Add() because its configuration runs when this |
| 97 | # project is built which is too late for detecting the compiler... |
| 98 | file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/DetectTestCompiler) |
| 99 | execute_process( |
| 100 | COMMAND ${CMAKE_COMMAND} ${CMAKE_CURRENT_LIST_DIR}/DetectTestCompiler |
| 101 | -DCMAKE_C_COMPILER=${OPENMP_TEST_C_COMPILER} |
| 102 | -DCMAKE_CXX_COMPILER=${OPENMP_TEST_CXX_COMPILER} |
| 103 | WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/DetectTestCompiler |
| 104 | OUTPUT_VARIABLE DETECT_COMPILER_OUT |
| 105 | ERROR_VARIABLE DETECT_COMPILER_ERR |
| 106 | RESULT_VARIABLE DETECT_COMPILER_RESULT) |
| 107 | if (DETECT_COMPILER_RESULT) |
| 108 | message(STATUS "Could not detect test compilers.") |
| 109 | message(WARNING "The check targets will not be available!") |
| 110 | set(ENABLE_CHECK_TARGETS FALSE) |
| 111 | else() |
| 112 | set_test_compiler_information(${CMAKE_CURRENT_BINARY_DIR}/DetectTestCompiler) |
| 113 | endif() |
| 114 | else() |
| 115 | # Set the information that we know. |
| 116 | set(OPENMP_TEST_COMPILER_ID "Clang") |
| 117 | # Cannot use CLANG_VERSION because we are not guaranteed that this is already set. |
| 118 | set(OPENMP_TEST_COMPILER_VERSION "${LLVM_VERSION}") |
| 119 | set(OPENMP_TEST_COMPILER_VERSION_MAJOR "${LLVM_MAJOR_VERSION}") |
Jonas Hahnfeld | 6f9e25d | 2018-02-15 08:10:22 +0000 | [diff] [blame] | 120 | # TODO: Implement blockaddress in GlobalISel and remove this flag! |
| 121 | set(OPENMP_TEST_COMPILER_OPENMP_FLAGS "-fopenmp -fno-experimental-isel") |
Jonas Hahnfeld | fc473de | 2017-11-30 17:08:31 +0000 | [diff] [blame] | 122 | endif() |
| 123 | |
| 124 | # Function to set compiler features for use in lit. |
| 125 | function(set_test_compiler_features) |
| 126 | if ("${OPENMP_TEST_COMPILER_ID}" STREQUAL "GNU") |
| 127 | set(comp "gcc") |
Joachim Protze | 633bc4c | 2017-12-21 13:55:16 +0000 | [diff] [blame] | 128 | elseif ("${OPENMP_TEST_COMPILER_ID}" STREQUAL "Intel") |
| 129 | set(comp "icc") |
Jonas Hahnfeld | fc473de | 2017-11-30 17:08:31 +0000 | [diff] [blame] | 130 | else() |
| 131 | # Just use the lowercase of the compiler ID as fallback. |
| 132 | string(TOLOWER "${OPENMP_TEST_COMPILER_ID}" comp) |
| 133 | endif() |
| 134 | set(OPENMP_TEST_COMPILER_FEATURES "['${comp}', '${comp}-${OPENMP_TEST_COMPILER_VERSION_MAJOR}', '${comp}-${OPENMP_TEST_COMPILER_VERSION}']" PARENT_SCOPE) |
| 135 | endfunction() |
| 136 | set_test_compiler_features() |
| 137 | |
Jonas Hahnfeld | 18bec60 | 2017-11-29 19:31:52 +0000 | [diff] [blame] | 138 | # Function to add a testsuite for an OpenMP runtime library. |
| 139 | function(add_openmp_testsuite target comment) |
| 140 | if (NOT ENABLE_CHECK_TARGETS) |
| 141 | add_custom_target(${target} |
| 142 | COMMAND ${CMAKE_COMMAND} -E echo "${target} does nothing, dependencies not found.") |
| 143 | message(STATUS "${target} does nothing.") |
| 144 | return() |
| 145 | endif() |
| 146 | |
| 147 | cmake_parse_arguments(ARG "" "" "DEPENDS" ${ARGN}) |
| 148 | # EXCLUDE_FROM_ALL excludes the test ${target} out of check-openmp. |
| 149 | if (NOT EXCLUDE_FROM_ALL) |
| 150 | # Register the testsuites and depends for the check-openmp rule. |
| 151 | set_property(GLOBAL APPEND PROPERTY OPENMP_LIT_TESTSUITES ${ARG_UNPARSED_ARGUMENTS}) |
| 152 | set_property(GLOBAL APPEND PROPERTY OPENMP_LIT_DEPENDS ${ARG_DEPENDS}) |
| 153 | endif() |
| 154 | |
| 155 | if (${OPENMP_STANDALONE_BUILD}) |
| 156 | add_custom_target(${target} |
| 157 | COMMAND ${PYTHON_EXECUTABLE} ${OPENMP_LLVM_LIT_EXECUTABLE} ${OPENMP_LIT_ARGS} ${ARG_UNPARSED_ARGUMENTS} |
| 158 | COMMENT ${comment} |
| 159 | DEPENDS ${ARG_DEPENDS} |
| 160 | ${cmake_3_2_USES_TERMINAL} |
| 161 | ) |
| 162 | else() |
| 163 | add_lit_testsuite(${target} |
| 164 | ${comment} |
| 165 | ${ARG_UNPARSED_ARGUMENTS} |
| 166 | DEPENDS clang clang-headers FileCheck ${ARG_DEPENDS} |
| 167 | ) |
| 168 | endif() |
| 169 | endfunction() |
| 170 | |
| 171 | function(construct_check_openmp_target) |
| 172 | get_property(OPENMP_LIT_TESTSUITES GLOBAL PROPERTY OPENMP_LIT_TESTSUITES) |
| 173 | get_property(OPENMP_LIT_DEPENDS GLOBAL PROPERTY OPENMP_LIT_DEPENDS) |
| 174 | |
| 175 | # We already added the testsuites themselves, no need to do that again. |
| 176 | set(EXCLUDE_FROM_ALL True) |
| 177 | add_openmp_testsuite(check-openmp "Running OpenMP tests" ${OPENMP_LIT_TESTSUITES} DEPENDS ${OPENMP_LIT_DEPENDS}) |
| 178 | endfunction() |