CMakeDetermineLinkerId.cmake 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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. cmake_policy(PUSH)
  8. cmake_policy(SET CMP0053 NEW)
  9. cmake_policy(SET CMP0054 NEW)
  10. function(cmake_determine_linker_id lang linker)
  11. if (NOT linker)
  12. # linker was not identified
  13. unset(CMAKE_${lang}_COMPILER_LINKER_ID PARENT_SCOPE)
  14. unset(CMAKE_${lang}_COMPILER_LINKER_VERSION PARENT_SCOPE)
  15. unset(CMAKE_${lang}_COMPILER_LINKER_FRONTEND_VARIANT PARENT_SCOPE)
  16. return()
  17. endif()
  18. set(linker_id)
  19. set(linker_frontend)
  20. set(linker_version)
  21. # Compute the linker ID and version.
  22. foreach(flags IN ITEMS
  23. "-v" # AppleClang, GNU, GNUgold, MOLD
  24. "-V" # AIX, Solaris
  25. "--version" # LLD
  26. )
  27. execute_process(COMMAND "${linker}" ${flags}
  28. OUTPUT_VARIABLE linker_desc
  29. ERROR_VARIABLE linker_desc
  30. OUTPUT_STRIP_TRAILING_WHITESPACE
  31. ERROR_STRIP_TRAILING_WHITESPACE)
  32. if(CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND linker_desc MATCHES "@\\(#\\)PROGRAM:ld.+PROJECT:[a-z0-9]+-([0-9.]+).+")
  33. set(linker_id "AppleClang")
  34. set(linker_frontend "GNU")
  35. set(linker_version "${CMAKE_MATCH_1}")
  36. break()
  37. elseif(linker_desc MATCHES "mold \\(sold\\) ([0-9.]+)")
  38. set(linker_id "MOLD")
  39. set(linker_frontend "GNU")
  40. set(linker_version "${CMAKE_MATCH_1}")
  41. break()
  42. elseif(linker_desc MATCHES "mold ([0-9.]+)")
  43. set(linker_id "MOLD")
  44. set(linker_frontend "GNU")
  45. set(linker_version "${CMAKE_MATCH_1}")
  46. break()
  47. elseif(linker_desc MATCHES "LLD ([0-9.]+)")
  48. set(linker_id "LLD")
  49. set(linker_frontend "GNU")
  50. set(linker_version "${CMAKE_MATCH_1}")
  51. if(WIN32 AND NOT linker_desc MATCHES "compatible with GNU")
  52. set(linker_frontend "MSVC")
  53. endif()
  54. break()
  55. elseif(linker_desc MATCHES "GNU ld \\([^)]+\\) ([0-9.]+)")
  56. set(linker_id "GNU")
  57. set(linker_frontend "GNU")
  58. set(linker_version "${CMAKE_MATCH_1}")
  59. break()
  60. elseif(linker_desc MATCHES "GNU gold \\([^)]+\\) ([0-9.]+)")
  61. set(linker_id "GNUgold")
  62. set(linker_frontend "GNU")
  63. set(linker_version "${CMAKE_MATCH_1}")
  64. break()
  65. elseif(linker_desc MATCHES "Microsoft \\(R\\) Incremental Linker Version ([0-9.]+)")
  66. set(linker_id "MSVC")
  67. set(linker_frontend "MSVC")
  68. set(linker_version "${CMAKE_MATCH_1}")
  69. break()
  70. elseif (CMAKE_SYSTEM_NAME STREQUAL "SunOS" AND linker_desc MATCHES "Solaris Link Editors: ([0-9.-]+)")
  71. set(linker_id "Solaris")
  72. set(linker_version "${CMAKE_MATCH_1}")
  73. break()
  74. elseif (CMAKE_SYSTEM_NAME STREQUAL "AIX" AND linker_desc MATCHES " LD ([0-9.]+)")
  75. set(linker_id "AIX")
  76. set(linker_version "${CMAKE_MATCH_1}")
  77. break()
  78. endif()
  79. endforeach()
  80. if(NOT linker_id)
  81. # unknown linker
  82. set(linker_id "UNKNOWN")
  83. endif()
  84. set(CMAKE_${lang}_COMPILER_LINKER_ID "${linker_id}" PARENT_SCOPE)
  85. if (linker_frontend)
  86. set(CMAKE_${lang}_COMPILER_LINKER_FRONTEND_VARIANT "${linker_frontend}" PARENT_SCOPE)
  87. else()
  88. unset(CMAKE_${lang}_COMPILER_LINKER_FRONTEND_VARIANT PARENT_SCOPE)
  89. endif()
  90. if (linker_version)
  91. set(CMAKE_${lang}_COMPILER_LINKER_VERSION "${linker_version}" PARENT_SCOPE)
  92. else()
  93. unset(CMAKE_${lang}_COMPILER_LINKER_VERSION PARENT_SCOPE)
  94. endif()
  95. endfunction()
  96. cmake_policy(POP)