commit dfd43f7d5527680fd27a29c80e8eb3b9b5165220 Author: Tor Didriksen Date: Mon Aug 3 16:39:21 2020 +0200 Bug #31701553 CMAKE CODE TO DISABLE LTO IS TOO SIMPLE Parts of our codebase (3rd party libraries) fail to compile/link if built with -flto. For these we simply remove "-flto[=n|auto|jobserver] from CMAKE_C_FLAGS and CMAKE_CXX_FLAGS. We also disable linkers lld and gold by default if building with link-time optimization. Change-Id: I84e9f7128a4d263056aa60c188e6430ea7161655 diff --git a/CMakeLists.txt b/CMakeLists.txt index dc118b37472..919e7cbd783 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -639,6 +639,10 @@ OPTION(WITH_LTO ${WITH_LTO_DEFAULT} ) +IF(CMAKE_C_FLAGS MATCHES " -flto" OR CMAKE_CXX_FLAGS MATCHES " -flto") + SET(CMAKE_COMPILER_FLAG_WITH_LTO 1) +ENDIF() + include(CheckCSourceCompiles) include(CheckCXXSourceCompiles) # We need some extra FAIL_REGEX patterns @@ -848,7 +852,7 @@ ENDIF() # Use lld for Clang if available and not explicitly disabled. # Also works for gcc on Debian/Ubuntu. Do 'apt install lld'. # LTO build fails with lld, so turn it off by default. -IF(LINUX AND NOT WITH_LTO) +IF(LINUX AND NOT WITH_LTO AND NOT CMAKE_COMPILER_FLAG_WITH_LTO) OPTION(USE_LD_LLD "Use llvm lld linker" ON) ELSE() OPTION(USE_LD_LLD "Use llvm lld linker" OFF) @@ -879,7 +883,11 @@ IF(USE_LD_LLD) ENDIF() # Use gold on x86 if available and not explicitly disabled. -IF(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" AND NOT WIN32) +# LTO build fails with gold, so turn it off by default. +IF(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" + AND NOT WIN32 + AND NOT WITH_LTO + AND NOT CMAKE_COMPILER_FLAG_WITH_LTO) OPTION(USE_LD_GOLD "Use GNU gold linker" ON) ELSE() OPTION(USE_LD_GOLD "Use GNU gold linker" OFF) diff --git a/cmake/compile_flags.cmake b/cmake/compile_flags.cmake index 053e48b9e70..bb1338ee9f8 100644 --- a/cmake/compile_flags.cmake +++ b/cmake/compile_flags.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2014, 2020, Oracle and/or its affiliates. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License, version 2.0, @@ -83,3 +83,12 @@ FUNCTION(ADD_COMPILE_DEFINITIONS) ${FILE} PROPERTIES COMPILE_DEFINITIONS "${DEFS}") ENDFOREACH() ENDFUNCTION() + +# -flto[=n] or -flto=auto or -flto=jobserver +SET(MY_COMPILER_FLAG_FLTO " -flto(=[0-9a-z]+)?") + +# Remove compiler flag/pattern from CMAKE_C_FLAGS or CMAKE_CXX_FLAGS +FUNCTION(REMOVE_CMAKE_COMPILER_FLAGS FLAG_VAR PATTERN) + STRING(REGEX REPLACE "${PATTERN}" "" ${FLAG_VAR} "${${FLAG_VAR}}") + SET(${FLAG_VAR} "${${FLAG_VAR}}" PARENT_SCOPE) +ENDFUNCTION() diff --git a/extra/icu/CMakeLists.txt b/extra/icu/CMakeLists.txt index aa1cfb1a90e..81ef19335a0 100644 --- a/extra/icu/CMakeLists.txt +++ b/extra/icu/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2017, 2020, Oracle and/or its affiliates. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License, version 2.0, @@ -91,8 +91,10 @@ IF(MSVC AND NOT WIN32_CLANG) STRING_APPEND(CMAKE_CXX_FLAGS " /wd4229") ENDIF() -STRING(REPLACE "-flto" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") -STRING(REPLACE "-flto" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") +IF(WITH_ICU STREQUAL "bundled") + REMOVE_CMAKE_COMPILER_FLAGS(CMAKE_C_FLAGS "${MY_COMPILER_FLAG_FLTO}") + REMOVE_CMAKE_COMPILER_FLAGS(CMAKE_CXX_FLAGS "${MY_COMPILER_FLAG_FLTO}") +ENDIF() ADD_SUBDIRECTORY(source/common) ADD_SUBDIRECTORY(source/i18n) diff --git a/plugin/innodb_memcached/CMakeLists.txt b/plugin/innodb_memcached/CMakeLists.txt index b9d93da5f20..00bbddeb3ec 100644 --- a/plugin/innodb_memcached/CMakeLists.txt +++ b/plugin/innodb_memcached/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2011, 2019, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2011, 2020, Oracle and/or its affiliates. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License, version 2.0, @@ -76,8 +76,8 @@ IF(WITH_INNODB_MEMCACHED AND UNIX) ENDIF() # -Werror=lto-type-mismatch for misc functions. - STRING(REPLACE "-flto" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") - STRING(REPLACE "-flto" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") + REMOVE_CMAKE_COMPILER_FLAGS(CMAKE_C_FLAGS "${MY_COMPILER_FLAG_FLTO}") + REMOVE_CMAKE_COMPILER_FLAGS(CMAKE_CXX_FLAGS "${MY_COMPILER_FLAG_FLTO}") ADD_SUBDIRECTORY(daemon_memcached) ADD_SUBDIRECTORY(innodb_memcache)