5

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

  1. 我在启用检测的情况下构建程序。
  2. 我运行该程序,创建一个带有 profile-data: 的文件prof.raw
  3. llvm-profdata用来转换prof.raw为新文件,prof.data.
  4. 我为同一个程序创建了一个新版本,并进行了一些更改:
    • 将每个 .cpp 文件编译为 .o 文件时,我使用编译器标志-fprofile-use=prof.data
    • 链接可执行文件时,我还指定-fprofile-use.

我为此有一个 Gnu Makefile,效果很好。现在我的问题出现了,因为我正在尝试将该 Makefile 移植到 CMake(3.7,但我可以升级)。我需要(至少)使用 Unix Makefiles 生成器的解决方案,但理想情况下它适用于所有生成器。

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

  • 执行时foo-gen,它会创建prof.raw文件。
  • add_custom_command用来创建一个prof.dataprof.raw.

我的问题是我不知道如何告诉 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文件都用于创建两个不同的.o文件:一个foo-gen用于foo-use. 我希望.o链接到的文件在foo-use编译时依赖于prof.data; 但是.o链接到的文件foo-gen不能编译时依赖prof.data.

    而且 AFAIK,set_source_files_properties不允许我将OBJECT_DEPENDS属性设置为具有两个值之一,这取决于当前是否foo-gen感兴趣foo-use

有什么建议可以用干净的(ish)方法来完成这项工作吗?

4

0 回答 0