CheckIPOSupported
Added in version 3.9.
This module provides a command to check whether the compiler supports interprocedural optimization (IPO/LTO).
Load this module in a CMake project with:
include(CheckIPOSupported)
Interprocedural optimization is a compiler technique that performs optimizations across translation units (i.e., across source files), allowing the compiler to analyze and optimize the entire program as a whole rather than file-by-file. This can improve performance by enabling more aggressive inlining and dead code elimination. When these optimizations are applied at link time, the process is typically referred to as link-time optimization (LTO), which is a common form of IPO.
In CMake, interprocedural optimization can be enabled on a per-target basis using the INTERPROCEDURAL_OPTIMIZATION target property, or for all targets in the current scope using the CMAKE_INTERPROCEDURAL_OPTIMIZATION variable.
Use this module before enabling the interprocedural optimization on targets to ensure the compiler supports IPO/LTO.
Commands
This module provides the following command:
-
check_ipo_supported -
Checks whether the compiler supports interprocedural optimization (IPO/LTO):
check_ipo_supported( [RESULT <result-var>] [OUTPUT <output-var>] [LANGUAGES <lang>...] )
Options are:
-
RESULT <result-var> -
Set
<result-var>variable toYESif IPO is supported by the compiler andNOotherwise. If this option is not given then the command will issue a fatal error if IPO is not supported. -
OUTPUT <output-var> -
Set
<output-var>variable with details about any error. -
LANGUAGES <lang>... -
Specify languages whose compilers to check.
The following languages are supported:
CCXX-
CUDAAdded in version 3.25.
Fortran
If this option is not given, the default languages are picked from the current
ENABLED_LANGUAGESglobal property.
Note
To use
check_ipo_supported(), policyCMP0069must be set toNEW; otherwise, a fatal error will occur.Added in version 3.13: Support for Visual Studio Generators.
Added in version 3.24: The check uses the caller's
CMAKE_<LANG>_FLAGSandCMAKE_<LANG>_FLAGS_<CONFIG>values. See policyCMP0138. -
Examples
Checking whether the compiler supports IPO and emitting a fatal error if it is not supported:
include(CheckIPOSupported) check_ipo_supported() # fatal error if IPO is not supported set_property(TARGET foo PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
The following example demonstrates how to use this module to enable IPO for the target only when supported by the compiler and to issue a warning if it is not. Additionally, projects may want to provide a configuration option to control when IPO is enabled. For example:
option(FOO_ENABLE_IPO "Enable IPO/LTO")
if(FOO_ENABLE_IPO)
include(CheckIPOSupported)
check_ipo_supported(RESULT result OUTPUT output)
if(result)
set_property(TARGET foo PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
else()
message(WARNING "IPO is not supported: ${output}")
endif()
endif()
© 2000–2026 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/latest/module/CheckIPOSupported.html