# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.

# Function to identify the linker.  This is used internally by CMake and should
# not be included by user code.
# If successful, sets CMAKE_<lang>_COMPILER_LINKER_ID and
# CMAKE_<lang>_COMPILER_LINKER_VERSION

cmake_policy(PUSH)
cmake_policy(SET CMP0053 NEW)
cmake_policy(SET CMP0054 NEW)

function(cmake_determine_linker_id lang linker)
  if (NOT linker)
    # linker was not identified
    unset(CMAKE_${lang}_COMPILER_LINKER_ID PARENT_SCOPE)
    unset(CMAKE_${lang}_COMPILER_LINKER_VERSION PARENT_SCOPE)
    unset(CMAKE_${lang}_COMPILER_LINKER_FRONTEND_VARIANT PARENT_SCOPE)
    return()
  endif()

  set(linker_id)
  set(linker_frontend)
  set(linker_version)

  # Compute the linker ID and version.
  foreach(flags IN ITEMS
      "-v"        # AppleClang, GNU, GNUgold, MOLD
      "-V"        # AIX, Solaris
      "--version" # LLD
      )
    execute_process(COMMAND "${linker}" ${flags}
                    OUTPUT_VARIABLE linker_desc
                    ERROR_VARIABLE linker_desc
                    OUTPUT_STRIP_TRAILING_WHITESPACE
                    ERROR_STRIP_TRAILING_WHITESPACE)

    string(JOIN "\" \"" flags_string ${flags})
    string(REGEX REPLACE "\n\n.*" "" linker_desc_head "${linker_desc}")
    message(CONFIGURE_LOG
      "Running the ${lang} compiler's linker: \"${linker}\" \"${flags_string}\"\n"
      "${linker_desc_head}\n"
      )

    if(CMAKE_EFFECTIVE_SYSTEM_NAME STREQUAL "Apple" AND linker_desc MATCHES "@\\(#\\)PROGRAM:ld.+PROJECT:[a-z0-9]+-([0-9.]+).+")
      set(linker_id "AppleClang")
      set(linker_frontend "GNU")
      set(linker_version "${CMAKE_MATCH_1}")
      break()
    elseif(linker_desc MATCHES "mold \\(sold\\) ([0-9.]+)")
      set(linker_id "MOLD")
      set(linker_frontend "GNU")
      set(linker_version "${CMAKE_MATCH_1}")
      break()
    elseif(linker_desc MATCHES "mold ([0-9.]+)")
      set(linker_id "MOLD")
      set(linker_frontend "GNU")
      set(linker_version "${CMAKE_MATCH_1}")
      break()
    elseif(linker_desc MATCHES "LLD ([0-9.]+)")
      set(linker_id "LLD")
      set(linker_frontend "GNU")
      set(linker_version "${CMAKE_MATCH_1}")
      if(WIN32 AND NOT linker_desc MATCHES "compatible with GNU")
        set(linker_frontend "MSVC")
      endif()
      break()
    elseif(linker_desc MATCHES "GNU ld (\\([^)]+\\)|version) ([0-9.]+)")
      set(linker_id "GNU")
      set(linker_frontend "GNU")
      set(linker_version "${CMAKE_MATCH_2}")
      break()
    elseif(linker_desc MATCHES "GNU gold \\([^)]+\\) ([0-9.]+)")
      set(linker_id "GNUgold")
      set(linker_frontend "GNU")
      set(linker_version "${CMAKE_MATCH_1}")
      break()
    elseif(linker_desc MATCHES "Microsoft \\(R\\) Incremental Linker Version ([0-9.]+)")
      set(linker_id "MSVC")
      set(linker_frontend "MSVC")
      set(linker_version "${CMAKE_MATCH_1}")
      break()
    elseif (CMAKE_SYSTEM_NAME STREQUAL "SunOS" AND linker_desc MATCHES "Solaris Link Editors: ([0-9.-]+)")
      set(linker_id "Solaris")
      set(linker_version "${CMAKE_MATCH_1}")
      break()
    elseif (CMAKE_SYSTEM_NAME STREQUAL "AIX" AND linker_desc MATCHES " LD ([0-9.]+)")
      set(linker_id "AIX")
      set(linker_version "${CMAKE_MATCH_1}")
      break()
    endif()
  endforeach()

  set(CMAKE_${lang}_COMPILER_LINKER_ID "${linker_id}" PARENT_SCOPE)
  if (linker_frontend)
    set(CMAKE_${lang}_COMPILER_LINKER_FRONTEND_VARIANT "${linker_frontend}" PARENT_SCOPE)
  else()
    unset(CMAKE_${lang}_COMPILER_LINKER_FRONTEND_VARIANT PARENT_SCOPE)
  endif()
  if (linker_version)
    set(CMAKE_${lang}_COMPILER_LINKER_VERSION "${linker_version}" PARENT_SCOPE)
  else()
    unset(CMAKE_${lang}_COMPILER_LINKER_VERSION PARENT_SCOPE)
  endif()
endfunction()

cmake_policy(POP)
