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)
默认目标的名称是什么?
我试过ALL
、ALL_BUILD
、MyProjectsName
、DEFAULT
、...
在 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 && 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:从“make install [all]”中排除自定义安装目标