From 6b552a3247e285dd5a4b1c21b3afc3f38ce68161 Mon Sep 17 00:00:00 2001 From: Alexander Lanin Date: Mon, 25 Jan 2021 07:51:10 +0100 Subject: [PATCH] Fix fast linker selection for old GCC versions (#788) --- .github/workflows/build.yaml | 6 ++++-- cmake/UseFastestLinker.cmake | 25 +++++++++++++------------ 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index eb7ab387f..fcf15e20c 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -91,10 +91,12 @@ jobs: if [ "${{ runner.os }}" = "Linux" ]; then sudo apt-get update + # Install ld.gold (binutils) and ld.lld on different runs. + # Binding to Ubuntu 20 has no special meaning. if [ "${{ matrix.config.os }}" = "ubuntu-20.04" ]; then - sudo apt-get install -y ninja-build elfutils libzstd-dev + sudo apt-get install -y ninja-build elfutils libzstd-dev lld else - sudo apt-get install -y ninja-build elfutils libzstd1-dev + sudo apt-get install -y ninja-build elfutils libzstd1-dev binutils fi if [ "${{ matrix.config.compiler }}" = "gcc" ]; then diff --git a/cmake/UseFastestLinker.cmake b/cmake/UseFastestLinker.cmake index 8f392aac3..c96639cb1 100644 --- a/cmake/UseFastestLinker.cmake +++ b/cmake/UseFastestLinker.cmake @@ -11,19 +11,20 @@ function(use_fastest_linker) message(WARNING "use_fastest_linker() disabled, as it is not called at the project top level") return() endif() - - find_program(HAS_LD_LLD ld.lld) - if(HAS_LD_LLD) - link_libraries(-fuse-ld=lld) - message_verbose("Using lld linker for faster linking") + + find_program(FASTER_LINKER ld.lld) + if(NOT FASTER_LINKER) + find_program(FASTER_LINKER ld.gold) + endif() + + if(FASTER_LINKER) + # Note: Compiler flag -fuse-ld requires gcc 9 or clang 3.8. + # Instead override CMAKE_CXX_LINK_EXECUTABLE directly. + # By default CMake uses the compiler executable for linking. + set(CMAKE_CXX_LINK_EXECUTABLE "${FASTER_LINKER} -o ") + message_verbose("Using ${FASTER_LINKER} linker for faster linking") else() - find_program(HAS_LD_GOLD ld.gold) - if(HAS_LD_GOLD) - link_libraries(-fuse-ld=gold) - message_verbose("Using gold linker for faster linking") - else() - message_verbose("Using default linker") - endif() + message_verbose("Using default linker") endif() endfunction() -- 2.47.3