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}") |
Jonathan Peyton | 8216492 | 2018-08-02 19:13:07 +0000 | [diff] [blame] | 90 | string(REGEX MATCH "[0-9]+\\.[0-9]+" majorminor "${OPENMP_TEST_C_COMPILER_VERSION}") |
Jonas Hahnfeld | fc473de | 2017-11-30 17:08:31 +0000 | [diff] [blame] | 91 | set(OPENMP_TEST_COMPILER_VERSION_MAJOR "${major}" PARENT_SCOPE) |
Jonathan Peyton | 8216492 | 2018-08-02 19:13:07 +0000 | [diff] [blame] | 92 | set(OPENMP_TEST_COMPILER_VERSION_MAJOR_MINOR "${majorminor}" PARENT_SCOPE) |
Jonas Hahnfeld | fc473de | 2017-11-30 17:08:31 +0000 | [diff] [blame] | 93 | endif() |
| 94 | endfunction() |
| 95 | |
| 96 | if (${OPENMP_STANDALONE_BUILD}) |
| 97 | # Detect compiler that should be used for testing. |
| 98 | # We cannot use ExternalProject_Add() because its configuration runs when this |
| 99 | # project is built which is too late for detecting the compiler... |
| 100 | file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/DetectTestCompiler) |
| 101 | execute_process( |
| 102 | COMMAND ${CMAKE_COMMAND} ${CMAKE_CURRENT_LIST_DIR}/DetectTestCompiler |
| 103 | -DCMAKE_C_COMPILER=${OPENMP_TEST_C_COMPILER} |
| 104 | -DCMAKE_CXX_COMPILER=${OPENMP_TEST_CXX_COMPILER} |
| 105 | WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/DetectTestCompiler |
| 106 | OUTPUT_VARIABLE DETECT_COMPILER_OUT |
| 107 | ERROR_VARIABLE DETECT_COMPILER_ERR |
| 108 | RESULT_VARIABLE DETECT_COMPILER_RESULT) |
| 109 | if (DETECT_COMPILER_RESULT) |
| 110 | message(STATUS "Could not detect test compilers.") |
| 111 | message(WARNING "The check targets will not be available!") |
| 112 | set(ENABLE_CHECK_TARGETS FALSE) |
| 113 | else() |
| 114 | set_test_compiler_information(${CMAKE_CURRENT_BINARY_DIR}/DetectTestCompiler) |
| 115 | endif() |
| 116 | else() |
| 117 | # Set the information that we know. |
| 118 | set(OPENMP_TEST_COMPILER_ID "Clang") |
| 119 | # Cannot use CLANG_VERSION because we are not guaranteed that this is already set. |
| 120 | set(OPENMP_TEST_COMPILER_VERSION "${LLVM_VERSION}") |
| 121 | set(OPENMP_TEST_COMPILER_VERSION_MAJOR "${LLVM_MAJOR_VERSION}") |
Jonathan Peyton | 8216492 | 2018-08-02 19:13:07 +0000 | [diff] [blame] | 122 | set(OPENMP_TEST_COMPILER_VERSION_MAJOR_MINOR "${LLVM_MAJOR_VERSION}.${LLVM_MINOR_VERSION}") |
Jonas Hahnfeld | 6f9e25d | 2018-02-15 08:10:22 +0000 | [diff] [blame] | 123 | # TODO: Implement blockaddress in GlobalISel and remove this flag! |
| 124 | set(OPENMP_TEST_COMPILER_OPENMP_FLAGS "-fopenmp -fno-experimental-isel") |
Jonas Hahnfeld | fc473de | 2017-11-30 17:08:31 +0000 | [diff] [blame] | 125 | endif() |
| 126 | |
| 127 | # Function to set compiler features for use in lit. |
| 128 | function(set_test_compiler_features) |
| 129 | if ("${OPENMP_TEST_COMPILER_ID}" STREQUAL "GNU") |
| 130 | set(comp "gcc") |
Joachim Protze | 633bc4c | 2017-12-21 13:55:16 +0000 | [diff] [blame] | 131 | elseif ("${OPENMP_TEST_COMPILER_ID}" STREQUAL "Intel") |
| 132 | set(comp "icc") |
Jonas Hahnfeld | fc473de | 2017-11-30 17:08:31 +0000 | [diff] [blame] | 133 | else() |
| 134 | # Just use the lowercase of the compiler ID as fallback. |
| 135 | string(TOLOWER "${OPENMP_TEST_COMPILER_ID}" comp) |
| 136 | endif() |
Jonathan Peyton | 8216492 | 2018-08-02 19:13:07 +0000 | [diff] [blame] | 137 | set(OPENMP_TEST_COMPILER_FEATURES "['${comp}', '${comp}-${OPENMP_TEST_COMPILER_VERSION_MAJOR}', '${comp}-${OPENMP_TEST_COMPILER_VERSION_MAJOR_MINOR}', '${comp}-${OPENMP_TEST_COMPILER_VERSION}']" PARENT_SCOPE) |
Jonas Hahnfeld | fc473de | 2017-11-30 17:08:31 +0000 | [diff] [blame] | 138 | endfunction() |
| 139 | set_test_compiler_features() |
| 140 | |
Jonas Hahnfeld | 18bec60 | 2017-11-29 19:31:52 +0000 | [diff] [blame] | 141 | # Function to add a testsuite for an OpenMP runtime library. |
| 142 | function(add_openmp_testsuite target comment) |
| 143 | if (NOT ENABLE_CHECK_TARGETS) |
| 144 | add_custom_target(${target} |
| 145 | COMMAND ${CMAKE_COMMAND} -E echo "${target} does nothing, dependencies not found.") |
| 146 | message(STATUS "${target} does nothing.") |
| 147 | return() |
| 148 | endif() |
| 149 | |
Jonas Hahnfeld | 122dbb5 | 2018-09-28 15:05:43 +0000 | [diff] [blame] | 150 | cmake_parse_arguments(ARG "" "" "DEPENDS;ARGS" ${ARGN}) |
Jonas Hahnfeld | 18bec60 | 2017-11-29 19:31:52 +0000 | [diff] [blame] | 151 | # EXCLUDE_FROM_ALL excludes the test ${target} out of check-openmp. |
| 152 | if (NOT EXCLUDE_FROM_ALL) |
| 153 | # Register the testsuites and depends for the check-openmp rule. |
| 154 | set_property(GLOBAL APPEND PROPERTY OPENMP_LIT_TESTSUITES ${ARG_UNPARSED_ARGUMENTS}) |
| 155 | set_property(GLOBAL APPEND PROPERTY OPENMP_LIT_DEPENDS ${ARG_DEPENDS}) |
| 156 | endif() |
| 157 | |
| 158 | if (${OPENMP_STANDALONE_BUILD}) |
Jonas Hahnfeld | 122dbb5 | 2018-09-28 15:05:43 +0000 | [diff] [blame] | 159 | set(LIT_ARGS ${OPENMP_LIT_ARGS} ${ARG_ARGS}) |
Jonas Hahnfeld | 18bec60 | 2017-11-29 19:31:52 +0000 | [diff] [blame] | 160 | add_custom_target(${target} |
Jonas Hahnfeld | 122dbb5 | 2018-09-28 15:05:43 +0000 | [diff] [blame] | 161 | COMMAND ${PYTHON_EXECUTABLE} ${OPENMP_LLVM_LIT_EXECUTABLE} ${LIT_ARGS} ${ARG_UNPARSED_ARGUMENTS} |
Jonas Hahnfeld | 18bec60 | 2017-11-29 19:31:52 +0000 | [diff] [blame] | 162 | COMMENT ${comment} |
| 163 | DEPENDS ${ARG_DEPENDS} |
| 164 | ${cmake_3_2_USES_TERMINAL} |
| 165 | ) |
| 166 | else() |
| 167 | add_lit_testsuite(${target} |
| 168 | ${comment} |
| 169 | ${ARG_UNPARSED_ARGUMENTS} |
| 170 | DEPENDS clang clang-headers FileCheck ${ARG_DEPENDS} |
Jonas Hahnfeld | 122dbb5 | 2018-09-28 15:05:43 +0000 | [diff] [blame] | 171 | ARGS ${ARG_ARGS} |
Jonas Hahnfeld | 18bec60 | 2017-11-29 19:31:52 +0000 | [diff] [blame] | 172 | ) |
| 173 | endif() |
| 174 | endfunction() |
| 175 | |
| 176 | function(construct_check_openmp_target) |
| 177 | get_property(OPENMP_LIT_TESTSUITES GLOBAL PROPERTY OPENMP_LIT_TESTSUITES) |
| 178 | get_property(OPENMP_LIT_DEPENDS GLOBAL PROPERTY OPENMP_LIT_DEPENDS) |
| 179 | |
| 180 | # We already added the testsuites themselves, no need to do that again. |
| 181 | set(EXCLUDE_FROM_ALL True) |
| 182 | add_openmp_testsuite(check-openmp "Running OpenMP tests" ${OPENMP_LIT_TESTSUITES} DEPENDS ${OPENMP_LIT_DEPENDS}) |
| 183 | endfunction() |