I have the most recent cmake build and trying all build configurations (Debug, MinSizeRel, RelWithDebugInfo, Release, General) I see nowhere (text search) in generated makefiles
Good news! CMake v3.9 finally supports LTO.
Here's an example code to show how it works:
cmake_minimum_required(VERSION 3.9.4)
include(CheckIPOSupported)
check_ipo_supported(RESULT supported OUTPUT error)
add_executable(example Example.cpp)
if( supported )
message(STATUS "IPO / LTO enabled")
set_property(TARGET example PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
else()
message(STATUS "IPO / LTO not supported: <${error}>")
endif()
For GCC this adds -flto -fno-fat-lto-objects
to the targets compile commands.
The Module CheckIPOSupported provides checking whether interprocedural optimization (IPO/LTO) is supported by the compiler or not:
check_ipo_supported([RESULT ] [OUTPUT
If no arguments is passed (= check_ipo_supported()
) an error is raised to indicate it's not supported, otherwise the result
variable is set to either YES
or NO
. More details are described in the documentation of the module.
LTO is enabled either for a single target or as default for all targets.
To enable LTO for a target set INTERPROCEDURAL_OPTIMIZATION to TRUE
. This is done by the set_property() command:
set_property(TARGET name-target-here
PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
It's possible to enable LTO per default by setting CMAKE_INTERPROCEDURAL_OPTIMIZATION to TRUE
:
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
This will enable INTERPROCEDURAL_OPTIMIZATION
for all targets created after this line. Those created before are not affected.