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

Posted

技术标签:

【中文标题】CMake 的默认构建目标的名称是啥?【英文标题】:What is the name of CMake's default build target?CMake 的默认构建目标的名称是什么? 【发布时间】:2015-05-29 14:39:56 【问题描述】:

我有一个自定义目标,我希望它依赖于默认目标(使用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?...

【问题讨论】:

【参考方案1】:

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

【讨论】:

“使用 ALL 选项”:这会将我的目标添加到 ALL。我想将 ALL 作为依赖项添加到我的目标中。这是无法做到的。这里有一个 2009 年的错误报告/功能请求:public.kitware.com/Bug/view.php?id=8438 将您的问题改写为“我希望默认目标依赖它”。 我的问题的第一句话有什么不清楚的地方:“我有一个自定义目标,我希望它依赖于默认目标”? 我将其解读为“我希望它(我的自定义目标)依赖于默认目标”。这与“我希望默认目标依赖于我的自定义目标”不同。 您的阅读是正确的。 ALL 所做的是将自定义目标添加到ALL 目标,这样当您构建 ALL 目标时,也会构建该自定义目标。我不想要这个。我希望在编写make my_target 时构建ALL 目标。即:我希望make my_target 等价于make && make my_target【参考方案2】:

我认为可能的解决方案很大程度上取决于用例。例如。如果这是为了在系统构建后执行测试,您将使用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>
)

【讨论】:

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

以上是关于CMake 的默认构建目标的名称是啥?的主要内容,如果未能解决你的问题,请参考以下文章

CMake:取决于构建类型的默认标志

CMake:从“make install [all]”中排除自定义安装目标

如果没有指定目标,“make”应用程序如何知道要构建的默认目标?

CMake 重新编译

cmake设置默认静态链接库

Summernote 的默认文本区域名称是啥?