2012-10-16 59 views
5

我有一个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}) 

但是这是我想做的最后一件事。

回答

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) 

还是那句话:请确保您使用的add_custom_targetDEPENDS参数来创建一个真正的依赖关系链,使项目目标,因此组合目标变得过时。

UPDATE:我太早了。实际上,cmake(至少高达2.8.9)的依赖性如下:通过调用add_dependencies,不能添加依赖项,这是一个自定义命令IOW(生成)文件的OUTPUT。通过add_dependencies,您只能添加target,由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_DEPENDENCYDEPENDS,但add_dependencies的使用是允许的。

+0

它会工作,但不完全如预期: 每次我打电话make,所有目标(组合,项目和project2)将被重建 - 所以文件将被重新生成。 这不是很好,因为它可能;) 我的预期行为是不重新生成任何文件,除非它的必要。 根据CMake的文档 - add_custom_target每次都在构建。 我希望我有一个解决方案作为add_custom_command工作 - 只有当任何依赖关系发生变化时才构建。 –

+0

你用什么作为依赖来生成project.txt?我认为cmake-doc想说的是,一个custom_target总是被检查是否需要重建 - 至少它对我来说似乎是这样工作的。 –

+0

那么,在正确阅读了我们的做法之后,我必须承认我太早了。看到我的答案更新。 –