【问题标题】:Cmake wildcard for External Project外部项目的 Cmake 通配符
【发布时间】:2018-04-03 13:14:51
【问题描述】:

我想通过 ProjectSettings.cmake 文件将一些设置传递给外部项目。我知道我可以为此使用CMAKE_PROJECT_<PROJECT-NAME>_INCLUDE(通过CMAKE_ARGS 传递给ExternalProject_add())。

但我必须为我的主要项目构建的许多外部项目执行此操作,并且不想继续重复它 - 我有一个为 CMAKE_ARGS 定义的通用变量,目前已传递给 ExternalProject_Add() 的每个调用,我只想追加到这个。

CMAKE_PROJECT_<PROJECT-NAME>_INCLUDEPROJECT-NAME 字段是否有通配符机制?

或者有没有一种方法可以让我想要构建的所有外部项目的 CMakeLists.txt 包含我的 ProjectSettings.cmake?请注意,我无权更改所有这些 - 因此需要从父项目中操作它们。

【问题讨论】:

    标签: cmake


    【解决方案1】:

    集中包装重复出现的代码是CMake macrosfunctions的主要目的之一。

    所以在你的情况下,这看起来像这样:

    macro(My_ExternalProject_Add _name)
        ExternalProject_Add(
            ${_name}
            CMAKE_ARGS -DCMAKE_PROJECT_${_name}_INCLUDE:FILEPATH=ProjectSettings.cmake
            ${ARGN}
        )
    endmacro()
    

    ARGN 将添加_name 之后给出的所有参数。因此,只需将macro() 放在您的根CMakeLists.txt 文件中,并将所有ExternalProject_Add() 调用替换为My_ExternalProject_Add()

    或者,您可以使用 CMAKE_ARGS -C ProjectSettings.cmake initial cache command line option 为外部项目预加载设置(这样您就不需要项目名称了)。

    参考文献

    【讨论】:

    • @GaneshSathyanarayanan 很高兴为您提供帮助,欢迎来到 Stack Overflow。如果此答案(或任何其他答案)解决了您的问题,请将其标记为已接受。
    • 如果包装是 cmake 的中心目的,那么 cmake 将支持更好的参数引用。每个人都开发了自己的小语言,然后甚至无法将参数列表转发到参数可能为空的子调用......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2023-04-10
    相关资源
    最近更新 更多