【问题标题】:How to add a CMake custom target for all submodules如何为所有子模块添加 CMake 自定义目标
【发布时间】:2012-07-17 14:04:01
【问题描述】:

简介:
有谁知道是否可以在 CMake 中添加一个包含在所有子模块中的 custom_target ?一个示例是如何将 Install/Run_Tests/Package 目标添加到构建中的每个子模块。

更多详情:
我的场景是这样的目录结构:

项目 --CMakeLists.txt --SubMod A --CMakeListsA.txt --SubMod B --CMakeListsB.txt

我想将用于 doxygen 生成的 custom_target 添加到顶级 CMakeLists.txt 文件中,并将其包含在子模块 A 和 B 中。所有模块之间的命令将完全相同。

我可以将 custom_target 添加到每个子模块的 cmake 文件中,但这似乎是错误的。另一个问题是,如果我让 CMake 生成 Visual Studio 解决方案,则会与已经存在的“doc”项目发生冲突(如果打开顶级解决方案)。然而,CMake 提供的目标足够聪明,不会被包含两次。

【问题讨论】:

    标签: cmake


    【解决方案1】:

    我认为您能做的最好的事情就是将add_custom_target 包装在您的顶级 CMakeLists.txt 中定义的函数中,并在每个 CMakeLists.txt 中使用它。

    为避免重复目标名称的问题,您可以定义如下函数:

    function(AddDoxygenTarget)
      add_custom_target(Doxygen${PROJECT_NAME} ...)
    endfunction()
    

    这取决于每个子模块的 CMakeLists.txt 是否有 project 命令。如果没有,您可以使用每个子目录的名称:

      get_filename_component(SubDirName ${CMAKE_CURRENT_LIST_DIR} NAME)
      add_custom_target(Doxygen${SubDirName} ...)
    

    【讨论】:

    • 嗯,这确实解决了大部分问题,但并不理想。但是,我不完全确定是否有我所期望的更好的答案。
    • @JMcCarty 是的,确实可能有更好的方法。我会稍等片刻,看看是否有一个 Kitware 人插话。
    • 看起来没有其他人插话,这确实完成了我大部分想要的。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    • 2020-01-13
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多