最新のcmakeビルドがあり、すべてのビルド構成(Debug、MinSizeRel、RelWithDebugInfo、Release、General)を試しています。生成されたmakefileに文字列-lto
、または機能がまだ存在しないか、マニュアルを手動で変更する必要がある場合(その場合、LTOまたはリンク時の最適化のテキスト検索)で結果が得られないため、公式ドキュメントのどこにもLTOを有効にする方法がありません。 。
最悪の場合GCCのみでサポートされる可能性のあるフラグを手動で指定せずに、LTOを「すべて」(すべてのコンパイラーに対して)有効にする方法はありますか?
編集:2015年10月28日現在、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
関連するCMakeの問題: https://gitlab.kitware.com/cmake/cmake/issues/15245
CMakeにはINTERPROCEDURAL_OPTIMIZATION
ターゲットのプロパティ。一部のプラットフォームではLTOが有効になるようです。
リンク: http://www.cmake.org/cmake/help/v3.0/prop_tgt/INTERPROCEDURAL_OPTIMIZATION.html
ターゲットのMyLibで有効にするには:
add_library(MyLib ...)
...
set_property(TARGET MyLib PROPERTY INTERPROCEDURAL_OPTIMIZATION True)
朗報! CMake v3.9最後にLTOをサポート。
これがどのように機能するかを示すコード例です:
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()
GCCの場合、これは-flto -fno-fat-lto-objects
をターゲットのコンパイルコマンドに追加します。
モジュール CheckIPOSupported は、かどうかのチェックを提供します手続き間最適化(IPO/LTO)は、コンパイラーでサポートされているかどうかにかかわらず、
check_ipo_supported([RESULT <result>] [OUTPUT <output>]
[LANGUAGES <lang>...])
引数が渡されない場合(= check_ipo_supported()
)、サポートされていないことを示すエラーが発生します。それ以外の場合、result
変数はYES
またはNO
に設定されます。詳細はモジュールのドキュメントで説明されています。
LTOは、単一ターゲットまたはすべてのターゲットのデフォルト。
ターゲットのLTOを有効にするには INTERPROCEDURAL_OPTIMIZATION
をTRUE
に設定します。これは、 set_property()
コマンドによって実行されます。
set_property(TARGET name-target-here
PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
CMAKE_INTERPROCEDURAL_OPTIMIZATION
をTRUE
に設定することで、デフォルトでLTOを有効にすることができます。
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
これにより、この行の後に作成されたすべてのターゲットに対してINTERPROCEDURAL_OPTIMIZATION
が有効になります。以前に作成されたものは影響を受けません。
はい、ソースコードによると、gcc/clangコンパイラのLTOはサポートされていません。インテル®コンパイラーのみをサポートしています。
Cmake 3.4.3のgrep出力がいくつかあります。
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)
ご覧のとおり、Intelプラットフォームモジュールしかありません。
そのため、この非常に便利な機能の機能リクエストを作成しました: https://cmake.org/Bug/view.php?id=15939
現時点では、gccとclangの両方がltoをサポートしています。 (参照: https://clang.llvm.org/docs/CommandGuide/clang.htmlhttps://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html )cmakeを使用して有効にできます:set(CMAKE_INTERPROCEDURAL_OPTIMIZATION True)ただし、バージョンcmake> = 3.9が必要です。ポリシーが設定されている可能性があり、LTOがコンパイラ/ツールチェーンでサポートされているかどうかを確認します(CMAKE_IPO_AVAILABLEを確認してください)そうでなければエラーをスローします)
そして、gcc/clangのフラグを設定します(fccの-fltoおよび-ffat-lto-files> 4.7またはclangの-flto = full/thin)