254 lines · plain
1# Keep track if we have all dependencies.2set(ENABLE_CHECK_TARGETS TRUE)3 4# Function to find required dependencies for testing.5function(find_standalone_test_dependencies)6 find_package (Python3 COMPONENTS Interpreter)7 8 if (NOT Python3_Interpreter_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 else()14 set(Python3_EXECUTABLE ${Python3_EXECUTABLE} PARENT_SCOPE)15 endif()16 17 # Find executables.18 find_program(OPENMP_LLVM_LIT_EXECUTABLE19 NAMES llvm-lit.py llvm-lit lit.py lit20 PATHS ${OPENMP_LLVM_TOOLS_DIR})21 if (NOT OPENMP_LLVM_LIT_EXECUTABLE)22 message(STATUS "Cannot find llvm-lit.")23 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.")24 message(WARNING "The check targets will not be available!")25 set(ENABLE_CHECK_TARGETS FALSE PARENT_SCOPE)26 return()27 endif()28 29 find_program(OPENMP_FILECHECK_EXECUTABLE30 NAMES FileCheck31 PATHS ${OPENMP_LLVM_TOOLS_DIR})32 if (NOT OPENMP_FILECHECK_EXECUTABLE)33 message(STATUS "Cannot find FileCheck.")34 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.")35 message(WARNING "The check targets will not be available!")36 set(ENABLE_CHECK_TARGETS FALSE PARENT_SCOPE)37 return()38 endif()39 40 find_program(OPENMP_NOT_EXECUTABLE41 NAMES not42 PATHS ${OPENMP_LLVM_TOOLS_DIR})43 if (NOT OPENMP_NOT_EXECUTABLE)44 message(STATUS "Cannot find 'not'.")45 message(STATUS "Please put 'not' in your PATH, set OPENMP_NOT_EXECUTABLE to its full path, or point OPENMP_LLVM_TOOLS_DIR to its directory.")46 message(WARNING "The check targets will not be available!")47 set(ENABLE_CHECK_TARGETS FALSE PARENT_SCOPE)48 return()49 endif()50endfunction()51 52if (${OPENMP_STANDALONE_BUILD})53 find_standalone_test_dependencies()54 55 # Set lit arguments.56 set(DEFAULT_LIT_ARGS "-sv --show-unsupported --show-xfail")57 if (MSVC OR XCODE)58 set(DEFAULT_LIT_ARGS "${DEFAULT_LIT_ARGS} --no-progress-bar")59 endif()60 if ("${CMAKE_SYSTEM_NAME}" MATCHES "AIX")61 set(DEFAULT_LIT_ARGS "${DEFAULT_LIT_ARGS} --time-tests --timeout=3000")62 endif()63 set(OPENMP_LIT_ARGS "${DEFAULT_LIT_ARGS}" CACHE STRING "Options for lit.")64 separate_arguments(OPENMP_LIT_ARGS)65else()66 if (NOT TARGET "FileCheck")67 message(STATUS "Cannot find 'FileCheck'.")68 message(WARNING "The check targets will not be available!")69 set(ENABLE_CHECK_TARGETS FALSE)70 else()71 set(OPENMP_FILECHECK_EXECUTABLE ${LLVM_TOOLS_BINARY_DIR}/FileCheck)72 endif()73 set(OPENMP_NOT_EXECUTABLE ${LLVM_TOOLS_BINARY_DIR}/not)74endif()75 76# Macro to extract information about compiler from file. (no own scope)77macro(extract_test_compiler_information lang file)78 file(READ ${file} information)79 list(GET information 0 path)80 list(GET information 1 id)81 list(GET information 2 version)82 list(GET information 3 openmp_flags)83 list(GET information 4 has_tsan_flags)84 list(GET information 5 has_omit_frame_pointer_flags)85 list(GET information 6 has_omp_h)86 87 set(OPENMP_TEST_${lang}_COMPILER_PATH ${path})88 set(OPENMP_TEST_${lang}_COMPILER_ID ${id})89 set(OPENMP_TEST_${lang}_COMPILER_VERSION ${version})90 set(OPENMP_TEST_${lang}_COMPILER_OPENMP_FLAGS ${openmp_flags})91 set(OPENMP_TEST_${lang}_COMPILER_HAS_TSAN_FLAGS ${has_tsan_flags})92 set(OPENMP_TEST_${lang}_COMPILER_HAS_OMIT_FRAME_POINTER_FLAGS ${has_omit_frame_pointer_flags})93 set(OPENMP_TEST_${lang}_COMPILER_HAS_OMP_H ${has_omp_h})94endmacro()95 96# Function to set variables with information about the test compiler.97function(set_test_compiler_information dir)98 extract_test_compiler_information(C ${dir}/CCompilerInformation.txt)99 extract_test_compiler_information(CXX ${dir}/CXXCompilerInformation.txt)100 if (NOT("${OPENMP_TEST_C_COMPILER_ID}" STREQUAL "${OPENMP_TEST_CXX_COMPILER_ID}" AND101 "${OPENMP_TEST_C_COMPILER_VERSION}" STREQUAL "${OPENMP_TEST_CXX_COMPILER_VERSION}"))102 message(STATUS "Test compilers for C and C++ don't match.")103 message(WARNING "The check targets will not be available!")104 set(ENABLE_CHECK_TARGETS FALSE PARENT_SCOPE)105 else()106 set(OPENMP_TEST_COMPILER_ID "${OPENMP_TEST_C_COMPILER_ID}" PARENT_SCOPE)107 set(OPENMP_TEST_COMPILER_VERSION "${OPENMP_TEST_C_COMPILER_VERSION}" PARENT_SCOPE)108 set(OPENMP_TEST_COMPILER_OPENMP_FLAGS "${OPENMP_TEST_C_COMPILER_OPENMP_FLAGS}" PARENT_SCOPE)109 set(OPENMP_TEST_COMPILER_HAS_TSAN_FLAGS "${OPENMP_TEST_C_COMPILER_HAS_TSAN_FLAGS}" PARENT_SCOPE)110 set(OPENMP_TEST_COMPILER_HAS_OMIT_FRAME_POINTER_FLAGS "${OPENMP_TEST_C_COMPILER_HAS_OMIT_FRAME_POINTER_FLAGS}" PARENT_SCOPE)111 set(OPENMP_TEST_COMPILER_HAS_OMP_H "${OPENMP_TEST_C_COMPILER_HAS_OMP_H}" PARENT_SCOPE)112 113 # Determine major version.114 string(REGEX MATCH "[0-9]+" major "${OPENMP_TEST_C_COMPILER_VERSION}")115 string(REGEX MATCH "[0-9]+\\.[0-9]+" majorminor "${OPENMP_TEST_C_COMPILER_VERSION}")116 set(OPENMP_TEST_COMPILER_VERSION_MAJOR "${major}" PARENT_SCOPE)117 set(OPENMP_TEST_COMPILER_VERSION_MAJOR_MINOR "${majorminor}" PARENT_SCOPE)118 endif()119endfunction()120 121if (${OPENMP_STANDALONE_BUILD})122 # Detect compiler that should be used for testing.123 # We cannot use ExternalProject_Add() because its configuration runs when this124 # project is built which is too late for detecting the compiler...125 file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/DetectTestCompiler)126 execute_process(127 COMMAND ${CMAKE_COMMAND} -G${CMAKE_GENERATOR} ${CMAKE_CURRENT_LIST_DIR}/DetectTestCompiler128 -DCMAKE_C_COMPILER=${OPENMP_TEST_C_COMPILER}129 -DCMAKE_CXX_COMPILER=${OPENMP_TEST_CXX_COMPILER}130 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/DetectTestCompiler131 OUTPUT_VARIABLE DETECT_COMPILER_OUT132 ERROR_VARIABLE DETECT_COMPILER_ERR133 RESULT_VARIABLE DETECT_COMPILER_RESULT)134 if (DETECT_COMPILER_RESULT)135 message(STATUS "Could not detect test compilers.")136 message(WARNING "The check targets will not be available!")137 set(ENABLE_CHECK_TARGETS FALSE)138 else()139 set_test_compiler_information(${CMAKE_CURRENT_BINARY_DIR}/DetectTestCompiler)140 endif()141else()142 # Set the information that we know.143 set(OPENMP_TEST_COMPILER_ID "Clang")144 # Cannot use CLANG_VERSION because we are not guaranteed that this is already set.145 set(OPENMP_TEST_COMPILER_VERSION "${LLVM_VERSION}")146 set(OPENMP_TEST_COMPILER_VERSION_MAJOR "${LLVM_VERSION_MAJOR}")147 set(OPENMP_TEST_COMPILER_VERSION_MAJOR_MINOR "${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}")148 # Unfortunately the top-level cmake/config-ix.cmake file mangles CMake's149 # CMAKE_THREAD_LIBS_INIT variable from the FindThreads package, so work150 # around that, until it is fixed there.151 if("${CMAKE_THREAD_LIBS_INIT}" STREQUAL "-lpthread")152 set(OPENMP_TEST_COMPILER_THREAD_FLAGS "-pthread")153 else()154 set(OPENMP_TEST_COMPILER_THREAD_FLAGS "${CMAKE_THREAD_LIBS_INIT}")155 endif()156 if(TARGET tsan)157 set(OPENMP_TEST_COMPILER_HAS_TSAN_FLAGS 1)158 else()159 set(OPENMP_TEST_COMPILER_HAS_TSAN_FLAGS 0)160 endif()161 set(OPENMP_TEST_COMPILER_HAS_OMP_H 1)162 set(OPENMP_TEST_COMPILER_OPENMP_FLAGS "-fopenmp ${OPENMP_TEST_COMPILER_THREAD_FLAGS}")163 set(OPENMP_TEST_COMPILER_HAS_OMIT_FRAME_POINTER_FLAGS 1)164endif()165 166set(OPENMP_TEST_ENABLE_TSAN "${OPENMP_TEST_COMPILER_HAS_TSAN_FLAGS}" CACHE BOOL167 "Whether to enable tests using tsan")168 169# Function to set compiler features for use in lit.170function(update_test_compiler_features)171 set(FEATURES "[")172 set(first TRUE)173 foreach(feat IN LISTS OPENMP_TEST_COMPILER_FEATURE_LIST)174 if (NOT first)175 string(APPEND FEATURES ", ")176 endif()177 set(first FALSE)178 string(APPEND FEATURES "'${feat}'")179 endforeach()180 string(APPEND FEATURES "]")181 set(OPENMP_TEST_COMPILER_FEATURES ${FEATURES} PARENT_SCOPE)182endfunction()183 184function(set_test_compiler_features)185 if ("${OPENMP_TEST_COMPILER_ID}" STREQUAL "GNU")186 set(comp "gcc")187 elseif ("${OPENMP_TEST_COMPILER_ID}" STREQUAL "Intel")188 set(comp "icc")189 else()190 # Just use the lowercase of the compiler ID as fallback.191 string(TOLOWER "${OPENMP_TEST_COMPILER_ID}" comp)192 endif()193 set(OPENMP_TEST_COMPILER_FEATURE_LIST ${comp} ${comp}-${OPENMP_TEST_COMPILER_VERSION_MAJOR} ${comp}-${OPENMP_TEST_COMPILER_VERSION_MAJOR_MINOR} ${comp}-${OPENMP_TEST_COMPILER_VERSION} PARENT_SCOPE)194endfunction()195set_test_compiler_features()196update_test_compiler_features()197 198# Function to add a testsuite for an OpenMP runtime library.199function(add_openmp_testsuite target comment)200 if (NOT ENABLE_CHECK_TARGETS)201 add_custom_target(${target}202 COMMAND ${CMAKE_COMMAND} -E echo "${target} does nothing, dependencies not found.")203 message(STATUS "${target} does nothing.")204 return()205 endif()206 207 cmake_parse_arguments(ARG "EXCLUDE_FROM_CHECK_ALL" "" "DEPENDS;ARGS" ${ARGN})208 # EXCLUDE_FROM_CHECK_ALL excludes the test ${target} out of check-openmp.209 if (NOT ARG_EXCLUDE_FROM_CHECK_ALL)210 # Register the testsuites and depends for the check-openmp rule.211 set_property(GLOBAL APPEND PROPERTY OPENMP_LIT_TESTSUITES ${ARG_UNPARSED_ARGUMENTS})212 set_property(GLOBAL APPEND PROPERTY OPENMP_LIT_DEPENDS ${ARG_DEPENDS})213 endif()214 215 if (${OPENMP_STANDALONE_BUILD})216 set(LIT_ARGS ${OPENMP_LIT_ARGS} ${ARG_ARGS})217 add_custom_target(${target}218 COMMAND ${Python3_EXECUTABLE} ${OPENMP_LLVM_LIT_EXECUTABLE} ${LIT_ARGS} ${ARG_UNPARSED_ARGUMENTS}219 COMMENT ${comment}220 DEPENDS ${ARG_DEPENDS}221 USES_TERMINAL222 )223 else()224 if (ARG_EXCLUDE_FROM_CHECK_ALL)225 add_lit_testsuite(${target}226 ${comment}227 ${ARG_UNPARSED_ARGUMENTS}228 EXCLUDE_FROM_CHECK_ALL229 DEPENDS clang FileCheck not ${ARG_DEPENDS}230 ARGS ${ARG_ARGS}231 )232 else()233 add_lit_testsuite(${target}234 ${comment}235 ${ARG_UNPARSED_ARGUMENTS}236 DEPENDS clang FileCheck not ${ARG_DEPENDS}237 ARGS ${ARG_ARGS}238 )239 endif()240 endif()241 242 if (TARGET flang-rt)243 add_dependencies(${target} flang-rt)244 endif ()245endfunction()246 247function(construct_check_openmp_target)248 get_property(OPENMP_LIT_TESTSUITES GLOBAL PROPERTY OPENMP_LIT_TESTSUITES)249 get_property(OPENMP_LIT_DEPENDS GLOBAL PROPERTY OPENMP_LIT_DEPENDS)250 251 # We already added the testsuites themselves, no need to do that again.252 add_openmp_testsuite(check-openmp "Running OpenMP tests" ${OPENMP_LIT_TESTSUITES} EXCLUDE_FROM_CHECK_ALL DEPENDS ${OPENMP_LIT_DEPENDS})253endfunction()254