xref: /llvm-project/offload/cmake/OpenMPTesting.cmake (revision 4a44e4b192db0bb38d3eb7ff20c767e2c747d745)
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_EXECUTABLE
19    NAMES llvm-lit.py llvm-lit lit.py lit
20    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_EXECUTABLE
30    NAMES FileCheck
31    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_EXECUTABLE
41    NAMES not
42    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_RUNTIME_OUTPUT_INTDIR}/FileCheck)
72  endif()
73  set(OPENMP_NOT_EXECUTABLE ${LLVM_RUNTIME_OUTPUT_INTDIR}/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}" AND
103          "${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 this
126  # 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/DetectTestCompiler
130      -DCMAKE_C_COMPILER=${OPENMP_TEST_C_COMPILER}
131      -DCMAKE_CXX_COMPILER=${OPENMP_TEST_CXX_COMPILER}
132    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/DetectTestCompiler
133    OUTPUT_VARIABLE DETECT_COMPILER_OUT
134    ERROR_VARIABLE DETECT_COMPILER_ERR
135    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's
151  # CMAKE_THREAD_LIBS_INIT variable from the FindThreads package, so work
152  # 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_TERMINAL
221    )
222  else()
223    if (ARG_EXCLUDE_FROM_CHECK_ALL)
224      add_lit_testsuite(${target}
225        ${comment}
226        ${ARG_UNPARSED_ARGUMENTS}
227        EXCLUDE_FROM_CHECK_ALL
228        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