我有一个使用 Clang 3.9 的配置文件引导优化功能构建的 C++ 程序。这是应该发生的事情:
- 我在启用检测的情况下构建程序。
- 我运行该程序,创建一个带有 profile-data: 的文件
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 中,我定义了两个可执行目标:foo-gen
和foo-use
:
- 执行时
foo-gen
,它会创建prof.raw
文件。 - 我
add_custom_command
用来创建一个prof.data
从prof.raw
.
我的问题是我不知道如何告诉 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
文件都用于创建两个不同的.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)方法来完成这项工作吗?