CMake: Fix detection of linker availability

Previously we passed flags like -ld-fuse=lld only to compile
calls, but not to the link call of a compile test project.

Make sure to pass it to the link call instead by using
check_cxx_source_compiles + CMAKE_REQUIRED_LINK_OPTIONS
instead of
check_cxx_compiler_flag.

Note the flag that is passed is still via passed via the
compiler launcher and not directly to the linker.

Remove duplicate flag handling code.

Pick-to: 6.2 6.3
Change-Id: I1bf90573904a9df83240b6debfee3cc9e425c6bb
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
This commit is contained in:
Alexandru Croitor 2021-12-16 18:51:31 +01:00
parent 461f68c5c9
commit d6066d53fa
4 changed files with 39 additions and 19 deletions

View File

@ -1118,6 +1118,33 @@ function(qt_config_compiler_supports_flag_test name)
set(TEST_${name} "${TEST_${name}}" CACHE INTERNAL "${label}")
endfunction()
function(qt_internal_get_active_linker_flags out_var)
set(flags "")
if(GCC OR CLANG)
if(QT_FEATURE_use_gold_linker)
list(APPEND flags "-fuse-ld=gold")
elseif(QT_FEATURE_use_bfd_linker)
list(APPEND flags "-fuse-ld=bfd")
elseif(QT_FEATURE_use_lld_linker)
list(APPEND flags "-fuse-ld=lld")
endif()
endif()
set(${out_var} "${flags}" PARENT_SCOPE)
endfunction()
function(qt_internal_check_if_linker_is_available name)
if(DEFINED "TEST_${name}")
return()
endif()
cmake_parse_arguments(arg "" "LABEL;FLAG" "" ${ARGN})
set(flags "${arg_FLAG}")
set(CMAKE_REQUIRED_LINK_OPTIONS ${flags})
check_cxx_source_compiles("int main() { return 0; }" TEST_${name})
set(TEST_${name} "${TEST_${name}}" CACHE INTERNAL "${label}")
endfunction()
function(qt_config_linker_supports_flag_test name)
if(DEFINED "TEST_${name}")
return()
@ -1126,15 +1153,10 @@ function(qt_config_linker_supports_flag_test name)
cmake_parse_arguments(arg "" "LABEL;FLAG" "" ${ARGN})
set(flags "-Wl,${arg_FLAG}")
# Select the right linker.
if(GCC OR CLANG)
if(QT_FEATURE_use_gold_linker)
list(PREPEND flags "-fuse-ld=gold")
elseif(QT_FEATURE_use_bfd_linker)
list(PREPEND flags "-fuse-ld=bfd")
elseif(QT_FEATURE_use_lld_linker)
list(PREPEND flags "-fuse-ld=lld")
endif()
# Pass the linker that the main project uses to the compile test.
qt_internal_get_active_linker_flags(linker_flags)
if(linker_flags)
list(PREPEND flags ${linker_flags})
endif()
set(CMAKE_REQUIRED_LINK_OPTIONS ${flags})

View File

@ -248,13 +248,11 @@ if(DEFINED QT_EXTRA_FRAMEWORKPATHS AND APPLE)
unset(__qt_fw_flags)
endif()
if(QT_FEATURE_use_gold_linker)
target_link_options(PlatformCommonInternal INTERFACE "-fuse-ld=gold")
elseif(QT_FEATURE_use_bfd_linker)
target_link_options(PlatformCommonInternal INTERFACE "-fuse-ld=bfd")
elseif(QT_FEATURE_use_lld_linker)
target_link_options(PlatformCommonInternal INTERFACE "-fuse-ld=lld")
qt_internal_get_active_linker_flags(__qt_internal_active_linker_flags)
if(__qt_internal_active_linker_flags)
target_link_options(PlatformCommonInternal INTERFACE "${__qt_internal_active_linker_flags}")
endif()
unset(__qt_internal_active_linker_flags)
if(QT_FEATURE_enable_gdb_index)
target_link_options(PlatformCommonInternal INTERFACE "-Wl,--gdb-index")

View File

@ -151,7 +151,7 @@ defstub(qt_find_package)
defstub(set_package_properties)
defstub(qt_qml_find_python)
defstub(qt_set01)
defstub(qt_internal_check_if_linker_is_available)
####################################################################################################
# Define functions/macros that are called in qt_cmdline.cmake files

View File

@ -24,17 +24,17 @@ qt_find_package(Libudev PROVIDED_TARGETS PkgConfig::Libudev MODULE_NAME global Q
#### Early-evaluated, Linker-related Tests and Features
qt_config_compiler_supports_flag_test(use_bfd_linker
qt_internal_check_if_linker_is_available(use_bfd_linker
LABEL "bfd linker"
FLAG "-fuse-ld=bfd"
)
qt_config_compiler_supports_flag_test(use_gold_linker
qt_internal_check_if_linker_is_available(use_gold_linker
LABEL "gold linker"
FLAG "-fuse-ld=gold"
)
qt_config_compiler_supports_flag_test(use_lld_linker
qt_internal_check_if_linker_is_available(use_lld_linker
LABEL "lld linker"
FLAG "-fuse-ld=lld"
)