mirror of https://github.com/mamba-org/mamba.git
103 lines
3.3 KiB
CMake
103 lines
3.3 KiB
CMake
# Module to set Link Time Optimization flags
|
|
|
|
include(CheckIPOSupported)
|
|
|
|
# Detect is setting Link Time Optimization is recommended.
|
|
#
|
|
# Currently checks if LTO is supported and if the build is a release.
|
|
function(mamba_should_lto)
|
|
# Names of option parameters (without arguments)
|
|
set(options)
|
|
# Names of named parameters with a single argument
|
|
set(oneValueArgs RESULT OUTPUT)
|
|
# Names of named parameters with a multiple arguments
|
|
set(multiValueArgs)
|
|
cmake_parse_arguments(arg "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
|
|
# Extra arguments not accounted for
|
|
if(arg_UNPARSED_ARGUMENTS)
|
|
message(
|
|
AUTHOR_WARNING "Unrecoginzed options passed to ${CMAKE_CURRENT_FUNCTION}: "
|
|
"${ARG_UNPARSED_ARGUMENTS}"
|
|
)
|
|
endif()
|
|
|
|
# Check if we are building in a release-like build
|
|
string(TOLOWER "${CMAKE_BUILD_TYPE}" build_type_lower)
|
|
set(valid_release_names "release" "relwithdebinfo")
|
|
if(NOT ${build_type_lower} IN_LIST valid_release_names)
|
|
set(
|
|
${arg_RESULT}
|
|
FALSE
|
|
PARENT_SCOPE
|
|
)
|
|
set(
|
|
${arg_OUTPUT}
|
|
"the build type is not a release"
|
|
PARENT_SCOPE
|
|
)
|
|
return()
|
|
endif()
|
|
|
|
# Check if LTO is supported by compiler
|
|
check_ipo_supported(RESULT lto_is_supported OUTPUT lto_not_supported_reason)
|
|
if(NOT lto_is_supported)
|
|
set(
|
|
${arg_RESULT}
|
|
FALSE
|
|
PARENT_SCOPE
|
|
)
|
|
set(
|
|
${arg_OUTPUT}
|
|
"${lto_not_supported_reason}"
|
|
PARENT_SCOPE
|
|
)
|
|
endif()
|
|
|
|
set(
|
|
${arg_RESULT}
|
|
TRUE
|
|
PARENT_SCOPE
|
|
)
|
|
endfunction()
|
|
|
|
# Set Link Time Optimization on a given target.
|
|
#
|
|
# MODE parameter takes the possible values - A false constant: deactivate LTO - A true constant:
|
|
# activate LTO, fails if this is not supported by the compiler - "Default" or "Auto": set LTO if
|
|
# supported and the build type is a release.
|
|
function(mamba_target_set_lto target)
|
|
# Names of option parameters (without arguments)
|
|
set(options)
|
|
# Names of named parameters with a single argument
|
|
set(oneValueArgs MODE)
|
|
# Names of named parameters with a multiple arguments
|
|
set(multiValueArgs)
|
|
cmake_parse_arguments(arg "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
|
|
# Extra arguments not accounted for
|
|
if(arg_UNPARSED_ARGUMENTS)
|
|
message(
|
|
AUTHOR_WARNING "Unrecoginzed parameter passed to ${CMAKE_CURRENT_FUNCTION}: "
|
|
"'${arg_UNPARSED_ARGUMENTS}'"
|
|
)
|
|
return()
|
|
endif()
|
|
|
|
mamba_should_lto(RESULT should_lto OUTPUT lto_message)
|
|
string(TOLOWER ${arg_MODE} arg_MODE_lower)
|
|
set(valid_default_names "default" "auto" "")
|
|
if(arg_MODE_lower IN_LIST valid_default_names)
|
|
set(is_default TRUE)
|
|
endif()
|
|
|
|
if("${arg_MODE}" OR (is_default AND should_lto))
|
|
message(STATUS "Setting LTO for target ${PROJECT_NAME}::${target}")
|
|
set_property(TARGET ${arg_TARGET} PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
|
|
else()
|
|
if(is_default)
|
|
message(STATUS "Skipping LTO for target ${PROJECT_NAME}::${target}, ${lto_message}")
|
|
else()
|
|
message(STATUS "Skipping LTO for target ${PROJECT_NAME}::${target}")
|
|
endif()
|
|
endif()
|
|
endfunction()
|