Clang 3.9 のプロファイルに基づく最適化機能を使用して構築している C++ プログラムがあります。これが起こるはずのことです:
- インストルメンテーションを有効にしてプログラムをビルドします。
- そのプログラムを実行して、プロファイル データを含むファイルを作成します:
prof.raw
. - 私は新しいファイル
llvm-profdata
に変換するために使用します.prof.raw
prof.data
- いくつかの変更を加えて、同じプログラムの新しいビルドを作成します。
- 各 .cpp ファイルを .o ファイルにコンパイルするときは、コンパイラ フラグを使用します
-fprofile-use=prof.data
。 - 実行可能ファイルをリンクするときにも指定します
-fprofile-use
。
- 各 .cpp ファイルを .o ファイルにコンパイルするときは、コンパイラ フラグを使用します
これには Gnu Makefile があり、うまく機能します。その Makefile を CMake (3.7、しかしアップグレードできます) に移植しようとしている今、私の問題が発生します。(少なくとも)Unix Makefilesジェネレーターで動作するソリューションが必要ですが、理想的にはすべてのジェネレーターで動作します。
CMake では、2 つの実行可能ターゲットを定義しました:foo-gen
とfoo-use
:
- を実行する
foo-gen
と、ファイルが作成されprof.raw
ます。 - から
add_custom_command
作成するルールを作成するために使用します。prof.data
prof.raw
私の問題は、依存している各オブジェクト ファイルが file に依存していることを CMake に伝える方法がわからないことfoo-use
ですprof.data
。
私が持っていた最も有望なアイデアは、(1) が依存するすべての
.o
ファイルを列挙する方法を見つけ、foo-use
(2) それらの各ファイルを反復処理して、それぞれを.o
呼び出すことadd_dependency
でした。このアプローチの問題は、CMakeLists.txt ファイルで、実行可能ファイルが依存するオブジェクト ファイルのリストを列挙する慣用的な方法が見つからないことです。これはCMake の未解決の問題である可能性があります。
で使用される各ファイルにプロパティ
set_source_files_properties
を設定し、そのプロパティのリストに追加することも検討しました。OBJECT_DEPENDS
.cpp
foo-use
prof.data
これ(AFAICT)の問題は、私の
.cpp
ファイルのそれぞれが2つの異なる.o
ファイルを作成するために使用されることfoo-gen
ですfoo-use
。.o
リンクされるファイルに、foo-use
このコンパイル時の依存関係を持たせたいprof.data
。ただし、.o
リンク先のファイルは、コンパイル時に に依存してはfoo-gen
なりませんprof.data
。そして、私の知る限り、プロパティが現在の対象であるかどうかに応じて、2 つの値のいずれかを持つように
set_source_files_properties
設定することはできません。OBJECT_DEPENDS
foo-gen
foo-use
これを機能させるためのクリーンな(ish)方法に関する提案はありますか?