5

Clang 3.9 のプロファイルに基づく最適化機能を使用して構築している C++ プログラムがあります。これが起こるはずのことです:

  1. インストルメンテーションを有効にしてプログラムをビルドします。
  2. そのプログラムを実行して、プロファイル データを含むファイルを作成します: prof.raw.
  3. 私は新しいファイルllvm-profdataに変換するために使用します.prof.rawprof.data
  4. いくつかの変更を加えて、同じプログラムの新しいビルドを作成します。
    • 各 .cpp ファイルを .o ファイルにコンパイルするときは、コンパイラ フラグを使用します-fprofile-use=prof.data
    • 実行可能ファイルをリンクするときにも指定します-fprofile-use

これには Gnu Makefile があり、うまく機能します。その Makefile を CMake (3.7、しかしアップグレードできます) に移植しようとしている今、私の問題が発生します。(少なくとも)Unix Makefilesジェネレーターで動作するソリューションが必要ですが、理想的にはすべてのジェネレーターで動作します。

CMake では、2 つの実行可能ターゲットを定義しました:foo-genfoo-use:

  • を実行するfoo-genと、ファイルが作成されprof.rawます。
  • からadd_custom_command作成するルールを作成するために使用します。prof.dataprof.raw

私の問題は、依存している各オブジェクト ファイルが file に依存していることを CMake に伝える方法がわからないことfoo-useですprof.data

  • 私が持っていた最も有望なアイデアは、(1) が依存するすべての.oファイルを列挙する方法を見つけ、 foo-use(2) それらの各ファイルを反復処理して、それぞれを.o呼び出すことadd_dependencyでした。

    このアプローチの問題は、CMakeLists.txt ファイルで、実行可能ファイルが依存するオブジェクト ファイルのリストを列挙する慣用的な方法が見つからないことです。これはCMake の未解決の問題である可能性があります

  • で使用される各ファイルにプロパティset_source_files_propertiesを設定し、そのプロパティのリストに追加することも検討しました。OBJECT_DEPENDS.cppfoo-useprof.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_DEPENDSfoo-genfoo-use

これを機能させるためのクリーンな(ish)方法に関する提案はありますか?

4

0 に答える 0