Merge topic 'Linux-deduplication-static-libs'
0445190d2f
LLD linker: avoid regression on archive libraries deduplication
Acked-by: Kitware Robot <kwrobot@kitware.com>
Acked-by: buildbot <buildbot@kitware.com>
Merge-request: !10010
This commit is contained in:
commit
af3a48a591
@ -6,5 +6,6 @@
|
||||
include_guard()
|
||||
|
||||
macro(__aix_linker_aix lang)
|
||||
set(CMAKE_${lang}_PLATFORM_LINKER_ID AIX)
|
||||
set(CMAKE_${lang}_LINK_LIBRARIES_PROCESSING ORDER=REVERSE DEDUPLICATION=ALL)
|
||||
endmacro()
|
||||
|
@ -6,6 +6,7 @@
|
||||
include_guard()
|
||||
|
||||
macro(__apple_linker_appleclang lang)
|
||||
set(CMAKE_${lang}_PLATFORM_LINKER_ID AppleClang)
|
||||
set(CMAKE_${lang}_LINK_LIBRARIES_PROCESSING ORDER=REVERSE DEDUPLICATION=ALL)
|
||||
|
||||
# Features for LINK_LIBRARY generator expression
|
||||
|
@ -2,3 +2,5 @@
|
||||
# file Copyright.txt or https://cmake.org/licensing for details.
|
||||
|
||||
include(Platform/Linker/Apple-AppleClang-C)
|
||||
|
||||
set(CMAKE_C_PLATFORM_LINKER_ID LLD)
|
||||
|
@ -2,3 +2,5 @@
|
||||
# file Copyright.txt or https://cmake.org/licensing for details.
|
||||
|
||||
include(Platform/Linker/Apple-AppleClang-CXX)
|
||||
|
||||
set(CMAKE_CXX_PLATFORM_LINKER_ID LLD)
|
||||
|
@ -2,3 +2,5 @@
|
||||
# file Copyright.txt or https://cmake.org/licensing for details.
|
||||
|
||||
include(Platform/Linker/Apple-AppleClang-OBJC)
|
||||
|
||||
set(CMAKE_OBJC_PLATFORM_LINKER_ID LLD)
|
||||
|
@ -2,3 +2,5 @@
|
||||
# file Copyright.txt or https://cmake.org/licensing for details.
|
||||
|
||||
include(Platform/Linker/Apple-AppleClang-OBJCXX)
|
||||
|
||||
set(CMAKE_OBJCXX_PLATFORM_LINKER_ID LLD)
|
||||
|
@ -2,3 +2,5 @@
|
||||
# file Copyright.txt or https://cmake.org/licensing for details.
|
||||
|
||||
include(Platform/Linker/Apple-AppleClang-C)
|
||||
|
||||
set(CMAKE_C_PLATFORM_LINKER_ID MOLD)
|
||||
|
@ -2,3 +2,5 @@
|
||||
# file Copyright.txt or https://cmake.org/licensing for details.
|
||||
|
||||
include(Platform/Linker/Apple-AppleClang-CXX)
|
||||
|
||||
set(CMAKE_CXX_PLATFORM_LINKER_ID MOLD)
|
||||
|
@ -2,3 +2,5 @@
|
||||
# file Copyright.txt or https://cmake.org/licensing for details.
|
||||
|
||||
include(Platform/Linker/Apple-AppleClang-OBJC)
|
||||
|
||||
set(CMAKE_OBJC_PLATFORM_LINKER_ID MOLD)
|
||||
|
@ -2,3 +2,5 @@
|
||||
# file Copyright.txt or https://cmake.org/licensing for details.
|
||||
|
||||
include(Platform/Linker/Apple-AppleClang-OBJCXX)
|
||||
|
||||
set(CMAKE_OBJCXX_PLATFORM_LINKER_ID MOLD)
|
||||
|
@ -8,6 +8,7 @@ include_guard()
|
||||
include(Platform/Linker/GNU)
|
||||
|
||||
macro(__cygwin_linker_gnu lang)
|
||||
set(CMAKE_${lang}_PLATFORM_LINKER_ID GNU)
|
||||
if(CMAKE_${lang}_COMPILER_LINKER)
|
||||
__cmake_set_whole_archive_feature("${CMAKE_${lang}_COMPILER_LINKER}" "${lang}")
|
||||
endif()
|
||||
|
@ -12,5 +12,6 @@ include(Platform/Linker/CYGWIN-GNU)
|
||||
macro(__cygwin_linker_lld lang)
|
||||
__cygwin_linker_gnu(${lang})
|
||||
|
||||
set(CMAKE_${lang}_PLATFORM_LINKER_ID LLD)
|
||||
set(CMAKE_${lang}_LINK_LIBRARIES_PROCESSING ORDER=REVERSE DEDUPLICATION=ALL)
|
||||
endmacro()
|
||||
|
@ -8,6 +8,7 @@ include_guard()
|
||||
include(Platform/Linker/GNU)
|
||||
|
||||
macro(__freebsd_linker_gnu lang)
|
||||
set(CMAKE_${lang}_PLATFORM_LINKER_ID GNU)
|
||||
if(CMAKE_${lang}_COMPILER_LINKER)
|
||||
__cmake_set_whole_archive_feature("${CMAKE_${lang}_COMPILER_LINKER}" "${lang}")
|
||||
endif()
|
||||
|
@ -12,5 +12,6 @@ include(Platform/Linker/FreeBSD-GNU)
|
||||
macro(__freebsd_linker_lld lang)
|
||||
__freebsd_linker_gnu(${lang})
|
||||
|
||||
set(CMAKE_${lang}_PLATFORM_LINKER_ID LLD)
|
||||
set(CMAKE_${lang}_LINK_LIBRARIES_PROCESSING ORDER=REVERSE DEDUPLICATION=ALL)
|
||||
endmacro()
|
||||
|
@ -8,6 +8,7 @@ include_guard()
|
||||
include(Platform/Linker/GNU)
|
||||
|
||||
macro(__gnu_linker_gnu lang)
|
||||
set(CMAKE_${lang}_PLATFORM_LINKER_ID GNU)
|
||||
if(CMAKE_${lang}_COMPILER_LINKER)
|
||||
__cmake_set_whole_archive_feature("${CMAKE_${lang}_COMPILER_LINKER}" "${lang}")
|
||||
endif()
|
||||
|
@ -8,6 +8,7 @@ include_guard()
|
||||
include(Platform/Linker/GNU)
|
||||
|
||||
macro(__linux_linker_gnu lang)
|
||||
set(CMAKE_${lang}_PLATFORM_LINKER_ID GNU)
|
||||
if(CMAKE_${lang}_COMPILER_LINKER)
|
||||
__cmake_set_whole_archive_feature("${CMAKE_${lang}_COMPILER_LINKER}" "${lang}")
|
||||
endif()
|
||||
|
@ -2,3 +2,5 @@
|
||||
# file Copyright.txt or https://cmake.org/licensing for details.
|
||||
|
||||
include(Platform/Linker/Linux-GNU-ASM)
|
||||
|
||||
set(CMAKE_ASM_PLATFORM_LINKER_ID GNUgold)
|
||||
|
@ -2,3 +2,5 @@
|
||||
# file Copyright.txt or https://cmake.org/licensing for details.
|
||||
|
||||
include(Platform/Linker/Linux-GNU-C)
|
||||
|
||||
set(CMAKE_C_PLATFORM_LINKER_ID GNUgold)
|
||||
|
@ -2,3 +2,5 @@
|
||||
# file Copyright.txt or https://cmake.org/licensing for details.
|
||||
|
||||
include(Platform/Linker/Linux-GNU-CUDA)
|
||||
|
||||
set(CMAKE_CUDA_PLATFORM_LINKER_ID GNUgold)
|
||||
|
@ -2,3 +2,5 @@
|
||||
# file Copyright.txt or https://cmake.org/licensing for details.
|
||||
|
||||
include(Platform/Linker/Linux-GNU-CXX)
|
||||
|
||||
set(CMAKE_CXX_PLATFORM_LINKER_ID GNUgold)
|
||||
|
@ -2,3 +2,5 @@
|
||||
# file Copyright.txt or https://cmake.org/licensing for details.
|
||||
|
||||
include(Platform/Linker/Linux-GNU-Fortran)
|
||||
|
||||
set(CMAKE_Fortran_PLATFORM_LINKER_ID GNUgold)
|
||||
|
@ -2,3 +2,5 @@
|
||||
# file Copyright.txt or https://cmake.org/licensing for details.
|
||||
|
||||
include(Platform/Linker/Linux-GNU-HIP)
|
||||
|
||||
set(CMAKE_HIP_PLATFORM_LINKER_ID GNUgold)
|
||||
|
@ -12,5 +12,6 @@ include(Platform/Linker/Linux-GNU)
|
||||
macro(__linux_linker_lld lang)
|
||||
__linux_linker_gnu(${lang})
|
||||
|
||||
set(CMAKE_${lang}_PLATFORM_LINKER_ID LLD)
|
||||
set(CMAKE_${lang}_LINK_LIBRARIES_PROCESSING ORDER=REVERSE DEDUPLICATION=ALL)
|
||||
endmacro()
|
||||
|
@ -12,5 +12,7 @@ include(Platform/Linker/Linux-GNU)
|
||||
macro(__linux_linker_mold lang)
|
||||
__linux_linker_gnu(${lang})
|
||||
|
||||
|
||||
set(CMAKE_C_PLATFORM_LINKER_ID MOLD)
|
||||
set(CMAKE_${lang}_LINK_LIBRARIES_PROCESSING ORDER=REVERSE DEDUPLICATION=ALL)
|
||||
endmacro()
|
||||
|
@ -8,6 +8,7 @@ include_guard()
|
||||
include(Platform/Linker/GNU)
|
||||
|
||||
macro(__netbsd_linker_gnu lang)
|
||||
set(CMAKE_${lang}_PLATFORM_LINKER_ID GNU)
|
||||
if(CMAKE_${lang}_COMPILER_LINKER)
|
||||
__cmake_set_whole_archive_feature("${CMAKE_${lang}_COMPILER_LINKER}" "${lang}")
|
||||
endif()
|
||||
|
@ -8,6 +8,7 @@ include_guard()
|
||||
include(Platform/Linker/GNU)
|
||||
|
||||
macro(__openbsd_linker_gnu lang)
|
||||
set(CMAKE_${lang}_PLATFORM_LINKER_ID GNU)
|
||||
if(CMAKE_${lang}_COMPILER_LINKER)
|
||||
__cmake_set_whole_archive_feature("${CMAKE_${lang}_COMPILER_LINKER}" "${lang}")
|
||||
endif()
|
||||
|
@ -12,5 +12,6 @@ include(Platform/Linker/OpenBSD-GNU)
|
||||
macro(__openbsd_linker_lld lang)
|
||||
__openbsd_linker_gnu(${lang})
|
||||
|
||||
set(CMAKE_${lang}_PLATFORM_LINKER_ID LLD)
|
||||
set(CMAKE_${lang}_LINK_LIBRARIES_PROCESSING ORDER=REVERSE DEDUPLICATION=ALL)
|
||||
endmacro()
|
||||
|
@ -8,6 +8,7 @@ include_guard()
|
||||
include(Platform/Linker/GNU)
|
||||
|
||||
macro(__serenityos_linker_gnu lang)
|
||||
set(CMAKE_${lang}_PLATFORM_LINKER_ID GNU)
|
||||
if(CMAKE_${lang}_COMPILER_LINKER)
|
||||
__cmake_set_whole_archive_feature("${CMAKE_${lang}_COMPILER_LINKER}" "${lang}")
|
||||
endif()
|
||||
|
@ -12,5 +12,6 @@ include(Platform/Linker/SerenityOS-GNU)
|
||||
macro(__serenityos_linker_lld lang)
|
||||
__serenityos_linker_gnu(${lang})
|
||||
|
||||
set(CMAKE_${lang}_PLATFORM_LINKER_ID LLD)
|
||||
set(CMAKE_${lang}_LINK_LIBRARIES_PROCESSING ORDER=REVERSE DEDUPLICATION=ALL)
|
||||
endmacro()
|
||||
|
@ -8,6 +8,7 @@ include_guard()
|
||||
include(Platform/Linker/GNU)
|
||||
|
||||
macro(__sunos_linker_gnu lang)
|
||||
set(CMAKE_${lang}_PLATFORM_LINKER_ID GNU)
|
||||
if(CMAKE_${lang}_COMPILER_LINKER)
|
||||
__cmake_set_whole_archive_feature("${CMAKE_${lang}_COMPILER_LINKER}" "${lang}")
|
||||
endif()
|
||||
|
@ -9,6 +9,7 @@ block(SCOPE_FOR POLICIES)
|
||||
cmake_policy(SET CMP0054 NEW)
|
||||
|
||||
macro(__sunos_linker_solaris lang)
|
||||
set(CMAKE_${lang}_PLATFORM_LINKER_ID Solaris)
|
||||
# Features for LINK_LIBRARY generator expression
|
||||
## WHOLE_ARCHIVE: Force loading all members of an archive
|
||||
if (CMAKE_SYSTEM_VERSION VERSION_GREATER "5.10")
|
||||
|
@ -8,6 +8,7 @@ include_guard()
|
||||
include(Platform/Linker/GNU)
|
||||
|
||||
macro(__windows_linker_gnu lang)
|
||||
set(CMAKE_${lang}_PLATFORM_LINKER_ID GNU)
|
||||
if(CMAKE_${lang}_COMPILER_LINKER)
|
||||
__cmake_set_whole_archive_feature("${CMAKE_${lang}_COMPILER_LINKER}" "${lang}")
|
||||
endif()
|
||||
|
@ -9,6 +9,7 @@ block(SCOPE_FOR POLICIES)
|
||||
cmake_policy(SET CMP0054 NEW)
|
||||
|
||||
macro(__windows_linker_lld lang)
|
||||
set(CMAKE_${lang}_PLATFORM_LINKER_ID LLD)
|
||||
# Features for LINK_LIBRARY generator expression
|
||||
if(CMAKE_${lang}_COMPILER_LINKER_FRONTEND_VARIANT STREQUAL "GNU")
|
||||
include(Platform/Linker/Windows-GNU)
|
||||
|
@ -17,6 +17,7 @@ if(MSVC_VERSION GREATER "1900")
|
||||
endif()
|
||||
|
||||
macro(__windows_linker_msvc lang)
|
||||
set(CMAKE_${lang}_PLATFORM_LINKER_ID MSVC)
|
||||
set(CMAKE_${lang}_LINK_LIBRARIES_PROCESSING ORDER=FORWARD DEDUPLICATION=ALL)
|
||||
|
||||
# Features for LINK_LIBRARY generator expression
|
||||
|
@ -429,6 +429,15 @@ public:
|
||||
"_LINK_LIBRARIES_PROCESSING':\n", errorMessage),
|
||||
target->GetBacktrace());
|
||||
}
|
||||
// For some environments, deduplication should be activated only if
|
||||
// both policies CMP0156 and CMP0179 are NEW
|
||||
if (makefile->GetDefinition(cmStrCat(
|
||||
"CMAKE_", linkLanguage, "_PLATFORM_LINKER_ID")) == "LLD"_s &&
|
||||
makefile->GetDefinition("CMAKE_EXECUTABLE_FORMAT") == "ELF"_s &&
|
||||
target->GetPolicyStatusCMP0179() != cmPolicies::NEW &&
|
||||
this->Deduplication == All) {
|
||||
this->Deduplication = Shared;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3,6 +3,8 @@ enable_language(C)
|
||||
set(info "")
|
||||
foreach(var
|
||||
CMAKE_C_LINK_LIBRARIES_PROCESSING
|
||||
CMAKE_C_PLATFORM_LINKER_ID
|
||||
CMAKE_EXECUTABLE_FORMAT
|
||||
)
|
||||
if(DEFINED ${var})
|
||||
string(APPEND info "set(${var} \"${${var}}\")\n")
|
||||
|
@ -10,13 +10,15 @@ endif()
|
||||
|
||||
# Detect information from the toolchain:
|
||||
# - CMAKE_C_LINK_LIBRARIES_PROCESSING
|
||||
# - CMAKE_C_PLATFORM_LINKER_ID
|
||||
# - CMAKE_EXECUTABLE_FORMAT
|
||||
run_cmake(Inspect)
|
||||
include("${RunCMake_BINARY_DIR}/Inspect-build/info.cmake")
|
||||
|
||||
run_cmake(Unknown)
|
||||
|
||||
function(run_strategy case exe)
|
||||
foreach(cmp0179 OLD NEW)
|
||||
foreach(cmp0179 ${cmp0179_states})
|
||||
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${case}-CMP0179-${cmp0179}-build)
|
||||
set(RunCMake_TEST_VARIANT_DESCRIPTION "...CMP0179-${cmp0179}")
|
||||
if("DEDUPLICATION=ALL" IN_LIST CMAKE_C_LINK_LIBRARIES_PROCESSING)
|
||||
@ -44,6 +46,13 @@ function(run_strategy case exe)
|
||||
endforeach()
|
||||
endfunction()
|
||||
|
||||
if(CMAKE_C_PLATFORM_LINKER_ID STREQUAL "LLD" AND CMAKE_EXECUTABLE_FORMAT STREQUAL "ELF")
|
||||
# deduplication done only if both CMP0156 and CMP0179 ARE NEW
|
||||
set(cmp0179_states NEW)
|
||||
else()
|
||||
set(cmp0179_states OLD NEW)
|
||||
endif()
|
||||
|
||||
run_strategy(Basic-REORDER_MINIMALLY "main")
|
||||
run_strategy(Basic-REORDER_FREELY "main")
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user