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

4

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

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

默认目标的名称是什么?
我已经尝试了ALL、ALL_BUILD、MyProjectsName、DEFAULT等。
在CMake文档中查找任何内容都是一次不成功的冒险...
更新:看起来CMake是以这样的方式设计的,以至于这非常难以修复/实现:自2009年以来一直有人报告bug。谁想要一个依赖于所有目标(例如“all”目标)的自定义目标呢?或者换句话说:谁会写“make && make test”?...
2个回答

4

在CMake配置时, 默认的构建目标并不作为一个CMake目标存在。它只存在于生成的构建系统中。因此,不可能使默认目标依赖于自定义目标。


使用“ALL”选项:这将我的目标添加到所有内容中。我想将“ALL”添加到我的目标作为依赖项。这是不可能的。这里有一个来自2009年的错误报告/功能请求:http://public.kitware.com/Bug/view.php?id=8438。 - gnzlbg
请将您的问题重述为:“我希望默认目标依赖于它。” - sakra
我的问题的第一句话:“我有一个自定义目标,并且我希望它依赖于默认目标”,有什么不清楚的地方吗? - gnzlbg
我理解为“我希望我的自定义目标依赖于默认目标”。这与“我希望默认目标依赖于我的自定义目标”不同。 - sakra
你的理解是正确的。ALL 的作用是将一个自定义目标添加到 ALL 目标中,这样当你构建 ALL 目标时,该自定义目标也会被构建。但我不想要这个。我希望在输入“make my_target”时能够构建 ALL 目标。也就是说,我希望“make my_target”等同于“make && make my_target”。 - gnzlbg

1
我认为可能的解决方案强烈取决于使用情况。例如,如果这是在系统构建后执行测试,则应使用CTest而不是直接调用make
您需要添加以下内容到您的CMakeLists.txt文件中:
 add_test(NAME foo COMMAND ...)

然后使用CTest进行构建和执行:
 ctest --build-and-test ...

更加普遍地说,不考虑为什么要这样做的问题 - 我认为最好的方法是只命名并依赖于具体的目标依赖项,而不是仅仅使用所有目标 - 我只想添加两种可能来实现你想要做的事情。
其中一种方法是确定/跟踪讨论此处使用的所有目标列表。对于库目标,它将像这样查找(获取您自己/私有的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})

编辑:CMake 3.7发布了全局BUILDSYSTEM_TARGETS属性。

第二种方法(不太理想)要求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>
)

CMake 默认将所有内容放入 ALL 目标中(例如外部项目)。通常构建任何内容都需要先构建 ALL 目标:我宁愿写 make tests 而不是 make && make tests。随着目标数量的增加,这个问题会变得更糟。用户定义的目标不能依赖于任何内置目标:ALL、INSTALL 等。我发现的“最简单”的解决方案是将添加到 ALL 中的任何内容收集到不同的目标中,然后添加这些目标的依赖关系。虽然不太方便,但可以解决问题。 - gnzlbg
如果你正在引用 include_external_msproject() 命令,我承认我已经对我的 CMake 2.8.10 版本进行了补丁修复,将 EXCLUDE_FROM_ALL 属性默认设置为 TRUE(请参见 cmIncludeExternalMSProjectCommand.cxx)。而且我通常更喜欢将 EXCLUDE_FROM_ALL 设置为 TRUE(例如通过相应的目录属性)。这允许在复杂的构建环境中仅选择编译特定目标及其依赖项。但是当我正确设置跨目标依赖关系时,它对我非常有效(包括使用并行构建引擎的 make 环境)。 - Florian
实际上我是在提到"ExternalProject_Add",但是没错,EXCLUDE_FROM_ALL是更好的默认值 :) - gnzlbg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接