【问题标题】:Accessing parent Makefile targets from subdirectory从子目录访问父 Makefile 目标
【发布时间】:2020-08-05 07:52:58
【问题描述】:

说我的目录结构是这样的:

foo
foo/Makefile
foo/bar

现在说foo/Makefile 有一个make 目标baz

我想从foo/bar 调用make baz,而不在bar 子目录中创建另一个Makefile。这可能吗?

【问题讨论】:

  • make -f ../Makefile baz

标签: makefile gnu-make


【解决方案1】:

GNU make 有两个适合您的情况的重要选项:-f FILE 用于告诉 make 使用哪个 makefile 代替默认值,-C DIR 告诉 make 更改到目录 @987654327 @ 在阅读 makefile 之前。如何使用其中之一或两者都取决于您的具体情况。请注意,-f 符合 POSIX 标准,而-C 是 GNU make 支持的扩展。如果您自己的make 版本不支持-C 并且没有等效项,则您必须在调用make 之前自己更改当前目录,例如( cd some/where; make...; ).

  1. 如果您可以按照Oo.oO 的建议从foo/bar/ 构建baz,您可以简单地

     make -f ../Makefile baz
    

    make 将从foo/bar/ 运行并构建baz,如../Makefile 所示。

  2. 如果您必须在foo/ 中构建baz,您应该使用:

     make -C .. baz
    

    make 将在读取 makefile 之前更改为 ..,即 foo,因为它会在此处找到默认值之一 (Makefile),它将使用它来发现如何构建 baz .

  3. 如果您必须在另一个目录中,例如foo/ 的父级,您需要两个选项和类型:

     make -C ../.. -f foo/Makefile baz
    

    make 将首先更改为../..foo/ 的父目录),然后它将使用foo/Makefile 来发现如何构建baz

【讨论】:

  • 感谢您的详细回答。有没有办法在不添加新标志的情况下做到这一点?假设我正在处理一个复杂的目录结构,为每个目录创建一个新的 Makefile 是不可行的。我正在考虑最好的方法是通过 bash 脚本。
  • 您可能应该尝试更好地解释您想要做什么,更重要的是,您的限制是什么。我真的不明白为什么使用make 选项是个问题。
  • 我的问题是,如果一个目录下没有Makefile,如何不加选项就让它默认为父目录下的Makefile。这是可能的吗?
  • @ChukwudiDerekUche:嗯,你可以下载 make 源代码,修改它们以便它也搜索父目录中的默认 makefile,然后重新编译。您还可以创建符号链接。您还可以定义一个 shell 函数或别名以将 make 包装在一个简单的脚本中,该脚本为您完成所有这些工作。例如,如果您的 makefile 始终命名为 Makefilefunction my_make { if [ ! -f Makefile ] && [ -f ../Makefile ]; then make -f ../Makefile $*; else make $*; fi }。但是有一些副作用你可能应该考虑($(MAKE) 等)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
相关资源
最近更新 更多