J'ai la construction cmake la plus récente et j'essaie toutes les configurations de construction (Debug, MinSizeRel, RelWithDebugInfo, Release, General) Je ne vois nulle part (recherche de texte) dans les makefiles générés la chaîne -lto
, donc ou la fonctionnalité n'est toujours pas présente, ou elle nécessite une inversion manuelle (dans ce cas, une recherche de texte pour LTO ou l'optimisation du temps de liaison) sur la documentation ne donne aucun résultat, donc je ne vois nulle part dans la documentation officielle un moyen d'activer LTO .
Existe-t-il un moyen d'activer LTO "globalement" (pour tous les compilateurs) sans spécifier manuellement des indicateurs qui ne pourraient au pire être pris en charge que par GCC?
Edit: au 28 octobre 2015 sur CMake IRC
jcelerier | I have a question about INTERPROCEDURAL_OPTIMIZATION
jcelerier | it sounds like it should enable -flto on gcc
+ngladitz | jcelerier: its only implemented for the intel compiler
jcelerier | ngladitz: ah, okay
jcelerier | are there other switches for pgo / lto ?
jcelerier | or must it be done by hand ?
+ngladitz | there currently is no first class support otherwise
Problème lié à CMake: https://gitlab.kitware.com/cmake/cmake/issues/15245
CMake a le INTERPROCEDURAL_OPTIMIZATION
propriété sur les cibles, ce qui semble pouvoir activer le LTO sur certaines plates-formes.
Lien: http://www.cmake.org/cmake/help/v3.0/prop_tgt/INTERPROCEDURAL_OPTIMIZATION.html
Pour l'activer sur une cible MyLib:
add_library(MyLib ...)
...
set_property(TARGET MyLib PROPERTY INTERPROCEDURAL_OPTIMIZATION True)
Bonnes nouvelles! CMake v3.9 enfin supporte LTO.
Voici un exemple de code pour montrer comment cela fonctionne:
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()
Pour GCC, cela ajoute -flto -fno-fat-lto-objects
Aux commandes de compilation des cibles.
Le module ( CheckIPOSupported permet de vérifier si optimisation interprocédurale (IPO/LTO) est pris en charge par le compilateur ou non:
check_ipo_supported([RESULT <result>] [OUTPUT <output>]
[LANGUAGES <lang>...])
Si aucun argument n'est passé (= check_ipo_supported()
) une erreur est déclenchée pour indiquer qu'elle n'est pas prise en charge, sinon la variable result
est définie sur YES
ou NO
. Plus de détails sont décrits dans la documentation du module.
Le LTO est activé soit pour cible unique ou comme par défaut pour toutes les cibles.
Pour activer le LTO pour un ensemble cible INTERPROCEDURAL_OPTIMIZATION
à TRUE
. Cela se fait par la commande set_property()
:
set_property(TARGET name-target-here
PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
Il est possible d'activer LTO par défaut en définissant CMAKE_INTERPROCEDURAL_OPTIMIZATION
à TRUE
:
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
Cela activera INTERPROCEDURAL_OPTIMIZATION
Pour toutes les cibles créées après cette ligne. Ceux créés auparavant ne sont pas affectés.
Oui, selon le code source, il n'y a pas de support pour LTO pour les compilateurs gcc/clang. Ils prennent en charge uniquement le compilateur Intel.
J'ai une sortie grep pour cmake 3.4.3:
grep -HiR 'INTERPROCEDURAL_OPTIMIZATION' *
Help/manual/cmake-properties.7.rst:
/prop_dir/INTERPROCEDURAL_OPTIMIZATION_CONFIG
Help/manual/cmake-properties.7.rst:
/prop_dir/INTERPROCEDURAL_OPTIMIZATION
Help/manual/cmake-properties.7.rst:
/prop_tgt/INTERPROCEDURAL_OPTIMIZATION_CONFIG
Help/manual/cmake-properties.7.rst:
/prop_tgt/INTERPROCEDURAL_OPTIMIZATION
Help/prop_dir/INTERPROCEDURAL_OPTIMIZATION.rst:INTERPROCEDURAL_OPTIMIZATION
Help/prop_dir/INTERPROCEDURAL_OPTIMIZATION_CONFIG.rst:INTERPROCEDURAL_OPTIMIZATION_<CONFIG
Help/prop_dir/INTERPROCEDURAL_OPTIMIZATION_CONFIG.rst:This is a
per-configuration version of INTERPROCEDURAL_OPTIMIZATION.
Help/prop_tgt/INTERPROCEDURAL_OPTIMIZATION.rst:INTERPROCEDURAL_OPTIMIZATION
Help/prop_tgt/INTERPROCEDURAL_OPTIMIZATION_CONFIG.rst:INTERPROCEDURAL_OPTIMIZATION_<CONFIG
Help/prop_tgt/INTERPROCEDURAL_OPTIMIZATION_CONFIG.rst:This is a
per-configuration version of INTERPROCEDURAL_OPTIMIZATION.
Modules/Platform/Linux-Intel.cmake: # INTERPROCEDURAL_OPTIMIZATION
Source/cmCommonTargetGenerator.cxx:
if(this->GetFeatureAsBool("INTERPROCEDURAL_OPTIMIZATION"))
Source/cmGeneratorTarget.cxx:
"INTERPROCEDURAL_OPTIMIZATION", config))
Source/cmMakefileLibraryTargetGenerator.cxx:
if(this->GetFeatureAsBool("INTERPROCEDURAL_OPTIMIZATION") &&
Tests/IPO/CMakeLists.txt:set_property(DIRECTORY PROPERTY
INTERPROCEDURAL_OPTIMIZATION 1)
Comme vous pouvez le voir, nous n'avons que le module de plate-forme Intel.
J'ai donc créé une demande de fonctionnalité pour cette fonctionnalité extrêmement utile: https://cmake.org/Bug/view.php?id=15939
Pour le moment, gcc et clang supportent lto. (Voir: https://clang.llvm.org/docs/CommandGuide/clang.htmlhttps://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html ) Vous pouvez l'activer via cmake: set (CMAKE_INTERPROCEDURAL_OPTIMIZATION True) Cependant, vous devez avoir la version cmake> = 3.9, et je pense que vous pouvez définir une politique et vérifier si LTO est pris en charge par le compilateur/la chaîne d'outils (vérifiez CMAKE_IPO_AVAILABLE et jeter une erreur sinon)
Et définissez des indicateurs pour gcc/clang (-flto et -ffat-lto-files pour fcc> 4.7 ou -flto = full/thin pour clang)