7

我有一个包含许多子项目的 CMake 项目。他们每个人都可以使用我提供的函数来生成一个包含某些特定信息的小文本文件(通过调用 add_custom_command)。在最后一步,我想将所有这些文件合并到一个大文本文件中。

我创建了一个自定义命令,它搜索创建的文件(都在一个地方)并合并它们。

问题是我想让这最后一步取决于子项目中的所有小步骤,而我实际上并不知道将提供多少文件。

我的最终命令如下所示:

add_custom_command(OUTPUT combination.txt
                   COMMAND create combination.txt from all files from /path/)

我的 create-small-text-file-for-each-subproject 命令看起来像:

add_custom_command(OUTPUT /path/${sub_project_name}.txt
                   COMMAND create /path/${sub_project_name}.txt)

当我创建这些小文件时,我想做一些事情,比如让“combination.txt”依赖于 /path/${sub_project_name}.txt

所以我希望我可以:

add_dependency(combination.txt /path/${sub_project_name}.txt)

但是,这只适用于目标。

我也尝试过将 set_source_files_properties 与 OBJECT_DEPENDS 一起使用,但它似乎不起作用(也许它打算与 add_target 的 cpp 文件一起使用?)

我看到的最后一种让它工作的方法是使用一个缓存变量,它会累积所有这些小文件路径,然后像这样使用它:

add_custom_command(OUTPUT combination.txt
                   COMMAND create combination.txt from all files from /path/
                   DEPENDS ${all_small_files_list})

但这是我想做的最后一件事。

4

1 回答 1

5

而不是使用add_custom_command你可以使用add_custom_target正确的依赖定义(所以它不是每次都构建)。

add_custom_target(project
                   COMMAND touch project.txt)

add_custom_target(project2
                   COMMAND touch project2.txt)

add_custom_target(combination
                   COMMAND cat project.txt project2.txt > combination.txt)

add_dependencies(combination project2)
add_dependencies(combination project)

add_executable(t t.c)
add_dependencies(t combination.txt)

再说一遍:确保您使用的DEPENDS参数add_custom_target来创建一个真正的依赖链,以便项目目标和组合目标过时。

更新:我太早了。事实上,cmake(至少到 2.8.9)对于依赖项的工作方式如下:通过调用add_dependencies你不能添加一个依赖项,它是OUTPUT一个自定义命令 IOW 一个(生成的)文件的依赖项。与add_dependencies您只能添加targetadd_custom_target. 但是,在 a 中,您可以使用-directiveadd_custom_target依赖于的输出。也就是说,这使它起作用:add_custom_commandDEPENDS

add_custom_command(OUTPUT project.txt
                   COMMAND uptime >> project.txt MAIN_DEPENDENCY t2.c)
add_custom_target(project DEPENDS project.txt)

add_custom_target(combination
                   COMMAND cat project.txt project2.txt > combination.txt)
add_dependencies(combination project)

这将使组合目标始终重新生成,因为它没有MAIN_DEPENDENCYor DEPENDS,但add_dependencies允许使用 of。

于 2012-10-16T12:29:08.013 回答