如何使用cmake --build构建多个目标

19

我有一个包含多个不同目标的CMake构建:ABC等。 外部应用程序负责构建,并且目前是通过调用来完成的。

cmake --build .
然而,这会构建所有目标,有时我只想构建一个子集,比如AB但不包括C--target标志只能给出一次,并且只接受一个单独的目标。
我想我可以让CMake生成适当的Makefile,然后显式调用make A B,但这会削弱cmake --build跨平台构建系统的好处。
有没有什么好的解决方法?

你是否愿意每次构建不同的目标子集时都运行配置和生成步骤?如果是,那么答案就很简单了。所谓的“配置和生成”是指像 cmake -H<src_dir> -B<bin_dir> 这样的命令,或者更传统的 <bin_dir> 中的 cmake .. 命令。 - user5164080
你可以添加另一个自定义目标,并将其依赖于例如 AB。但是,没有命令行选项可以构建作为列表给出的多个目标。 - Florian
忘了提到,您还可以使用EXCLUDE_FROM_ALL目录/目标属性来定义包含在ALL中的目标。 - Florian
@light2yellow,我已经在每次构建之前运行了配置/生成步骤,所以这不是问题。你能具体说明一下它如何帮助我吗? - Hannes Ovrén
@Florian 不,我不想要指定自定义目标,因为所需的组合会很大且令人讨厌。 - Hannes Ovrén
是的,我把一个例子作为答案发布了。 - user5164080
2个回答

34

CMake 3.15版本新增了此功能的支持。只需按以下方式在命令行中列出所有目标:

cmake --build . --target Library1 Library2

4
也许不是最好的方式,但绝对是一种解决方案:引入自定义顶级目标,并使所需的目标依赖于它。例如:
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的内容指定为列表,否则会出现错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接