【问题标题】:CMake: add dependency to add_custom_command dynamicallyCMake:动态添加对 add_custom_command 的依赖
【发布时间】:2012-10-16 10:51:19
【问题描述】:

我有一个包含许多子项目的 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})

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

【问题讨论】:

    标签: cmake build-dependencies cmake-custom-command


    【解决方案1】:

    您可以使用带有正确依赖定义的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_targetDEPENDS 参数来创建真正的依赖链,以便项目目标和组合目标过时。

    更新:我太早了。事实上,cmake(至少到 2.8.9)对于依赖项的工作方式如下:通过调用 add_dependencies,您不能添加一个依赖项,即自定义命令 IOW(生成的)文件的 OUTPUT。使用add_dependencies,您只能添加由add_custom_target 创建的target。但是,在add_custom_target 中,您可以使用DEPENDS 指令依赖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

    【讨论】:

    • 它会工作,但并不完全像预期的那样:每次我调用 make 时,所有目标(组合、项目和 project2)都将被重建 - 因此文件将被重新生成。这并不像它可能的那么好;)对我来说,预期的行为是除非必要,否则不要重新生成任何文件。根据 CMake 的文档 - add_custom_target 每次都在构建。我希望我有一个作为 add_custom_command 工作的解决方案 - 只有在任何依赖项发生更改时才会构建。
    • 你使用什么作为依赖来生成project.txt?我认为 cmake-doc 想说的是,总是检查 custom_target 是否必须重建 - 至少它对我来说似乎是这样的。
    • 好吧,在正确阅读了我们的做法之后,我必须承认我为时过早。请参阅我对答案的更新。
    • 您提供的解决方案有效,但有一个缺点:每次您键入:make combination - 将启动 cat 命令。这是多余的 ;) 看看 add_custom_target 描述:“add_custom_target: 添加一个没有输出的目标,所以它总是会被构建。(...) 目标没有输出文件并且总是被认为是过时的,即使命令尝试使用目标名称创建文件。”
    • 那么,您将被绑定到add_custom_target(... DEPENDS file1 file2)。这会奏效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    • 2023-03-03
    相关资源
    最近更新 更多