我的CMake构建包含许多不同的目标A
,B
,C
等。
外部应用程序的任务是构建,目前通过调用
cmake --build .
但是,这会构建所有目标,有时我只想构建一个子集,例如A
和B
但不是C
。
--target
标志只能给出一次,只接受一个目标。
我想我可以让CMake生成相应的Makefile,然后显式调用make A B
,但这会消除cmake --build
与构建系统无关的好处。
有解决这个问题的好方法吗?
答案 0 :(得分:4)
CMake版本3.15添加了对此功能的支持。只需在命令行上列出所有目标,如下所示:
cmake --build . --target Library1 Library2
答案 1 :(得分:0)
也许不是“最好的”方式,但绝对一个解决方案是引入自定义顶级目标并使所需目标依赖于它。例如:
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
的内容指定为列表,否则它将会中断。