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

Han*_*rén 6 cmake

我有一个CMake的构建与一群不同的目标A,B,C,等的外部应用程序的任务是建设,目前通过调用这样做

cmake --build .
Run Code Online (Sandbox Code Playgroud)

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

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

有解决这个问题的好方法吗?

Com*_*sMS 10

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

cmake --build . --target Library1 Library2
Run Code Online (Sandbox Code Playgroud)


小智 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()
Run Code Online (Sandbox Code Playgroud)

然后调用

$ cmake -H. -Bbuild -DDEMO_ENABLE_TARGETS="B;C"
$ cmake --build build --target enabled_targets
Run Code Online (Sandbox Code Playgroud)

且仅B且C将被建造。

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