【发布时间】: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
说我的目录结构是这样的:
foo
foo/Makefile
foo/bar
现在说foo/Makefile 有一个make 目标baz。
我想从foo/bar 调用make baz,而不在bar 子目录中创建另一个Makefile。这可能吗?
【问题讨论】:
make -f ../Makefile baz
GNU make 有两个适合您的情况的重要选项:-f FILE 用于告诉 make 使用哪个 makefile 代替默认值,-C DIR 告诉 make 更改到目录 @987654327 @ 在阅读 makefile 之前。如何使用其中之一或两者都取决于您的具体情况。请注意,-f 符合 POSIX 标准,而-C 是 GNU make 支持的扩展。如果您自己的make 版本不支持-C 并且没有等效项,则您必须在调用make 之前自己更改当前目录,例如( cd some/where; make...; ).
如果您可以按照Oo.oO 的建议从foo/bar/ 构建baz,您可以简单地
make -f ../Makefile baz
make 将从foo/bar/ 运行并构建baz,如../Makefile 所示。
如果您必须在foo/ 中构建baz,您应该使用:
make -C .. baz
make 将在读取 makefile 之前更改为 ..,即 foo,因为它会在此处找到默认值之一 (Makefile),它将使用它来发现如何构建 baz .
如果您必须在另一个目录中,例如foo/ 的父级,您需要两个选项和类型:
make -C ../.. -f foo/Makefile baz
make 将首先更改为../..(foo/ 的父目录),然后它将使用foo/Makefile 来发现如何构建baz。
【讨论】:
make 选项是个问题。
Makefile:function my_make { if [ ! -f Makefile ] && [ -f ../Makefile ]; then make -f ../Makefile $*; else make $*; fi }。但是有一些副作用你可能应该考虑($(MAKE) 等)