Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Use more cmakey way to detect and use lto (should work on clang and others)
authorAugustin Degomme <adegomme@gmail.com>
Mon, 24 Feb 2020 14:05:18 +0000 (15:05 +0100)
committerAugustin Degomme <adegomme@gmail.com>
Mon, 24 Feb 2020 14:49:11 +0000 (15:49 +0100)
This was introduced in cmake 3.9, but we still support 3.5, so some bits will be removed later

CMakeLists.txt
tools/cmake/Flags.cmake

index e118fcf..00a3de2 100644 (file)
@@ -19,6 +19,8 @@ set(libsimgrid-java_version "${release_version}")
 
 # Basic checks on cmake
 cmake_minimum_required(VERSION 3.5)
 
 # 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)
 
 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)
 
index 7bf32b9..740e7f5 100644 (file)
@@ -106,27 +106,25 @@ if(CMAKE_COMPILER_IS_GNUCC)
 endif()
 
 # Configure LTO
 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
 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))
       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"))
          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()
     endif()
   endif()
+
   if(enable_lto)
     message(STATUS "LTO seems usable.")
   else()
   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
   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:
   # "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: