Browse Source

Merge topic 'hurd-linker'

c4f64cee36 CMakeParseImplicitLinkInfo: Do not mistake ld.so for a linker
a47283801e hurd: Add GNU linker options
4d1066c578 hurd: Add more GNU options support

Acked-by: Kitware Robot <[email protected]>
Merge-request: !10092
Brad King 1 year ago
parent
commit
265bc4e946

+ 1 - 1
Modules/CMakeParseImplicitLinkInfo.cmake

@@ -61,7 +61,7 @@ function(cmake_parse_implicit_link_info2 text log_var obj_regex)
     endif()
   endif()
   # Parse implicit linker arguments.
-  set(linker "ld[0-9]*(\\.[a-z]+)?")
+  set(linker "ld[0-9]*(|\\.[a-rt-z][a-z]*|\\.s[a-np-z][a-z]*|\\.so[a-z]+)")
   if(is_lfortran_less_0_40)
     # lfortran < 0.40 has no way to pass -v to clang/gcc driver.
     string(APPEND linker "|clang|gcc")

+ 2 - 0
Modules/Platform/GNU-GNU-C.cmake

@@ -0,0 +1,2 @@
+include(Platform/GNU-GNU)
+__gnu_compiler_gnu(C)

+ 2 - 0
Modules/Platform/GNU-GNU-CXX.cmake

@@ -0,0 +1,2 @@
+include(Platform/GNU-GNU)
+__gnu_compiler_gnu(CXX)

+ 3 - 0
Modules/Platform/GNU-GNU-Fortran.cmake

@@ -0,0 +1,3 @@
+include(Platform/GNU-GNU)
+__gnu_compiler_gnu(Fortran)
+set(CMAKE_SHARED_LIBRARY_LINK_Fortran_FLAGS "")

+ 27 - 0
Modules/Platform/GNU-GNU.cmake

@@ -0,0 +1,27 @@
+# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
+# file Copyright.txt or https://cmake.org/licensing for details.
+
+
+# This module is shared by multiple languages; use include blocker.
+if(__GNU_COMPILER_GNU)
+  return()
+endif()
+set(__GNU_COMPILER_GNU 1)
+
+macro(__gnu_compiler_gnu lang)
+  # We pass this for historical reasons.  Projects may have
+  # executables that use dlopen but do not set ENABLE_EXPORTS.
+  set(CMAKE_SHARED_LIBRARY_LINK_${lang}_FLAGS "-rdynamic")
+
+  set(CMAKE_${lang}_VERBOSE_LINK_FLAG "-Wl,-v")
+
+  # linker selection
+  set(CMAKE_${lang}_USING_LINKER_SYSTEM "")
+  set(CMAKE_${lang}_USING_LINKER_LLD "-fuse-ld=lld")
+  set(CMAKE_${lang}_USING_LINKER_BFD "-fuse-ld=bfd")
+  set(CMAKE_${lang}_USING_LINKER_GOLD "-fuse-ld=gold")
+  if(NOT CMAKE_${lang}_COMPILER_ID STREQUAL "GNU"
+      OR CMAKE_${lang}_COMPILER_VERSION VERSION_GREATER_EQUAL "12.1")
+    set(CMAKE_${lang}_USING_LINKER_MOLD "-fuse-ld=mold")
+  endif()
+endmacro()

+ 21 - 0
Modules/Platform/GNU.cmake

@@ -9,6 +9,27 @@ set(CMAKE_SHARED_LIBRARY_RPATH_LINK_C_FLAG "-Wl,-rpath-link,")
 set(CMAKE_SHARED_LIBRARY_SONAME_C_FLAG "-Wl,-soname,")
 set(CMAKE_EXE_EXPORTS_C_FLAG "-Wl,--export-dynamic")
 
+# Shared libraries with no builtin soname may not be linked safely by
+# specifying the file path.
+set(CMAKE_PLATFORM_USES_PATH_WHEN_NO_SONAME 1)
+
+# Initialize C link type selection flags.  These flags are used when
+# building a shared library, shared module, or executable that links
+# to other libraries to select whether to use the static or shared
+# versions of the libraries.
+foreach(type SHARED_LIBRARY SHARED_MODULE EXE)
+  set(CMAKE_${type}_LINK_STATIC_C_FLAGS "-Wl,-Bstatic")
+  set(CMAKE_${type}_LINK_DYNAMIC_C_FLAGS "-Wl,-Bdynamic")
+endforeach()
+
+
+# Features for LINK_GROUP generator expression
+## RESCAN: request the linker to rescan static libraries until there is
+## no pending undefined symbols
+set(CMAKE_LINK_GROUP_USING_RESCAN "LINKER:--start-group" "LINKER:--end-group")
+set(CMAKE_LINK_GROUP_USING_RESCAN_SUPPORTED TRUE)
+
+
 # Debian policy requires that shared libraries be installed without
 # executable permission.  Fedora policy requires that shared libraries
 # be installed with the executable permission.  Since the native tools