我有一个包含许多子项目的 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})
但这是我最不想做的事情。
最佳答案
而不是使用 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
您只能添加 target
由 add_custom_target
创建.然而在 add_custom_target
您可以依赖 add_custom_command
的输出通过使用 DEPENDS
-指示。也就是说,这使它起作用: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_DEPENDENCY
或 DEPENDS
, 但 add_dependencies
的用法被允许。
关于CMake:动态添加对 add_custom_command 的依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12913077/