Jelajahi Sumber

cmake: Enable interprocedural optimization for Release configuration

The built-in CMake variable will set the appropriate compiler flags
for supported compilers and compiler versions.
PatTheMav 1 tahun lalu
induk
melakukan
07176822ad
2 mengubah file dengan 43 tambahan dan 5 penghapusan
  1. 38 0
      cmake/common/compiler_common.cmake
  2. 5 5
      cmake/windows/compilerconfig.cmake

+ 38 - 0
cmake/common/compiler_common.cmake

@@ -85,3 +85,41 @@ endif()
 if(NOT DEFINED CMAKE_COMPILE_WARNING_AS_ERROR)
   set(CMAKE_COMPILE_WARNING_AS_ERROR ON)
 endif()
+
+# Enable interprocedural optimization
+message(STATUS "Checking for interprocedural optimization support")
+if(NOT DEFINED HAS_INTERPROCEDURAL_OPTIMIZATION)
+  include(CheckIPOSupported)
+  check_ipo_supported(RESULT _ipo_result OUTPUT _ipo_output)
+  set(
+    HAS_INTERPROCEDURAL_OPTIMIZATION
+    ${_ipo_result}
+    CACHE BOOL
+    "Result of compiler check for interprocedural optimization"
+    FORCE
+  )
+
+  if(HAS_INTERPROCEDURAL_OPTIMIZATION)
+    message(STATUS "Checking for interprocedural optimization support - available")
+  else()
+    message(STATUS "Checking for interprocedural optimization support - unavailable")
+  endif()
+
+  mark_as_advanced(HAS_INTERPROCEDURAL_OPTIMIZATION)
+  unset(_ipo_result)
+  unset(_ipo_output)
+endif()
+
+if(HAS_INTERPROCEDURAL_OPTIMIZATION)
+  message(STATUS "Checking for interprocedural optimization support - enabled [Release, MinSizeRel]")
+  set(CMAKE_INTERPROCEDURAL_OPTIMIZATION_DEBUG OFF)
+  set(CMAKE_INTERPROCEDURAL_OPTIMIZATION_RELWITHDEBINFO OFF)
+  set(CMAKE_INTERPROCEDURAL_OPTIMIZATION_RELEASE ON)
+  set(CMAKE_INTERPROCEDURAL_OPTIMIZATION_MINSIZEREL ON)
+else()
+  message(STATUS "Checking for interprocedural optimization support - disabled")
+  set(CMAKE_INTERPROCEDURAL_OPTIMIZATION_DEBUG OFF)
+  set(CMAKE_INTERPROCEDURAL_OPTIMIZATION_RELWITHDEBINFO OFF)
+  set(CMAKE_INTERPROCEDURAL_OPTIMIZATION_RELEASE OFF)
+  set(CMAKE_INTERPROCEDURAL_OPTIMIZATION_MINSIZEREL OFF)
+endif()

+ 5 - 5
cmake/windows/compilerconfig.cmake

@@ -73,7 +73,6 @@ add_compile_options(
   "$<$<COMPILE_LANG_AND_ID:C,Clang>:${_obs_clang_c_options}>"
   "$<$<COMPILE_LANG_AND_ID:CXX,Clang>:${_obs_clang_cxx_options}>"
   $<$<NOT:$<CONFIG:Debug>>:/Gy>
-  $<$<NOT:$<CONFIG:Debug>>:/GL>
   $<$<NOT:$<CONFIG:Debug>>:/Oi>
 )
 
@@ -87,11 +86,12 @@ add_compile_definitions(
   $<$<CONFIG:DEBUG>:_DEBUG>
 )
 
+# Visual Studio sets "/LTCG:INCREMENTAL" when "Whole Program Optimization" is enabled for a x86 or x64 target. To
+# ensure "proper" link-time optimization, the LTCG flag has to be explicitly added here.
 add_link_options(
-  $<$<NOT:$<CONFIG:Debug>>:/OPT:REF>
-  $<$<NOT:$<CONFIG:Debug>>:/OPT:ICF>
-  $<$<NOT:$<CONFIG:Debug>>:/LTCG>
-  $<$<NOT:$<CONFIG:Debug>>:/INCREMENTAL:NO>
+  $<$<OR:$<CONFIG:Release>,$<CONFIG:MinSizeRel>>:/LTCG>
+  $<$<OR:$<CONFIG:Release>,$<CONFIG:MinSizeRel>>:/OPT:REF>
+  $<$<OR:$<CONFIG:Release>,$<CONFIG:MinSizeRel>>:/OPT:ICF>
   /DEBUG
   /Brepro
 )