如何表达CMake 3.7中的PGO依赖关系?

时间:2017-02-08 22:39:51

标签: c++ cmake clang pgo

我有一个C ++程序,我使用Clang 3.9的配置文件引导优化功能构建。以下是应该发生的事情:

  1. 我在启用检测的情况下构建程序。
  2. 我运行该程序,创建一个包含个人资料数据的文件:prof.raw
  3. 我使用llvm-profdataprof.raw转换为新文件prof.data
  4. 我创建了同一个程序的新版本,并进行了一些更改:
    • 将每个.cpp文件编译为.o文件时,我使用编译器标记-fprofile-use=prof.data
    • 链接可执行文件时,我还指定了-fprofile-use
  5. 我有一个Gnu Makefile,它很好用。我的问题出现了,我试图将Makefile移植到CMake(3.7,但我可以升级)。我需要解决方案(至少)使用Unix Makefiles生成器,但理想情况下它适用于所有生成器。

    在CMake中,我定义了两个可执行目标:foo-genfoo-use

    • 执行foo-gen时,会创建prof.raw文件。
    • 我使用add_custom_command创建规则以从prof.data创建prof.raw

    我的问题是我无法弄清楚如何告诉CMake foo-use所依赖的每个目标文件都依赖于文件{{1} }。

    • 我最有希望的想法是(1)找到一种方法来枚举prof.data依赖的所有.o个文件,然后(2)迭代每个文件那些foo-use个文件,每个文件都调用add_dependency

      这种方法的问题是我无法在我的CMakeLists.txt文件中找到一种惯用的方法来枚举可执行文件所依赖的目标文件列表。这可能是be an open problem with CMake

    • 我还考虑使用set_source_files_properties.o使用的每个.cpp文件上设置OBJECT_DEPENDS属性,并将foo-use添加到prof.data财产清单。

      此问题(AFAICT)是我的每个.cpp文件都用于创建两个不同的.o文件:一个用于foo-gen,另一个用于foo-use。我希望链接到.o的{​​{1}}文件在foo-use上具有编译时依赖性;但链接到prof.data的{​​{1}}文件必须.o具有编译时依赖性。

      AFAIK,foo-gen并不允许我将prof.data属性设置为具有两个值之一,具体取决于set_source_files_propertiesOBJECT_DEPENDS是否为当前感兴趣的目标。

    有任何关于干净(ish)方法的建议吗?

0 个答案:

没有答案