CMakeLists.txt 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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. find_package(OpenMP REQUIRED)
  27. foreach(c C CXX Fortran)
  28. if(NOT "${OpenMP_TEST_${c}}")
  29. continue()
  30. endif()
  31. source_code_mapper_helper(${c} main)
  32. add_executable(test_tgt_${c} ${OpenMPTEST_SOURCE_FILE})
  33. target_link_libraries(test_tgt_${c} PRIVATE OpenMP::OpenMP_${c})
  34. set_property(TARGET test_tgt_${c} PROPERTY LINKER_LANGUAGE ${c})
  35. add_test(NAME test_tgt_${c} COMMAND test_tgt_${c})
  36. add_executable(test_var_${c} ${OpenMPTEST_SOURCE_FILE})
  37. separate_arguments(_OpenMP_${c}_OPTIONS NATIVE_COMMAND "${OpenMP_${c}_FLAGS}")
  38. target_compile_options(test_var_${c} PRIVATE "${_OpenMP_${c}_OPTIONS}")
  39. target_link_libraries(test_var_${c} PRIVATE "${OpenMP_${c}_FLAGS}")
  40. set_property(TARGET test_var_${c} PROPERTY LINKER_LANGUAGE ${c})
  41. add_test(NAME test_var_${c} COMMAND test_var_${c})
  42. source_code_mapper_helper(${c} scalprod)
  43. add_library(scalprod_${c} STATIC ${OpenMPTEST_SOURCE_FILE})
  44. target_link_libraries(scalprod_${c} PRIVATE OpenMP::OpenMP_${c})
  45. set_property(TARGET scalprod_${c} PROPERTY LINKER_LANGUAGE ${c})
  46. endforeach()
  47. foreach(c C CXX Fortran)
  48. if(NOT "${OpenMP_TEST_${c}}")
  49. continue()
  50. endif()
  51. foreach(d C CXX Fortran)
  52. if(NOT "${OpenMP_TEST_${d}}")
  53. continue()
  54. endif()
  55. source_code_mapper_helper(${c} scaltest)
  56. add_executable(scaltest_${c}_${d} ${OpenMPTEST_SOURCE_FILE})
  57. target_link_libraries(scaltest_${c}_${d} PRIVATE scalprod_${d})
  58. set_property(TARGET scaltest_${c}_${d} PROPERTY LINKER_LANGUAGE ${c})
  59. add_test(NAME test_omp_${c}_${d} COMMAND scaltest_${c}_${d})
  60. set_property(TEST test_omp_${c}_${d} PROPERTY PASS_REGULAR_EXPRESSION "^[ \t]*70\\.?0*")
  61. endforeach()
  62. endforeach()