From f1623a362b20f59ab27938f3f073f43ef7404deb Mon Sep 17 00:00:00 2001 From: Augustin Degomme Date: Mon, 24 Feb 2020 15:05:18 +0100 Subject: [PATCH] Use more cmakey way to detect and use lto (should work on clang and others) This was introduced in cmake 3.9, but we still support 3.5, so some bits will be removed later --- CMakeLists.txt | 2 ++ tools/cmake/Flags.cmake | 29 +++++++++++++---------------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e118fcfa4e..00a3de239c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,6 +19,8 @@ set(libsimgrid-java_version "${release_version}") # Basic checks on cmake cmake_minimum_required(VERSION 3.5) +#for lto, to avoid warning (should be removed when switching to requiring cmake >= 3.9) +cmake_policy(SET CMP0069 NEW) message(STATUS "Cmake version ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION}") set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_HOME_DIRECTORY}/tools/cmake/Modules) diff --git a/tools/cmake/Flags.cmake b/tools/cmake/Flags.cmake index 7bf32b9e4a..740e7f5d8c 100644 --- a/tools/cmake/Flags.cmake +++ b/tools/cmake/Flags.cmake @@ -106,27 +106,25 @@ if(CMAKE_COMPILER_IS_GNUCC) endif() # Configure LTO -# NOTE, cmake 3.0 has a INTERPROCEDURAL_OPTIMIZATION target -# property for this (http://www.cmake.org/cmake/help/v3.0/prop_tgt/INTERPROCEDURAL_OPTIMIZATION.html) if(enable_lto) # User wants LTO. Try if we can do that set(enable_lto OFF) if(enable_compile_optimizations - AND CMAKE_COMPILER_IS_GNUCC AND (NOT enable_model-checking)) - # On windows, we need 4.8 or higher to enable lto because of http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50293 - # We are experiencing assertion failures even with 4.8 on MinGW. - # Push the support forward: will see if 4.9 works when we test it. - # - # On Linux, we got the following with GCC 4.8.4 on Centos and Ubuntu - # lto1: internal compiler error: in output_die, at dwarf2out.c:8478 - # Please submit a full bug report, with preprocessed source if appropriate. - # So instead, we push the support forward - - if ( (CMAKE_C_COMPILER_VERSION VERSION_GREATER "4.8.5") + if(CMAKE_VERSION VERSION_LESS "3.9") + if ( CMAKE_COMPILER_IS_GNUCC + AND (CMAKE_C_COMPILER_VERSION VERSION_GREATER "4.8.5") AND (LINKER_VERSION VERSION_GREATER "2.22")) - set(enable_lto ON) + set(enable_lto ON) + endif() + else() + include(CheckIPOSupported) + check_ipo_supported(RESULT ipo) + if(ipo) + set(enable_lto ON) + endif() endif() endif() + if(enable_lto) message(STATUS "LTO seems usable.") else() @@ -144,8 +142,7 @@ else() message(STATUS "LTO disabled on the command line.") endif() if(enable_lto) # User wants LTO, and it seems usable. Go for it - set(optCFLAGS "${optCFLAGS} -flto ") - # See https://gcc.gnu.org/wiki/LinkTimeOptimizationFAQ#ar.2C_nm_and_ranlib: + set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) # "Since version 4.9 gcc produces slim object files that only contain # the intermediate representation. In order to handle archives of # these objects you have to use the gcc wrappers: -- 2.20.1