当前位置 : 主页 > 手机开发 > 其它 >

CMake:动态地向add_custom_command添加依赖项

来源:互联网 收集:自由互联 发布时间:2021-06-22
我有一个包含许多子项目的CMake项目. 他们每个人都可以使用我提供的函数来生成带有某些特定信息的小文本文件(通过调用add_custom_command). 在最后一步,我想将所有这些文件合并为一个大
我有一个包含许多子项目的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_target与正确的依赖关系定义一起使用,而不是使用add_custom_command(因此不会每次都构建它).

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)

再次:确保您使用add_custom_target的DEPENDS参数创建一个真正的依赖关系链,以便项目目标和组合目标变得过时.

更新:我太早了.事实上,cmake(至少高达2.8.9)对依赖项的工作原理如下:通过调用add_dependencies,您无法添加依赖项,该依赖项是自定义命令IOW(生成)文件的OUTPUT.使用add_dependencies,您只能添加add_custom_target创建的目标.但是在add_custom_target中,您可以使用DEPENDS-directive依赖于add_custom_command的输出.这说它使它工作:

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.

网友评论