CMakeLists.txt 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. cmake_minimum_required(VERSION 3.8)
  2. project(TestFindOpenMP NONE)
  3. include(CTest)
  4. macro(source_code_mapper_helper LANG_NAME SRC_FILE_NAME)
  5. if("${LANG_NAME}" STREQUAL "C")
  6. set(OpenMPTEST_SOURCE_FILE "${SRC_FILE_NAME}.c")
  7. elseif("${LANG_NAME}" STREQUAL "CXX")
  8. configure_file("${SRC_FILE_NAME}.c" "${SRC_FILE_NAME}.cxx" COPYONLY)
  9. set(OpenMPTEST_SOURCE_FILE "${SRC_FILE_NAME}.cxx")
  10. elseif("${LANG_NAME}" STREQUAL "Fortran")
  11. set(OpenMPTEST_SOURCE_FILE "${CMAKE_CURRENT_BINARY_DIR}/${SRC_FILE_NAME}.f90")
  12. if(OpenMP_Fortran_HAVE_OMPLIB_MODULE)
  13. set(OpenMP_Fortran_INCLUDE_LINE "use omp_lib\n implicit none")
  14. else()
  15. set(OpenMP_Fortran_INCLUDE_LINE "implicit none\n include 'omp_lib.h'")
  16. endif()
  17. configure_file("${SRC_FILE_NAME}.f90.in" "${OpenMPTEST_SOURCE_FILE}" @ONLY)
  18. endif()
  19. endmacro()
  20. foreach(c C CXX Fortran)
  21. if("${OpenMP_TEST_${c}}")
  22. message("Testing ${c}")
  23. enable_language(${c})
  24. endif()
  25. endforeach()
  26. if(CMAKE_C_COMPILER_ID STREQUAL "MSVC"
  27. AND CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 19.30
  28. AND NOT CMAKE_C_COMPILER_ARCHITECTURE_ID STREQUAL "ARM64")
  29. set(test_msvc_runtime 1)
  30. set(OpenMP_RUNTIME_MSVC "llvm")
  31. endif()
  32. find_package(OpenMP REQUIRED)
  33. if(test_msvc_runtime)
  34. if(NOT OpenMP_C_FLAGS STREQUAL "-openmp:llvm")
  35. message(FATAL_ERROR "OpenMP_RUNTIME_MSVC='${OpenMP_RUNTIME_MSVC}' not honored: '${OpenMP_C_FLAGS}'")
  36. endif()
  37. endif()
  38. foreach(c C CXX Fortran)
  39. if(NOT "${OpenMP_TEST_${c}}")
  40. continue()
  41. endif()
  42. source_code_mapper_helper(${c} main)
  43. add_executable(test_tgt_${c} ${OpenMPTEST_SOURCE_FILE})
  44. target_link_libraries(test_tgt_${c} PRIVATE OpenMP::OpenMP_${c})
  45. set_property(TARGET test_tgt_${c} PROPERTY LINKER_LANGUAGE ${c})
  46. add_test(NAME test_tgt_${c} COMMAND test_tgt_${c})
  47. add_executable(test_var_${c} ${OpenMPTEST_SOURCE_FILE})
  48. separate_arguments(_OpenMP_${c}_OPTIONS NATIVE_COMMAND "${OpenMP_${c}_FLAGS}")
  49. target_compile_options(test_var_${c} PRIVATE "${_OpenMP_${c}_OPTIONS}")
  50. target_link_libraries(test_var_${c} PRIVATE "${OpenMP_${c}_FLAGS}")
  51. target_include_directories(test_var_${c} PRIVATE ${OpenMP_${c}_INCLUDE_DIRS})
  52. set_property(TARGET test_var_${c} PROPERTY LINKER_LANGUAGE ${c})
  53. add_test(NAME test_var_${c} COMMAND test_var_${c})
  54. source_code_mapper_helper(${c} scalprod)
  55. add_library(scalprod_${c} STATIC ${OpenMPTEST_SOURCE_FILE})
  56. target_link_libraries(scalprod_${c} PRIVATE OpenMP::OpenMP_${c})
  57. set_property(TARGET scalprod_${c} PROPERTY LINKER_LANGUAGE ${c})
  58. endforeach()
  59. foreach(c C CXX Fortran)
  60. if(NOT "${OpenMP_TEST_${c}}")
  61. continue()
  62. endif()
  63. foreach(d C CXX Fortran)
  64. if(NOT "${OpenMP_TEST_${d}}")
  65. continue()
  66. endif()
  67. source_code_mapper_helper(${c} scaltest)
  68. add_executable(scaltest_${c}_${d} ${OpenMPTEST_SOURCE_FILE})
  69. target_link_libraries(scaltest_${c}_${d} PRIVATE scalprod_${d})
  70. set_property(TARGET scaltest_${c}_${d} PROPERTY LINKER_LANGUAGE ${c})
  71. add_test(NAME test_omp_${c}_${d} COMMAND scaltest_${c}_${d})
  72. set_property(TEST test_omp_${c}_${d} PROPERTY PASS_REGULAR_EXPRESSION "^[ \t]*70\\.?0*")
  73. endforeach()
  74. endforeach()