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()
