CMake 的默认构建目标的名称是什么?
What is the name of CMake's default build target?
我有一个自定义目标,我希望它依赖于默认目标(使用 make
构建的目标)。
add_custom_target(foo ....)
add_dependency(foo default_target_name_goes_here)
默认目标的名称是什么?
我试过 ALL
、ALL_BUILD
、MyProjectsName
、DEFAULT
、...
在 CMake 文档中查找任何内容始终是一次不成功的冒险...
更新:似乎 CMake 的设计方式使得这非常难以 fix/implement:bugreport getting +1's since 2009。谁确实想要一个依赖于 all
目标的自定义目标?或者换句话说:谁写过 make && make test
?...
默认构建目标在 CMake 配置时不作为 CMake 目标存在。它仅存在于生成的构建系统中。因此,默认目标不可能依赖于自定义目标。
我认为可能的解决方案在很大程度上取决于用例。例如。如果这是为了在构建系统后执行测试,您将使用 CTest
而不是直接调用 make
。
在您的 CMakeLists.txt 中添加:
add_test(NAME foo COMMAND ...)
然后使用CTest
构建和执行:
ctest --build-and-test ...
更一般地说,不考虑你为什么要这样做的问题 - 我认为最好的办法是只命名并依赖具体的目标依赖关系,而不是只采用 ALL
目标 - 我只是想添加两种可能性来做你想做的事。
一个是 determine/track 所讨论的所有目标列表 here。这看起来例如对于这样的库目标(获取 own/private 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>
)
我有一个自定义目标,我希望它依赖于默认目标(使用 make
构建的目标)。
add_custom_target(foo ....)
add_dependency(foo default_target_name_goes_here)
默认目标的名称是什么?
我试过 ALL
、ALL_BUILD
、MyProjectsName
、DEFAULT
、...
在 CMake 文档中查找任何内容始终是一次不成功的冒险...
更新:似乎 CMake 的设计方式使得这非常难以 fix/implement:bugreport getting +1's since 2009。谁确实想要一个依赖于 all
目标的自定义目标?或者换句话说:谁写过 make && make test
?...
默认构建目标在 CMake 配置时不作为 CMake 目标存在。它仅存在于生成的构建系统中。因此,默认目标不可能依赖于自定义目标。
我认为可能的解决方案在很大程度上取决于用例。例如。如果这是为了在构建系统后执行测试,您将使用 CTest
而不是直接调用 make
。
在您的 CMakeLists.txt 中添加:
add_test(NAME foo COMMAND ...)
然后使用CTest
构建和执行:
ctest --build-and-test ...
更一般地说,不考虑你为什么要这样做的问题 - 我认为最好的办法是只命名并依赖具体的目标依赖关系,而不是只采用 ALL
目标 - 我只是想添加两种可能性来做你想做的事。
一个是 determine/track 所讨论的所有目标列表 here。这看起来例如对于这样的库目标(获取 own/private 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>
)