我有一个CMake项目与许多子项目。 他们每个人都可以使用我提供的函数来生成一个包含某些特定信息的小文本文件(通过调用add_custom_command)。 在最后一步,我想将所有这些文件合并成一个大文本文件。CMake:添加依赖add_custom_command动态
我创建了一个自定义命令,用于搜索创建的文件(全部在一个地方)并合并它们。
问题是,我想让这个最后一步依赖于子项目中的所有小步骤,而我实际上并不知道将提供多少个文件。
我最后的命令如下:
add_custom_command(OUTPUT combination.txt
COMMAND create combination.txt from all files from /path/)
和我创建小的文本文件的for-each-子项目命令看起来像:
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})
但是这是我想做的最后一件事。
它会工作,但不完全如预期: 每次我打电话make,所有目标(组合,项目和project2)将被重建 - 所以文件将被重新生成。 这不是很好,因为它可能;) 我的预期行为是不重新生成任何文件,除非它的必要。 根据CMake的文档 - add_custom_target每次都在构建。 我希望我有一个解决方案作为add_custom_command工作 - 只有当任何依赖关系发生变化时才构建。 –
你用什么作为依赖来生成project.txt?我认为cmake-doc想说的是,一个custom_target总是被检查是否需要重建 - 至少它对我来说似乎是这样工作的。 –
那么,在正确阅读了我们的做法之后,我必须承认我太早了。看到我的答案更新。 –