CMake自定义目标与未生成的子目录同名

CMake自定义目标与未生成的子目录同名,cmake,gnu-make,Cmake,Gnu Make,我想建立一个子目录foo/ CMakeLists.txt: add_subdirectory(foo) add_custom_target(foo ALL) add_library (foo_lib ...) add_executable(foo_bin ...) add_executable(foo_tests ...) add_dependencies(foo foo_lib) add_dependencies(foo foo_bin) add_dependencies(foo f

我想建立一个子目录
foo/

CMakeLists.txt:

add_subdirectory(foo)
add_custom_target(foo ALL)

add_library   (foo_lib ...)
add_executable(foo_bin ...)
add_executable(foo_tests ...)

add_dependencies(foo foo_lib)
add_dependencies(foo foo_bin)
add_dependencies(foo foo_test)
foo/
内部,我有许多我想要建立的目标,我想把它们“分组”在一个虚假目标下,也叫
foo

foo/CMakeLists.txt:

add_subdirectory(foo)
add_custom_target(foo ALL)

add_library   (foo_lib ...)
add_executable(foo_bin ...)
add_executable(foo_tests ...)

add_dependencies(foo foo_lib)
add_dependencies(foo foo_bin)
add_dependencies(foo foo_test)
这将允许我通过键入
makefoo

这很好,除非我在上面的目录
foo/

add_subdirectory(foo)
add_custom_target(foo ALL)

add_library   (foo_lib ...)
add_executable(foo_bin ...)
add_executable(foo_tests ...)

add_dependencies(foo foo_lib)
add_dependencies(foo foo_bin)
add_dependencies(foo foo_test)
make foo
在存在
foo
子目录的目录中不执行任何操作

我认为这是因为
make
认为
foo
是一个没有过时的目标,因为目录存在。修复方法是将其标记为
虚假目标

根据上的CMake文档,目标将始终被视为过时(即:用
make
的说法,它将是一个
虚假的
目标)

问题:


为什么我的
foo
自定义目标没有在包含
foo
子目录的目录中生成?

有一个与目录同名的目标会带来麻烦。它适用于不同的目标名称吗?据我所知,CMake不会为子目录生成
PHONY
目标。它们都在根级别<代码>生成帮助
应列出您可以调用的内容。您是否考虑将其添加为外部项目?@usr1234567是的,它确实适用于其他目标。这几乎可以肯定是因为目录具有相同的名称。当你说这是自找麻烦的时候,我忍不住想象很多人有一个与他们正在创建的应用同名的子目录,所以目标与目录名匹配?也就是说,这一定是一种经常发生的情况?我曾经在CMake的bug跟踪器中用a提出过,并得到以下回答:“CMake并不打算在Makefile中生成特定内容。由add_custom_target创建的顶级目标名称始终是逻辑(即虚假)名称。根本不允许有同名文件。”@usr1234567是的,我确认。但是您可以在命令行中指定任何目标,并且与目标同名的目录应该不会有问题。我的所有子目录CMakeLists.txt文件都以
get\u filename\u component(targetname“${CMAKE\u CURRENT\u SOURCE\u DIR}”NAME)开头。