CMakeDetermineLinkerId.cmake 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. # Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. # file Copyright.txt or https://cmake.org/licensing for details.
  3. # Function to identify the linker. This is used internally by CMake and should
  4. # not be included by user code.
  5. # If successful, sets CMAKE_<lang>_COMPILER_LINKER_ID and
  6. # CMAKE_<lang>_COMPILER_LINKER_VERSION
  7. function(cmake_determine_linker_id lang linker)
  8. if (NOT linker)
  9. # linker was not identified
  10. unset(CMAKE_${lang}_COMPILER_LINKER_ID PARENT_SCOPE)
  11. unset(CMAKE_${lang}_COMPILER_LINKER_VERSION PARENT_SCOPE)
  12. unset(CMAKE_${lang}_COMPILER_LINKER_FRONTEND_VARIANT PARENT_SCOPE)
  13. return()
  14. endif()
  15. set(linker_id)
  16. set(linker_frontend)
  17. set(linker_version)
  18. # Compute the linker ID and version.
  19. foreach(flags IN ITEMS
  20. "-v" # AppleClang, GNU, GNUgold, MOLD
  21. "-V" # AIX, Solaris
  22. "--version" # LLD
  23. )
  24. execute_process(COMMAND "${linker}" ${flags}
  25. OUTPUT_VARIABLE linker_desc
  26. ERROR_VARIABLE linker_desc
  27. OUTPUT_STRIP_TRAILING_WHITESPACE
  28. ERROR_STRIP_TRAILING_WHITESPACE)
  29. string(JOIN "\" \"" flags_string ${flags})
  30. string(REGEX REPLACE "\n\n.*" "" linker_desc_head "${linker_desc}")
  31. message(CONFIGURE_LOG
  32. "Running the ${lang} compiler's linker: \"${linker}\" \"${flags_string}\"\n"
  33. "${linker_desc_head}\n"
  34. )
  35. if(CMAKE_EFFECTIVE_SYSTEM_NAME STREQUAL "Apple" AND linker_desc MATCHES "@\\(#\\)PROGRAM:ld.+PROJECT:[a-z0-9]+-([0-9.]+).+")
  36. set(linker_id "AppleClang")
  37. set(linker_frontend "GNU")
  38. set(linker_version "${CMAKE_MATCH_1}")
  39. break()
  40. elseif(linker_desc MATCHES "mold \\(sold\\) ([0-9.]+)")
  41. set(linker_id "MOLD")
  42. set(linker_frontend "GNU")
  43. set(linker_version "${CMAKE_MATCH_1}")
  44. break()
  45. elseif(linker_desc MATCHES "mold ([0-9.]+)")
  46. set(linker_id "MOLD")
  47. set(linker_frontend "GNU")
  48. set(linker_version "${CMAKE_MATCH_1}")
  49. break()
  50. elseif(linker_desc MATCHES "LLD ([0-9.]+)")
  51. set(linker_id "LLD")
  52. set(linker_frontend "GNU")
  53. set(linker_version "${CMAKE_MATCH_1}")
  54. if(WIN32 AND NOT linker_desc MATCHES "compatible with GNU")
  55. set(linker_frontend "MSVC")
  56. endif()
  57. break()
  58. elseif(linker_desc MATCHES "GNU ld (\\([^)]+\\)|version) ([0-9.]+)")
  59. set(linker_id "GNU")
  60. set(linker_frontend "GNU")
  61. set(linker_version "${CMAKE_MATCH_2}")
  62. break()
  63. elseif(linker_desc MATCHES "GNU gold \\([^)]+\\) ([0-9.]+)")
  64. set(linker_id "GNUgold")
  65. set(linker_frontend "GNU")
  66. set(linker_version "${CMAKE_MATCH_1}")
  67. break()
  68. elseif(linker_desc MATCHES "Microsoft \\(R\\) Incremental Linker Version ([0-9.]+)")
  69. set(linker_id "MSVC")
  70. set(linker_frontend "MSVC")
  71. set(linker_version "${CMAKE_MATCH_1}")
  72. break()
  73. elseif (CMAKE_SYSTEM_NAME STREQUAL "SunOS" AND linker_desc MATCHES "Solaris Link Editors: ([0-9.-]+)")
  74. set(linker_id "Solaris")
  75. set(linker_version "${CMAKE_MATCH_1}")
  76. break()
  77. elseif (CMAKE_SYSTEM_NAME STREQUAL "AIX" AND linker_desc MATCHES " LD ([0-9.]+)")
  78. set(linker_id "AIX")
  79. set(linker_version "${CMAKE_MATCH_1}")
  80. break()
  81. endif()
  82. endforeach()
  83. set(CMAKE_${lang}_COMPILER_LINKER_ID "${linker_id}" PARENT_SCOPE)
  84. if (linker_frontend)
  85. set(CMAKE_${lang}_COMPILER_LINKER_FRONTEND_VARIANT "${linker_frontend}" PARENT_SCOPE)
  86. else()
  87. unset(CMAKE_${lang}_COMPILER_LINKER_FRONTEND_VARIANT PARENT_SCOPE)
  88. endif()
  89. if (linker_version)
  90. set(CMAKE_${lang}_COMPILER_LINKER_VERSION "${linker_version}" PARENT_SCOPE)
  91. else()
  92. unset(CMAKE_${lang}_COMPILER_LINKER_VERSION PARENT_SCOPE)
  93. endif()
  94. endfunction()