From 46f6c5d0055c05941d68a7255d35b3eaba9d7de3 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Mon, 10 Aug 2020 10:36:34 -0700 Subject: [PATCH] CMake: require no undefined symbols The ELF default is historical legacy. We should always require all libraries and all plugins to link to their dependencies and not accidentally forget something (like implementing a virtual function). Change-Id: I5e00996d7f4b4a10bc98fffd1629f8bfcf0d1c8f Reviewed-by: Qt CI Bot Reviewed-by: Cristian Adam Reviewed-by: Lars Knoll --- cmake/QtCreatorAPI.cmake | 1 + cmake/QtCreatorAPIInternal.cmake | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/cmake/QtCreatorAPI.cmake b/cmake/QtCreatorAPI.cmake index c4f8d1f0a6c..7a390b1ad97 100644 --- a/cmake/QtCreatorAPI.cmake +++ b/cmake/QtCreatorAPI.cmake @@ -244,6 +244,7 @@ function(add_qtc_library name) unset(NAMELINK_OPTION) if (library_type STREQUAL "SHARED") set(NAMELINK_OPTION NAMELINK_SKIP) + qtc_add_link_flags_no_undefined(${name}) endif() unset(COMPONENT_OPTION) diff --git a/cmake/QtCreatorAPIInternal.cmake b/cmake/QtCreatorAPIInternal.cmake index d7bef93491f..5257d5bf6bb 100644 --- a/cmake/QtCreatorAPIInternal.cmake +++ b/cmake/QtCreatorAPIInternal.cmake @@ -4,6 +4,7 @@ if (CMAKE_VERSION VERSION_LESS 3.18) endif() endif() +include(CheckLinkerFlag) include(FeatureSummary) # @@ -161,6 +162,19 @@ function(qtc_enable_sanitize _sanitize_flags) set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}" PARENT_SCOPE) endfunction() +function(qtc_add_link_flags_no_undefined target) + set(no_undefined_flag "-Wl,--no-undefined") + check_linker_flag(CXX ${no_undefined_flag} QTC_LINKER_SUPPORTS_NO_UNDEFINED) + if (NOT QTC_LINKER_SUPPORTS_NO_UNDEFINED) + set(no_undefined_flag "-Wl,-undefined,error") + check_linker_flag(CXX ${no_undefined_flag} QTC_LINKER_SUPPORTS_UNDEFINED_ERROR) + if (NOT QTC_LINKER_SUPPORTS_UNDEFINED_ERROR) + return() + endif() + endif() + target_link_options("${target}" PRIVATE "${no_undefined_flag}") +endfunction() + function(append_extra_translations target_name) if(NOT ARGN) return()