我有一个包含多个不同目标的CMake构建:A
,B
,C
等。
外部应用程序负责构建,并且目前是通过调用来完成的。
cmake --build .
然而,这会构建所有目标,有时我只想构建一个子集,比如A
和B
但不包括C
。
--target
标志只能给出一次,并且只接受一个单独的目标。我想我可以让CMake生成适当的Makefile,然后显式调用
make A B
,但这会削弱cmake --build
跨平台构建系统的好处。有没有什么好的解决方法?
我有一个包含多个不同目标的CMake构建:A
,B
,C
等。
外部应用程序负责构建,并且目前是通过调用来完成的。
cmake --build .
然而,这会构建所有目标,有时我只想构建一个子集,比如A
和B
但不包括C
。
--target
标志只能给出一次,并且只接受一个单独的目标。make A B
,但这会削弱cmake --build
跨平台构建系统的好处。CMake 3.15版本新增了此功能的支持。只需按以下方式在命令行中列出所有目标:
cmake --build . --target Library1 Library2
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
只有B
和C
将被构建。
请注意,您必须将DEMO_ENABLE_TARGETS
的内容指定为列表,否则会出现错误。
cmake -H<src_dir> -B<bin_dir>
这样的命令,或者更传统的<bin_dir>
中的cmake ..
命令。 - user5164080A
和B
。但是,没有命令行选项可以构建作为列表给出的多个目标。 - FlorianEXCLUDE_FROM_ALL
目录/目标属性来定义包含在ALL
中的目标。 - Florian