Good news! CMake v3.9 finally supports LTO.
Example
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.
Checking Compiler Support
The Module CheckIPOSupported provides checking whether interprocedural optimization (IPO/LTO) is supported by the compiler or not:
check_ipo_supported([RESULT <result>] [OUTPUT <output>]
[LANGUAGES <lang>...])
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.
Enabling LTO
LTO is enabled either for a single target or as default for all targets.
LTO for a single target
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)
LTO as default
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.
See also