【问题标题】:How can I build multiple targets using cmake --build如何使用 cmake --build 构建多个目标
【发布时间】:2017-11-29 13:04:19
【问题描述】:

我有一个包含许多不同目标的 CMake 构建 ABC 等。 外部应用程序负责构建,目前通过调用

cmake --build .

但是,这会构建 所有 目标,有时我只想构建一个子集,例如 AB 而不是 C--target 标志只能给出一次,并且只接受一个目标。

我想我可以让 CMake 生成适当的 Makefile,然后显式调用 make A B,但这会带走 cmake --build 与构建系统无关的好处。

有什么好办法解决这个问题吗?

【问题讨论】:

  • 每次您想要构建不同的目标子集时,您是否可以运行配置和生成步骤?如果是,那么答案很简单。 “配置和生成”是指 cmake -H<src_dir> -B<bin_dir> 之类的东西,或更传统的 cmake .. 来自 <bin_dir>
  • 您可以添加另一个具有依赖关系的自定义目标,例如AB。但是不,没有命令行选项可以构建以列表形式给出的多个目标。
  • 忘了提到您还可以使用EXCLUDE_FROM_ALL 目录/目标属性定义ALL 中包含的目标。
  • @light2yellow 我已经在每次构建之前运行了一个配置/生成步骤,所以这不是问题。你能更具体地说明这对我有什么帮助吗?
  • @Florian 不,我不想指定自定义目标,因为所需的组合会很大而且很烦人。

标签: cmake


【解决方案1】:

CMake 3.15 版增加了对此功能的支持。只需在命令行中列出所有目标,如下所示:

cmake --build . --target Library1 Library2

【讨论】:

    【解决方案2】:

    也许不是“最好”的方式,但绝对的解决方案是引入自定义顶级目标并使所需的目标依赖于它。例如:

    cmake_minimum_required(VERSION 3.9) # can be lower
    
    project(demo LANGUAGES C)
    
    file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/a.c"
        [[
        #include <stdio.h>
        int main(void) { printf("a\n"); return 0; }
        ]])
    file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/b.c"
        [[
        #include <stdio.h>
        int main(void) { printf("b\n"); return 0; }
        ]])
    file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/c.c"
        [[
        #include <stdio.h>
        int main(void) { printf("c\n"); return 0; }
        ]])
    
    add_executable(A "${CMAKE_CURRENT_BINARY_DIR}/a.c")
    add_executable(B "${CMAKE_CURRENT_BINARY_DIR}/b.c")
    add_executable(C "${CMAKE_CURRENT_BINARY_DIR}/c.c")
    
    set(DEMO_ENABLE_TARGETS "" CACHE
        STRING "Targets to be built in demo simultaneously (default: none)")
    
    if(NOT "${DEMO_ENABLE_TARGETS}" STREQUAL "")
        add_custom_target(enabled_targets)
        foreach(target IN LISTS DEMO_ENABLE_TARGETS)
            add_dependencies(enabled_targets ${target})
        endforeach()
    endif()
    

    然后调用

    $ cmake -H. -Bbuild -DDEMO_ENABLE_TARGETS="B;C"
    $ cmake --build build --target enabled_targets
    

    只有BC 会被构建。

    请注意,您必须将DEMO_ENABLE_TARGETS 的内容指定为列表,否则会中断。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-26
      • 1970-01-01
      • 2017-10-07
      • 1970-01-01
      • 1970-01-01
      • 2012-10-15
      • 1970-01-01
      • 2012-04-30
      相关资源
      最近更新 更多