2015-05-29 83 views
0

我有一个自定义目标,我希望它依赖于默认目标(使用make构建的目标)。CMake默认构建目标的名称是什么?

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

默认目标的名称是什么?

我试过ALLALL_BUILDMyProjectsNameDEFAULT,...

查找CMake的文档中的任何东西总是不成功的冒险...

UPDATE:看来CMake的目的是在这样的这是一个非常难以修复/实施的方式:bugreport getting +1's since 2009。谁确实希望有一个自定义目标取决于例如all目标?或换句话说:谁写过make && make test?...

回答

2

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

+0

“使用ALL选项”:这将我的目标添加到ALL。我想将ALL作为依赖项添加到我的目标中。这是无法完成的。 2009年有一个bugreport /功能要求:http://public.kitware.com/Bug/view.php?id=8438 – gnzlbg

+0

将你的问题改为“我希望默认目标依赖它”。 – sakra

+0

我的问题的第一句话里有什么不清楚的地方:“我有一个自定义目标,我希望它依赖于默认目标”? – gnzlbg

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> 
) 
+0

默认情况下,CMake喜欢将所有内容放入ALL目标(例如外部项目)。构建任何东西通常需要首先构建ALL目标:我宁愿编写'make tests'而不是'make && make tests'。随着目标数量的增加,这个问题会变得更糟。用户定义的目标不能依赖于任何内建目标:ALL,INSTALL,...我找到的“最简单”的解决方案是收集添加到ALL的任何东西到不同的目标中,然后添加依赖到这些目标。不舒服,但工作。 – gnzlbg

+0

如果你正在引用'include_external_msproject()'命令,我承认我已经修补了我的CMake 2.8.10版本,默认将'EXCLUDE_FROM_ALL'属性设置为'TRUE'(请参阅'cmIncludeExternalMSProjectCommand.cxx')。我通常更喜欢将'EXCLUDE_FROM_ALL'设置为'TRUE'(例如通过相应的目录属性)。这允许在复杂的构建环境中选择性地仅编译特定目标及其依赖项。但是,当我正确设置了跨目标依赖时,它对我来说很好(包括使用并行生成引擎的环境)。 – Florian

+0

其实我是指“ExternalProject_Add”,但是,“EXCLUDE_FROM_ALL”是一个更好的默认值:) – gnzlbg

相关问题