Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CMake:添加依赖项以动态添加自定义命令_Cmake_Depends - Fatal编程技术网

CMake:添加依赖项以动态添加自定义命令

CMake:添加依赖项以动态添加自定义命令,cmake,depends,Cmake,Depends,我有一个包含许多子项目的CMake项目。 它们中的每一个都可以使用我提供的函数生成一个包含某些特定信息的小文本文件(通过调用add_custom_命令)。 在最后一步,我想把所有这些文件合并成一个大文本文件 我创建了一个自定义命令,用于搜索创建的文件(所有文件都在一个位置)并合并它们 问题是,我想让这最后一步依赖于子项目中的所有小步骤,而实际上我不知道将提供多少文件 我的最终命令如下所示: add_custom_command(OUTPUT combination.txt

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

我创建了一个自定义命令,用于搜索创建的文件(所有文件都在一个位置)并合并它们

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

我的最终命令如下所示:

add_custom_command(OUTPUT combination.txt
                   COMMAND create combination.txt from all files from /path/)
add_custom_command(OUTPUT /path/${sub_project_name}.txt
                   COMMAND create /path/${sub_project_name}.txt)
我的“为每个子项目创建小文本文件”命令如下所示:

add_custom_command(OUTPUT combination.txt
                   COMMAND create combination.txt from all files from /path/)
add_custom_command(OUTPUT /path/${sub_project_name}.txt
                   COMMAND create /path/${sub_project_name}.txt)
当我创建这些小文件时,我想做一些事情,比如让“composition.txt”依赖于/path/${sub_project_name}.txt

所以我希望我能:

add_dependency(combination.txt /path/${sub_project_name}.txt)
然而,这只适用于目标

我还尝试将set_source_files_属性与OBJECT_dependens一起使用,但似乎不起作用(可能它打算与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
dependens
参数来创建一个真正的依赖链,从而使项目目标和组合目标过时

更新:我太早了。事实上,对于依赖项,cmake(至少在2.8.9之前)的工作方式如下:通过调用
add_dependencies
,您无法添加依赖项,该依赖项是自定义命令的
输出
(生成的)文件。使用
add_dependencies
只能添加由
add_custom_target
创建的
target
。但是,在
add_custom_target
中,您可以使用
DEPENDS
-指令依赖
add_custom_命令的输出。也就是说,这使它起作用:

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_依赖项
依赖项
,但允许使用
add_依赖项

它可以工作,但不完全如预期:每次我调用make时,所有目标(组合、项目和项目2)将重新生成-因此文件将重新生成。这并没有它能做到的那么好;)我的预期行为是不重新生成任何文件,除非有必要。根据CMake的文档,每次都会创建添加自定义目标。我希望我有一个像add_custom_命令一样工作的解决方案-只有当任何依赖项发生变化时才会生成。您使用什么作为依赖项来生成project.txt?我想cmake doc想说的是,一个定制的_目标总是被检查是否需要重建-至少对我来说它似乎是这样工作的。好吧,在正确阅读了我们是如何做的之后,我必须承认我太早了。请参阅我对答案的更新。您提供的解决方案有效,但有一个缺点:每次键入时:makecomposition-将启动一个cat命令。这是多余的;)查看add_custom_target description:“add_custom_target:添加一个没有输出的目标,这样它将始终被生成。(…)目标没有输出文件,即使命令尝试创建一个具有目标名称的文件,它也始终被视为过期。”那么,您将绑定到
add_custom_target(…取决于文件1文件2)
。这会奏效的。