# Guard against multiple inclusions
if(__craylinux_crayprgenv)
  return()
endif()
set(__craylinux_crayprgenv 1)

macro(__cray_extract_args cmd tag_regex out_var make_absolute)
  string(REGEX MATCHALL "${tag_regex}" args "${cmd}")
  foreach(arg IN LISTS args)
    string(REGEX REPLACE "^${tag_regex}$" "\\2" param "${arg}")
    if(make_absolute)
      get_filename_component(param "${param}" ABSOLUTE)
    endif()
    list(APPEND ${out_var} ${param})
  endforeach()
endmacro()

function(__cray_extract_implicit src compiler_cmd link_cmd lang include_dirs_var link_dirs_var link_libs_var)
  set(BIN "${CMAKE_PLATFORM_INFO_DIR}/CrayExtractImplicit_${lang}.bin")
  execute_process(
    COMMAND ${CMAKE_${lang}_COMPILER} ${CMAKE_${lang}_VERBOSE_FLAG} -o ${BIN}
    RESULT_VARIABLE result
    OUTPUT_VARIABLE output
    ERROR_VARIABLE error
    )
  if(EXISTS "${BIN}")
    file(REMOVE "${BIN}")
  endif()
  set(include_dirs)
  set(link_dirs)
  set(link_libs)
  string(REGEX REPLACE "\r?\n" ";" output_lines "${output}\n${error}")
  foreach(line IN LISTS output_lines)
    if("${line}" MATCHES "${compiler_cmd}")
      __cray_extract_args("${line}" " -(I ?|isystem )([^ ]*)" include_dirs 1)
      set(processed_include 1)
    endif()
    if("${line}" MATCHES "${link_cmd}")
      __cray_extract_args("${line}" " -(L ?)([^ ]*)" link_dirs 1)
      __cray_extract_args("${line}" " -(l ?)([^ ]*)" link_libs 0)
      set(processed_link 1)
    endif()
    if(processed_include AND processed_link)
      break()
    endif()
  endforeach()

  set(${include_dirs_var} "${include_dirs}" PARENT_SCOPE)
  set(${link_dirs_var}    "${link_dirs}" PARENT_SCOPE)
  set(${link_libs_var}    "${link_libs}" PARENT_SCOPE)
  set(CRAY_${lang}_EXTRACTED_IMPLICIT 1 CACHE INTERNAL "" FORCE)
endfunction()

macro(__CrayPrgEnv_setup lang test_src compiler_cmd link_cmd)
  if(DEFINED ENV{CRAYPE_VERSION})
    message(STATUS "Cray Programming Environment $ENV{CRAYPE_VERSION} ${lang}")
  elseif(DEFINED ENV{ASYNCPE_VERSION})
    message(STATUS "Cray XT Programming Environment $ENV{ASYNCPE_VERSION} ${lang}")
  else()
    message(STATUS "Cray Programming Environment (unknown version) ${lang}")
  endif()

  # Flags for the Cray wrappers
  set(CMAKE_STATIC_LIBRARY_LINK_${lang}_FLAGS "-static")
  set(CMAKE_SHARED_LIBRARY_CREATE_${lang}_FLAGS "-shared")
  set(CMAKE_SHARED_LIBRARY_LINK_${lang}_FLAGS "-dynamic")

  # If the link type is not explicitly specified in the environment then
  # the Cray wrappers assume that the code will be built statically so
  # we check the following condition(s) are NOT met
  #  Compiler flags are explicitly dynamic
  #  Env var is dynamic and compiler flags are not explicitly static
  if(NOT (((CMAKE_${lang}_FLAGS MATCHES "(^| )-dynamic($| )") OR
         (CMAKE_EXE_LINKER_FLAGS MATCHES "(^| )-dynamic($| )"))
         OR
         (("$ENV{CRAYPE_LINK_TYPE}" STREQUAL "dynamic") AND
          NOT ((CMAKE_${lang}_FLAGS MATCHES "(^| )-static($| )") OR
               (CMAKE_EXE_LINKER_FLAGS MATCHES "(^| )-static($| )")))))
    set_property(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS FALSE)
    set(BUILD_SHARED_LIBS FALSE CACHE BOOL "")
    set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
    set(CMAKE_LINK_SEARCH_START_STATIC TRUE)
  endif()
  if(NOT CRAY_${lang}_EXTRACTED_IMPLICIT)
    __cray_extract_implicit(
      ${test_src} ${compiler_cmd} ${link_cmd} ${lang}
      CMAKE_${lang}_IMPLICIT_INCLUDE_DIRECTORIES
      CMAKE_${lang}_IMPLICIT_LINK_DIRECTORIES
      CMAKE_${lang}_IMPLICIT_LINK_LIBRARIES
      )
  endif()
endmacro()
