brintos

brintos / llvm-project-archived public Read only

0
0
Text · 9.9 KiB · b564e46 Raw
241 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=1800")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()75set(OFFLOAD_DEVICE_INFO_EXECUTABLE ${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-offload-device-info)76set(OFFLOAD_TBLGEN_EXECUTABLE ${LLVM_RUNTIME_OUTPUT_INTDIR}/offload-tblgen)77 78# Macro to extract information about compiler from file. (no own scope)79macro(extract_test_compiler_information lang file)80  file(READ ${file} information)81  list(GET information 0 path)82  list(GET information 1 id)83  list(GET information 2 version)84  list(GET information 3 openmp_flags)85  list(GET information 4 has_tsan_flags)86  list(GET information 5 has_omit_frame_pointer_flags)87  list(GET information 6 has_omp_h)88 89  set(OPENMP_TEST_${lang}_COMPILER_PATH ${path})90  set(OPENMP_TEST_${lang}_COMPILER_ID ${id})91  set(OPENMP_TEST_${lang}_COMPILER_VERSION ${version})92  set(OPENMP_TEST_${lang}_COMPILER_OPENMP_FLAGS ${openmp_flags})93  set(OPENMP_TEST_${lang}_COMPILER_HAS_TSAN_FLAGS ${has_tsan_flags})94  set(OPENMP_TEST_${lang}_COMPILER_HAS_OMIT_FRAME_POINTER_FLAGS ${has_omit_frame_pointer_flags})95  set(OPENMP_TEST_${lang}_COMPILER_HAS_OMP_H ${has_omp_h})96endmacro()97 98# Function to set variables with information about the test compiler.99function(set_test_compiler_information dir)100  extract_test_compiler_information(C ${dir}/CCompilerInformation.txt)101  extract_test_compiler_information(CXX ${dir}/CXXCompilerInformation.txt)102  if (NOT("${OPENMP_TEST_C_COMPILER_ID}" STREQUAL "${OPENMP_TEST_CXX_COMPILER_ID}" AND103          "${OPENMP_TEST_C_COMPILER_VERSION}" STREQUAL "${OPENMP_TEST_CXX_COMPILER_VERSION}"))104    message(STATUS "Test compilers for C and C++ don't match.")105    message(WARNING "The check targets will not be available!")106    set(ENABLE_CHECK_TARGETS FALSE PARENT_SCOPE)107  else()108    set(OPENMP_TEST_COMPILER_ID "${OPENMP_TEST_C_COMPILER_ID}" PARENT_SCOPE)109    set(OPENMP_TEST_COMPILER_VERSION "${OPENMP_TEST_C_COMPILER_VERSION}" PARENT_SCOPE)110    set(OPENMP_TEST_COMPILER_OPENMP_FLAGS "${OPENMP_TEST_C_COMPILER_OPENMP_FLAGS}" PARENT_SCOPE)111    set(OPENMP_TEST_COMPILER_HAS_TSAN_FLAGS "${OPENMP_TEST_C_COMPILER_HAS_TSAN_FLAGS}" PARENT_SCOPE)112    set(OPENMP_TEST_COMPILER_HAS_OMIT_FRAME_POINTER_FLAGS "${OPENMP_TEST_C_COMPILER_HAS_OMIT_FRAME_POINTER_FLAGS}" PARENT_SCOPE)113    set(OPENMP_TEST_COMPILER_HAS_OMP_H "${OPENMP_TEST_C_COMPILER_HAS_OMP_H}" PARENT_SCOPE)114 115    # Determine major version.116    string(REGEX MATCH "[0-9]+" major "${OPENMP_TEST_C_COMPILER_VERSION}")117    string(REGEX MATCH "[0-9]+\\.[0-9]+" majorminor "${OPENMP_TEST_C_COMPILER_VERSION}")118    set(OPENMP_TEST_COMPILER_VERSION_MAJOR "${major}" PARENT_SCOPE)119    set(OPENMP_TEST_COMPILER_VERSION_MAJOR_MINOR "${majorminor}" PARENT_SCOPE)120  endif()121endfunction()122 123if (${OPENMP_STANDALONE_BUILD})124  # Detect compiler that should be used for testing.125  # We cannot use ExternalProject_Add() because its configuration runs when this126  # project is built which is too late for detecting the compiler...127  file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/DetectTestCompiler)128  execute_process(129    COMMAND ${CMAKE_COMMAND} -G${CMAKE_GENERATOR} ${CMAKE_CURRENT_SOURCE_DIR}/../openmp/cmake/DetectTestCompiler130      -DCMAKE_C_COMPILER=${OPENMP_TEST_C_COMPILER}131      -DCMAKE_CXX_COMPILER=${OPENMP_TEST_CXX_COMPILER}132    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/DetectTestCompiler133    OUTPUT_VARIABLE DETECT_COMPILER_OUT134    ERROR_VARIABLE DETECT_COMPILER_ERR135    RESULT_VARIABLE DETECT_COMPILER_RESULT)136  if (DETECT_COMPILER_RESULT)137    message(STATUS "Could not detect test compilers.")138    message(WARNING "The check targets will not be available!")139    set(ENABLE_CHECK_TARGETS FALSE)140  else()141    set_test_compiler_information(${CMAKE_CURRENT_BINARY_DIR}/DetectTestCompiler)142  endif()143else()144  # Set the information that we know.145  set(OPENMP_TEST_COMPILER_ID "Clang")146  # Cannot use CLANG_VERSION because we are not guaranteed that this is already set.147  set(OPENMP_TEST_COMPILER_VERSION "${LLVM_VERSION}")148  set(OPENMP_TEST_COMPILER_VERSION_MAJOR "${LLVM_VERSION_MAJOR}")149  set(OPENMP_TEST_COMPILER_VERSION_MAJOR_MINOR "${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}")150  # Unfortunately the top-level cmake/config-ix.cmake file mangles CMake's151  # CMAKE_THREAD_LIBS_INIT variable from the FindThreads package, so work152  # around that, until it is fixed there.153  if("${CMAKE_THREAD_LIBS_INIT}" STREQUAL "-lpthread")154    set(OPENMP_TEST_COMPILER_THREAD_FLAGS "-pthread")155  else()156    set(OPENMP_TEST_COMPILER_THREAD_FLAGS "${CMAKE_THREAD_LIBS_INIT}")157  endif()158  if(TARGET tsan)159    set(OPENMP_TEST_COMPILER_HAS_TSAN_FLAGS 1)160  else()161    set(OPENMP_TEST_COMPILER_HAS_TSAN_FLAGS 0)162  endif()163  set(OPENMP_TEST_COMPILER_HAS_OMP_H 1)164  set(OPENMP_TEST_COMPILER_OPENMP_FLAGS "-fopenmp ${OPENMP_TEST_COMPILER_THREAD_FLAGS}")165  set(OPENMP_TEST_COMPILER_HAS_OMIT_FRAME_POINTER_FLAGS 1)166endif()167 168# Function to set compiler features for use in lit.169function(update_test_compiler_features)170  set(FEATURES "[")171  set(first TRUE)172  foreach(feat IN LISTS OPENMP_TEST_COMPILER_FEATURE_LIST)173    if (NOT first)174      string(APPEND FEATURES ", ")175    endif()176    set(first FALSE)177    string(APPEND FEATURES "'${feat}'")178  endforeach()179  string(APPEND FEATURES "]")180  set(OPENMP_TEST_COMPILER_FEATURES ${FEATURES} PARENT_SCOPE)181endfunction()182 183function(set_test_compiler_features)184  if ("${OPENMP_TEST_COMPILER_ID}" STREQUAL "GNU")185    set(comp "gcc")186  elseif ("${OPENMP_TEST_COMPILER_ID}" STREQUAL "Intel")187    set(comp "icc")188  else()189    # Just use the lowercase of the compiler ID as fallback.190    string(TOLOWER "${OPENMP_TEST_COMPILER_ID}" comp)191  endif()192  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)193endfunction()194set_test_compiler_features()195update_test_compiler_features()196 197# Function to add a testsuite for an OpenMP runtime library.198function(add_offload_testsuite target comment)199  if (NOT ENABLE_CHECK_TARGETS)200    add_custom_target(${target}201      COMMAND ${CMAKE_COMMAND} -E echo "${target} does nothing, dependencies not found.")202    message(STATUS "${target} does nothing.")203    return()204  endif()205 206  cmake_parse_arguments(ARG "EXCLUDE_FROM_CHECK_ALL" "" "DEPENDS;ARGS" ${ARGN})207  # EXCLUDE_FROM_CHECK_ALL excludes the test ${target} out of check-offload.208  if (NOT ARG_EXCLUDE_FROM_CHECK_ALL)209    # Register the testsuites and depends for the check-offload rule.210    set_property(GLOBAL APPEND PROPERTY OPENMP_LIT_TESTSUITES ${ARG_UNPARSED_ARGUMENTS})211    set_property(GLOBAL APPEND PROPERTY OPENMP_LIT_DEPENDS ${ARG_DEPENDS})212  endif()213 214  if (${OPENMP_STANDALONE_BUILD})215    set(LIT_ARGS ${OPENMP_LIT_ARGS} ${ARG_ARGS})216    add_custom_target(${target}217      COMMAND ${Python3_EXECUTABLE} ${OPENMP_LLVM_LIT_EXECUTABLE} ${LIT_ARGS} ${ARG_UNPARSED_ARGUMENTS}218      COMMENT ${comment}219      DEPENDS ${ARG_DEPENDS}220      USES_TERMINAL221    )222  else()223    if (ARG_EXCLUDE_FROM_CHECK_ALL)224      add_lit_testsuite(${target}225        ${comment}226        ${ARG_UNPARSED_ARGUMENTS}227        EXCLUDE_FROM_CHECK_ALL228        DEPENDS clang FileCheck not ${ARG_DEPENDS}229        ARGS ${ARG_ARGS}230      )231    else()232      add_lit_testsuite(${target}233        ${comment}234        ${ARG_UNPARSED_ARGUMENTS}235        DEPENDS clang FileCheck not ${ARG_DEPENDS}236        ARGS ${ARG_ARGS}237      )238    endif()239  endif()240endfunction()241