| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- cmake_minimum_required(VERSION 3.8)
- project(TestFindOpenMP NONE)
- include(CTest)
- macro(source_code_mapper_helper LANG_NAME SRC_FILE_NAME)
- if("${LANG_NAME}" STREQUAL "C")
- set(OpenMPTEST_SOURCE_FILE "${SRC_FILE_NAME}.c")
- elseif("${LANG_NAME}" STREQUAL "CXX")
- configure_file("${SRC_FILE_NAME}.c" "${SRC_FILE_NAME}.cxx" COPYONLY)
- set(OpenMPTEST_SOURCE_FILE "${SRC_FILE_NAME}.cxx")
- elseif("${LANG_NAME}" STREQUAL "Fortran")
- set(OpenMPTEST_SOURCE_FILE "${CMAKE_CURRENT_BINARY_DIR}/${SRC_FILE_NAME}.f90")
- if(OpenMP_Fortran_HAVE_OMPLIB_MODULE)
- set(OpenMP_Fortran_INCLUDE_LINE "use omp_lib\n implicit none")
- else()
- set(OpenMP_Fortran_INCLUDE_LINE "implicit none\n include 'omp_lib.h'")
- endif()
- configure_file("${SRC_FILE_NAME}.f90.in" "${OpenMPTEST_SOURCE_FILE}" @ONLY)
- endif()
- endmacro()
- foreach(c C CXX Fortran)
- if("${OpenMP_TEST_${c}}")
- message("Testing ${c}")
- enable_language(${c})
- endif()
- endforeach()
- if(CMAKE_C_COMPILER_ID STREQUAL "MSVC"
- AND CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 19.30
- AND NOT CMAKE_C_COMPILER_ARCHITECTURE_ID STREQUAL "ARM64")
- set(test_msvc_runtime 1)
- set(OpenMP_RUNTIME_MSVC "llvm")
- endif()
- find_package(OpenMP REQUIRED)
- if(test_msvc_runtime)
- if(NOT OpenMP_C_FLAGS STREQUAL "-openmp:llvm")
- message(FATAL_ERROR "OpenMP_RUNTIME_MSVC='${OpenMP_RUNTIME_MSVC}' not honored: '${OpenMP_C_FLAGS}'")
- endif()
- endif()
- foreach(c C CXX Fortran)
- if(NOT "${OpenMP_TEST_${c}}")
- continue()
- endif()
- source_code_mapper_helper(${c} main)
- add_executable(test_tgt_${c} ${OpenMPTEST_SOURCE_FILE})
- target_link_libraries(test_tgt_${c} PRIVATE OpenMP::OpenMP_${c})
- set_property(TARGET test_tgt_${c} PROPERTY LINKER_LANGUAGE ${c})
- add_test(NAME test_tgt_${c} COMMAND test_tgt_${c})
- add_executable(test_var_${c} ${OpenMPTEST_SOURCE_FILE})
- separate_arguments(_OpenMP_${c}_OPTIONS NATIVE_COMMAND "${OpenMP_${c}_FLAGS}")
- target_compile_options(test_var_${c} PRIVATE "${_OpenMP_${c}_OPTIONS}")
- target_link_libraries(test_var_${c} PRIVATE "${OpenMP_${c}_FLAGS}")
- target_include_directories(test_var_${c} PRIVATE ${OpenMP_${c}_INCLUDE_DIRS})
- set_property(TARGET test_var_${c} PROPERTY LINKER_LANGUAGE ${c})
- add_test(NAME test_var_${c} COMMAND test_var_${c})
- source_code_mapper_helper(${c} scalprod)
- add_library(scalprod_${c} STATIC ${OpenMPTEST_SOURCE_FILE})
- target_link_libraries(scalprod_${c} PRIVATE OpenMP::OpenMP_${c})
- set_property(TARGET scalprod_${c} PROPERTY LINKER_LANGUAGE ${c})
- endforeach()
- foreach(c C CXX Fortran)
- if(NOT "${OpenMP_TEST_${c}}")
- continue()
- endif()
- foreach(d C CXX Fortran)
- if(NOT "${OpenMP_TEST_${d}}")
- continue()
- endif()
- source_code_mapper_helper(${c} scaltest)
- add_executable(scaltest_${c}_${d} ${OpenMPTEST_SOURCE_FILE})
- target_link_libraries(scaltest_${c}_${d} PRIVATE scalprod_${d})
- set_property(TARGET scaltest_${c}_${d} PROPERTY LINKER_LANGUAGE ${c})
- add_test(NAME test_omp_${c}_${d} COMMAND scaltest_${c}_${d})
- set_property(TEST test_omp_${c}_${d} PROPERTY PASS_REGULAR_EXPRESSION "^[ \t]*70\\.?0*")
- endforeach()
- endforeach()
|