【问题标题】:How to restrict cmake commands based on which target is built如何根据构建的目标限制 cmake 命令
【发布时间】:2019-07-14 08:20:03
【问题描述】:

我有一个生成多个可执行文件的 cmake 项目。我想将每个可执行文件打包在单独的 Docker 容器中,所以在 Dockefile 中,我只构建了我需要的目标:

RUN mkdir build \
    && cd build \
    && cmake /app/project -DCMAKE_BUILD_TYPE=Release
    && make -j 2 myExecutable \
    && make install/fast

这按预期工作,但我遇到了conan cmake integration 的问题。安装是在调用 cmake 时完成的,而不是在实际构建期间完成 - 这意味着无论我要实际构建哪个目标,都会调用我的 cmake 文件中存在的所有 conan 安装调用 - 因此安装的软件包比必要的要多。

# for every target
# include conan dependencies (each target has its own conanfile.txt)
conan_cmake_run(CONANFILE conanfile.txt
        BASIC_SETUP CMAKE_TARGETS
        BUILD_TYPE "${CMAKE_BUILD_TYPE}"
        BUILD outdated
        ${update_conan}
        )
conan_target_link_libraries(${PROJECT_NAME})

有没有办法让 cmake 调用取决于我实际要构建的目标?

【问题讨论】:

  • 如果我正确理解了柯南打包机制,那么需要先构建一个包,然后才能从中提取链接库列表包含目录乙>。因此,对于柯南来说,将包的构建推迟到用户项目构建之前为时已晚。配置 CMake 项目后,它应该包含完整的链接库列表和搜索标题的目录每个目标,无论目标是否被构建。
  • @Tsyvarev 是的,这正是问题所在。它需要在配置时执行此操作。但也许有一种通用的 cmake 方式来说明首先要配置哪些目标,并以此为条件调用。理想情况下,通过使用一些内置机制,而不仅仅是定义一个选项。

标签: cmake conan


【解决方案1】:

不幸的是,宏conan_cmake_run 没有区分涉及哪个目标,甚至没有区分它之前执行过的目标。您可以使用 CMake 选项来运行或不运行 conan_cmake_run

此外,您可以通过https://github.com/conan-io/cmake-conan/issues/105https://github.com/conan-io/cmake-conan/issues/105 问题对您的请求进行评论/投票

问候!

【讨论】:

  • 这就是我最终要做的,我创建了一个选项,允许选择要配置为构建的组件。
猜你喜欢
  • 1970-01-01
  • 2017-04-21
  • 1970-01-01
  • 1970-01-01
  • 2017-10-07
  • 1970-01-01
  • 2019-10-02
  • 2012-01-23
相关资源
最近更新 更多