在定义它们的文件所在的目录中执行命令

时间:2010-07-21 15:41:53

标签: makefile gnu-make

如果愿意,请考虑以下情况:

$ pwd
/tmp/submake_example
$ head $(find -type f)
==> ./subdir/Makefile <==
subtarget:
        echo "executing subtarget from directory $$(pwd)"

==> ./Makefile <==
include subdir/Makefile
$ make subtarget
echo "executing subtarget from directory $(pwd)"
executing subtarget from directory /tmp/submake_example

有没有办法让我可以从目录subtarget中执行目标subdir的命令?我希望能够从主目录中的命令行访问包含的makefile的目标。

1 个答案:

答案 0 :(得分:0)

经过一番挖掘和实验,我发现了一些事情。

this reference推荐的方法(引用文章Recursive Make Considered Harmful)非常复杂,涉及在整个makefile包含层次结构中手动维护目录堆栈。

我还发现,独立于任何引用,变量$(MAKEFILE_LIST)的最后一个元素,至少对于某些基本测试用例,将包含当前包含的makefile的名称。这意味着可以将其目录存储在一个简单扩展的特定于目标的变量中,其代码类似于

foo: dir := $(dir $(lastword $(MAKEFILE_LIST)))

就是这样。然后你可以像在任何其他变量中一样在该规则中使用$(dir);它保留了makefile包含期间所假设的值。 cd,把它放在命令路径中,无论如何。

在makefile中的任何include伪指令之前,必须小心将赋值放到dir

如果目录名中有空格,这将无法工作,但如果文件或目录名中有空格,我会收集到make中几乎没有任何内容。

值得注意的是,这种方法仅使用GNU make中的功能。听起来像是一个杀手级的应用程序,虽然我仍然有点困惑,为什么他们不只是在内置变量或函数中提供目录名称。

无论如何,这似乎有效,至少乍一看。我仍然只是漂浮这个没有任何真正的备份,所以非常欢迎评论这种方法的实用性和替代建议。