From 07176822ad481fdaba01360b323439bbd93d62c7 Mon Sep 17 00:00:00 2001 From: PatTheMav Date: Sat, 12 Oct 2024 17:55:38 +0200 Subject: [PATCH] cmake: Enable interprocedural optimization for Release configuration The built-in CMake variable will set the appropriate compiler flags for supported compilers and compiler versions. --- cmake/common/compiler_common.cmake | 38 ++++++++++++++++++++++++++++++ cmake/windows/compilerconfig.cmake | 10 ++++---- 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/cmake/common/compiler_common.cmake b/cmake/common/compiler_common.cmake index e9b1d370f..f6b9dd36f 100644 --- a/cmake/common/compiler_common.cmake +++ b/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() diff --git a/cmake/windows/compilerconfig.cmake b/cmake/windows/compilerconfig.cmake index f891e9d38..aca724a5a 100644 --- a/cmake/windows/compilerconfig.cmake +++ b/cmake/windows/compilerconfig.cmake @@ -73,7 +73,6 @@ add_compile_options( "$<$:${_obs_clang_c_options}>" "$<$:${_obs_clang_cxx_options}>" $<$>:/Gy> - $<$>:/GL> $<$>:/Oi> ) @@ -87,11 +86,12 @@ add_compile_definitions( $<$:_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( - $<$>:/OPT:REF> - $<$>:/OPT:ICF> - $<$>:/LTCG> - $<$>:/INCREMENTAL:NO> + $<$,$>:/LTCG> + $<$,$>:/OPT:REF> + $<$,$>:/OPT:ICF> /DEBUG /Brepro )