我有一个包含许多子项目的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})
但这是我想做的最后一件事。
答案 0 :(得分:4)
您可以将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
的{{1}}参数创建一个真正的依赖关系链,以便项目目标和组合目标变得过时。
更新:我太早了。事实上,cmake(至少高达2.8.9)对依赖项的工作方式如下:通过调用add_custom_target
,您无法添加依赖项,即自定义命令的add_dependencies
IOW a(生成)文件。使用OUTPUT
,您只能添加由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
。