I have a CMake project with several subprojects that create static libraries built with -flto=thin
.
The project has a lot of tests that are linked against the aforementioned libraries. With LTO it takes a lot of time to build tests, therefore I have disabled LTO for tests using -fno-lto
.
What I noticed though, is that lld
performs LTO on tests even with -fno-lto
. If I run the linker with --time-trace
I can see that the majority of the time is spent on LTO.
My questions are:
- Is this expected? If so I can assume that
lld
performs LTO whenever it finds the LTO info in the object it links. - If not, is there a way to disable this behavior? Adding
-fno-lto
to the compiler does not seem to work, andlld
does not have a param to explicitly disable LTO. - If not, is this a bug?
Update 1:
This is how I handle lto
in CMake:
# Enable Thin LTO only on non-test targets.
if(ENABLE_LTO)
if (IS_TEST)
target_compile_options(${TARGET} PRIVATE -fno-lto)
# Probably pointless.
target_link_options(${TARGET} PRIVATE -fno-lto)
else()
message(STATUS "ENABLE_LTO on target ${TARGET})")
target_compile_options(${TARGET} PRIVATE -flto=thin)
target_link_options(${TARGET} PRIVATE -flto=thin -Wl,--thinlto-cache-dir=${CMAKE_BINARY_DIR}/lto.cache)
endif()
endif()
-fno-lto
after-flto=thin
(the rightmost settings wins)? Have you specified-fno-lto
in a compiler flags (it should not be set on the linker flags)? – Uteutensil-flto=thin
at all (hence-fno-lto
should be the default). To be sure I have explicitly added the-fno-lto
param to the compiler. Updating the question. – Hepzi