From a08bf7f00ab64fd3ae7376d8dd50ca8a37bee3e3 Mon Sep 17 00:00:00 2001 From: Alexandru Croitor Date: Fri, 12 Jun 2020 19:12:26 +0200 Subject: CMake: Fix usage of gc_binaries feature The qt_internal_apply_gc_binaries function should apply both compile and link flags, not just link flags. The flags should be applied publically to all consumers of Bootstrap regardless if the gc_binaries feature is enabled. The flags should be applied publically to Core only in case if the feature is enabled (aka for static builds only). Change-Id: Id42af0d9b527004d74c04eff2c9e3c2be1e76aac Fixes: QTBUG-84461 Task-number: QTBUG-83929 Reviewed-by: Cristian Adam --- cmake/QtBuild.cmake | 25 +++++++++++++++++++++---- configure.cmake | 3 +++ qmake/CMakeLists.txt | 2 +- src/corelib/CMakeLists.txt | 2 +- src/tools/bootstrap/CMakeLists.txt | 2 +- util/cmake/configurejson2cmake.py | 4 +++- 6 files changed, 30 insertions(+), 8 deletions(-) diff --git a/cmake/QtBuild.cmake b/cmake/QtBuild.cmake index ea0d92a7cb..0778987b6a 100644 --- a/cmake/QtBuild.cmake +++ b/cmake/QtBuild.cmake @@ -1409,7 +1409,15 @@ function(qt_internal_add_link_flags_no_undefined target) endif() endfunction() -function(qt_internal_add_link_flags_gc_sections target visibility) +function(qt_internal_apply_gc_binaries_conditional target visibility) + # Should only be applied when the feature is enabled, aka for static builds. + if(NOT QT_FEATURE_gc_binaries) + return() + endif() + qt_internal_apply_gc_binaries("${target}" "${visibility}") +endfunction() + +function(qt_internal_apply_gc_binaries target visibility) set(possible_visibilities PRIVATE INTERFACE PUBLIC) list(FIND possible_visibilities "${visibility}" known_visibility) if (known_visibility EQUAL "-1") @@ -1419,13 +1427,22 @@ function(qt_internal_add_link_flags_gc_sections target visibility) if ((GCC OR CLANG) AND NOT EMSCRIPTEN) if(APPLE) set(gc_sections_flag "-Wl,-dead_strip") - elseif(LINUX OR BSD OR SOLARIS OR WIN32 OR ANDROID) + elseif(SOLARIS) + set(gc_sections_flag "-Wl,-z,ignore") + elseif(LINUX OR BSD OR WIN32 OR ANDROID) set(gc_sections_flag "-Wl,--gc-sections") - else() - message(FATAL_ERROR "Platform linker doesn't support gc sections. Target:\"${target}\".") endif() + endif() + if(gc_sections_flag) target_link_options("${target}" ${visibility} "${gc_sections_flag}") endif() + + if((GCC OR CLANG OR ICC) AND NOT EMSCRIPTEN) + set(split_sections_flags "-ffunction-sections" "-fdata-sections") + endif() + if(split_sections_flags) + target_compile_options("${target}" ${visibility} ${split_sections_flags}) + endif() endfunction() function(qt_internal_add_linker_version_script target) diff --git a/configure.cmake b/configure.cmake index fa20b94333..3863f34285 100644 --- a/configure.cmake +++ b/configure.cmake @@ -355,6 +355,9 @@ qt_feature("cross_compile" PUBLIC ) qt_feature_config("cross_compile" QMAKE_PUBLIC_CONFIG) qt_feature_config("cross_compile" QMAKE_PRIVATE_CONFIG) +qt_feature("gc_binaries" PRIVATE + CONDITION NOT QT_FEATURE_shared +) qt_feature("use_bfd_linker" LABEL "bfd" AUTODETECT false diff --git a/qmake/CMakeLists.txt b/qmake/CMakeLists.txt index c12cb03237..efc6c81da4 100644 --- a/qmake/CMakeLists.txt +++ b/qmake/CMakeLists.txt @@ -270,7 +270,7 @@ set_target_properties(${target_name} PROPERTIES AUTOUIC OFF ) -qt_internal_add_link_flags_gc_sections(${target_name} PRIVATE) # special case +qt_internal_apply_gc_binaries(${target_name} PRIVATE) # special case qt_enable_msvc_cplusplus_define(${target_name} PUBLIC) # special case qt_skip_warnings_are_errors(${target_name}) # special case diff --git a/src/corelib/CMakeLists.txt b/src/corelib/CMakeLists.txt index 9f22828fbf..2b1cd8c837 100644 --- a/src/corelib/CMakeLists.txt +++ b/src/corelib/CMakeLists.txt @@ -1272,7 +1272,7 @@ if(WIN32) set_target_properties(Core PROPERTIES COMPILE_DEFINITIONS "${defines}") endif() -qt_internal_add_link_flags_gc_sections(Core PRIVATE) +qt_internal_apply_gc_binaries_conditional(Core PUBLIC) if(WIN32) set(isExe $,EXECUTABLE>) diff --git a/src/tools/bootstrap/CMakeLists.txt b/src/tools/bootstrap/CMakeLists.txt index b734f4fc5d..8b3a6e96d0 100644 --- a/src/tools/bootstrap/CMakeLists.txt +++ b/src/tools/bootstrap/CMakeLists.txt @@ -261,7 +261,7 @@ qt_extend_target(Bootstrap CONDITION MINGW AND WIN32 # QMAKE_CFLAGS = "$$QMAKE_CFLAGS_SHSTK" # special case begin -qt_internal_add_link_flags_gc_sections(Bootstrap PUBLIC) +qt_internal_apply_gc_binaries(Bootstrap PUBLIC) set_target_properties(Bootstrap PROPERTIES AUTOMOC OFF AUTOUIC OFF AUTORCC OFF) qt_internal_add_target_aliases(Bootstrap) qt_enable_msvc_cplusplus_define(Bootstrap PUBLIC) diff --git a/util/cmake/configurejson2cmake.py b/util/cmake/configurejson2cmake.py index 11bb01a17a..ce032fafaf 100755 --- a/util/cmake/configurejson2cmake.py +++ b/util/cmake/configurejson2cmake.py @@ -863,7 +863,9 @@ def get_feature_mapping(): "framework": { "condition": "APPLE AND BUILD_SHARED_LIBS AND NOT CMAKE_BUILD_TYPE STREQUAL Debug" }, - "gc_binaries": None, + "gc_binaries": { + "condition" : "NOT QT_FEATURE_shared" + }, "gcc-sysroot": None, "gcov": None, "gnu-libiconv": { -- cgit v1.2.3