CMake的默认构建目标的名称是什么?

时间:2015-05-29 14:39:56

标签: c++ c build cmake

我有一个自定义目标,我希望它依赖于默认目标(使用make构建的目标)。

add_custom_target(foo ....)
add_dependency(foo default_target_name_goes_here)

默认目标的名称是什么?

我已经尝试ALLALL_BUILDMyProjectsNameDEFAULT,...

在CMake文档中查找任何内容总是一次不成功的冒险......

更新:似乎CMake的设计方式非常难以修复/实施:bugreport getting +1's since 2009。谁确实希望拥有一个依赖于all目标的自定义目标?或换句话说:谁曾写过make && make test?...

2 个答案:

答案 0 :(得分:2)

默认构建目标在CMake配置时不作为CMake目标存在。它仅存在于生成的构建系统中。因此,无法使默认目标取决于自定义目标。

答案 1 :(得分:0)

我认为可能的解决方案很大程度上取决于用例。例如。如果这是用于在系统构建后执行测试,则可以使用CTest而不是直接调用make

您要在CMakeLists.txt中添加:

 add_test(NAME foo COMMAND ...)

然后使用CTest构建和执行:

 ctest --build-and-test ...

更一般地说,并没有考虑你为什么要这样做的问题 - 我认为最好的事情就是仅仅命名和依赖具体的目标依赖,而不仅仅是采用ALL目标 - 我只是想要添加两种可能性来做你想做的事。

一种方法是确定/跟踪所讨论的所有目标的列表here。这看起来像是对于像这样的图书馆目标(获得你自己的/私人GlobalTargetList):

macro(add_library _target)
    _add_library(${_target} ${ARGN})
    set_property(GLOBAL APPEND PROPERTY GlobalTargetList ${_target})
endmacro()

并使用

在主CMakeLists.txt的末尾使用它
get_property(_allTargets GLOBAL PROPERTY GlobalTargetList)
add_dependencies(foo ${_allTargets})

修改:全局BUILDSYSTEM_TARGETS属性已与CMake 3.7一起发布

第二种 - 不太有利的方法确实要求foo目标不是ALL构建的一部分(否则你最终会无限循环):

add_custom_target(foo)
set_target_properties(foo PROPERTIES EXCLUDE_FROM_ALL 1) 

add_custom_command(
    TARGET foo
    PRE_BUILD
    COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target ALL_BUILD --config $<CONFIGURATION>
)