From a88341ef9633f977ff7a8a7e8da18945a8324e83 Mon Sep 17 00:00:00 2001 From: nobodyxu Date: Sun, 27 Dec 2020 20:39:24 +1100 Subject: [PATCH 1/6] Bump minimal cmake version to 3.9 for CheckIPOSupported --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 004dd076..b28d2ccb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,7 +10,7 @@ ############################################################################### # General settings ############################################################################### -cmake_minimum_required(VERSION 2.8 FATAL_ERROR) +cmake_minimum_required(VERSION 3.9 FATAL_ERROR) project(SOCI) From d4452345ae65bb7c34c016b1282b32bba01b1b5d Mon Sep 17 00:00:00 2001 From: nobodyxu Date: Sun, 27 Dec 2020 20:57:25 +1100 Subject: [PATCH 2/6] Add cmake config for check and enable lto support It also checks for clang and lld. In case both are present, '-fuse-ld=lld' is appended to linker flags. --- CMakeLists.txt | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index b28d2ccb..0a9ce99f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,7 +22,35 @@ option(SOCI_SHARED "Enable build of shared libraries" ON) option(SOCI_STATIC "Enable build of static libraries" ON) option(SOCI_TESTS "Enable build of collection of SOCI tests" ON) option(SOCI_ASAN "Enable address sanitizer on GCC v4.8+/Clang v 3.1+" OFF) +option(SOCI_LTO "Enable link time optimization" ON) +if (SOCI_LTO) + # Check and enable lto support + include(CheckIPOSupported) + check_ipo_supported(RESULT supported) + + if (NOT supported) + message(STATUS "IPO / LTO not supported") + endif() + + if (supported AND NOT SOCI_ASAN) + message(STATUS "IPO / LTO enabled") + set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) + + if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") + # Check for lld as clang lto works best with its own linker + include(CheckCXXCompilerFlag) + check_cxx_compiler_flag("-fuse-ld=lld" HAS_LLD) + if (HAS_LLD) + SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=lld") + SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fuse-ld=lld") + SET(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -fuse-ld=lld") + endif() + endif() + else() + message(STATUS "IPO / LTO is supported but conflicted with ASAN") + endif() +endif() ############################################################################### # SOCI CMake modules From cab510f2e43f729aed2fc1c3b5f7e566ab206b0f Mon Sep 17 00:00:00 2001 From: nobodyxu Date: Sun, 27 Dec 2020 21:26:02 +1100 Subject: [PATCH 3/6] Fix confusing status msg when lto is not supported --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0a9ce99f..1e400f5f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -47,7 +47,7 @@ if (SOCI_LTO) SET(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -fuse-ld=lld") endif() endif() - else() + elseif(supported) message(STATUS "IPO / LTO is supported but conflicted with ASAN") endif() endif() From d7e86291202ca03f66a1226d1c9f1ce2e59585b0 Mon Sep 17 00:00:00 2001 From: nobodyxu Date: Sun, 27 Dec 2020 22:46:00 +1100 Subject: [PATCH 4/6] Set cmake option SOCI_LTO to off by default so that LTO won't be used in debug build --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1e400f5f..70d1795f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,7 +22,7 @@ option(SOCI_SHARED "Enable build of shared libraries" ON) option(SOCI_STATIC "Enable build of static libraries" ON) option(SOCI_TESTS "Enable build of collection of SOCI tests" ON) option(SOCI_ASAN "Enable address sanitizer on GCC v4.8+/Clang v 3.1+" OFF) -option(SOCI_LTO "Enable link time optimization" ON) +option(SOCI_LTO "Enable link time optimization" OFF) if (SOCI_LTO) # Check and enable lto support From 9a1e994e63914099e0f4c829495d90a3b588cbc9 Mon Sep 17 00:00:00 2001 From: NobodyXu Date: Sun, 27 Dec 2020 22:47:51 +1100 Subject: [PATCH 5/6] Fix grammer of the status message Co-authored-by: VZ --- CMakeLists.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 70d1795f..217a4d26 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,7 +48,7 @@ if (SOCI_LTO) endif() endif() elseif(supported) - message(STATUS "IPO / LTO is supported but conflicted with ASAN") + message(STATUS "IPO / LTO is supported but conflicts with ASAN and not enabled") endif() endif() @@ -232,4 +232,3 @@ endforeach() configure_file("${CONFIG_FILE_IN}" "${CONFIG_FILE_OUT}") message(STATUS "") - From 4f6bf85f64e834b272ac8fc0d6b8fccf7ab3e3d3 Mon Sep 17 00:00:00 2001 From: nobodyxu Date: Sun, 27 Dec 2020 22:57:04 +1100 Subject: [PATCH 6/6] Restore global cmake version; Add separate version check for LTO --- CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 217a4d26..2d473ef0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,7 +10,7 @@ ############################################################################### # General settings ############################################################################### -cmake_minimum_required(VERSION 3.9 FATAL_ERROR) +cmake_minimum_required(VERSION 2.8 FATAL_ERROR) project(SOCI) @@ -25,6 +25,8 @@ option(SOCI_ASAN "Enable address sanitizer on GCC v4.8+/Clang v 3.1+" OFF) option(SOCI_LTO "Enable link time optimization" OFF) if (SOCI_LTO) + cmake_minimum_required(VERSION 3.9) + # Check and enable lto support include(CheckIPOSupported) check_ipo_supported(RESULT supported)