cmake:如何将目标从子目录导入到更高级别?

cmake:如何将目标从子目录导入到更高级别?,cmake,Cmake,给定一个递归的构建结构。如何将目标从较低级别导入较高级别? 以下是一个简化的示例: 顶级CMakeLists.txt: sub1/CMakeLists.txt: sub1/subdir/CMakeLists.txt: 在顶层,所有目标都可见: 生成foo-生成foo 使酒吧-建立酒吧 实现两者-构建foo和bar 在底部标高(sub1/subdir)上,只有条形图可见: 使酒吧-建立酒吧 在中间级别,只有foo作为目标可见: 生成foo-生成foo 实现两者-构建foo和bar 制作

给定一个递归的构建结构。如何将目标从较低级别导入较高级别? 以下是一个简化的示例:

顶级CMakeLists.txt:

sub1/CMakeLists.txt:

sub1/subdir/CMakeLists.txt:

在顶层,所有目标都可见:

  • 生成foo-生成foo
  • 使酒吧-建立酒吧
  • 实现两者-构建foo和bar
在底部标高(sub1/subdir)上,只有条形图可见:

  • 使酒吧-建立酒吧
在中间级别,只有foo作为目标可见:

  • 生成foo-生成foo
  • 实现两者-构建foo和bar
制作帮助节目:

以下是此Makefile的一些有效目标: ... 全部(如果未提供目标,则为默认值) ... 清洁的 ... 依赖 ... 编辑缓存 ... 重建缓存 ... 二者都 ... 福 ... 富奥 ... 福伊 ... 福斯 如何在不将构建说明上移的情况下将bar添加到此列表中?

如果我更改

add_dependencies(both DEPENDS foo bar)

我得到以下响应以在顶部文件夹中提供帮助:

The following are some of the valid targets for this Makefile:
... all (the default if no target is provided)
... clean
... depend
... edit_cache
... rebuild_cache
... both
... foo
... bar
请查看文档:

所有目标都已在顶层可用。这是我感兴趣的下一个目录。删除依赖项没有区别,尽管它是不必要的。你是对的。您能否详细说明一下您的用例,以及为什么从顶部文件夹调用“makebar”是不够的?它最初是一种迁移。切换到cmake之前的工作流程是在包含子项目的树中工作,并从中构建目标。这当然是旧式的“源代码树”构建思想,但在原则上仍然是可能的。它也可以从源代码外构建中的构建树的子目录中执行。我查看了我的另一个CMake项目,它们似乎都以相同的方式工作(而不是您希望的方式)。你能做的就是调用
make-C。。从子目录中选择bar
,这实际上是一个比主答案更好的答案。我从来没有使用过也没有注意到make的-C选项。这主意不错。它可以工作,但不会节省你很多打字时间。如果你替换了..,至少它可以推广。。使用指向生成树顶部的环境变量。不过,它仍然没有回答来自cmake方面的问题。
add_executable(bar EXCLUDE_FROM_ALL
  bar.cpp)
The following are some of the valid targets for this Makefile: ... all (the default if no target is provided) ... clean ... depend ... edit_cache ... rebuild_cache ... both ... foo ... foo.o ... foo.i ... foo.s
add_dependencies(both DEPENDS foo bar)
add_dependencies(both foo bar)
The following are some of the valid targets for this Makefile:
... all (the default if no target is provided)
... clean
... depend
... edit_cache
... rebuild_cache
... both
... foo
... bar