120 lines
4.6 KiB
Diff
120 lines
4.6 KiB
Diff
|
commit dfd43f7d5527680fd27a29c80e8eb3b9b5165220
|
||
|
Author: Tor Didriksen <tor.didriksen@oracle.com>
|
||
|
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)
|