如果愿意,请考虑以下情况:
$ 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的目标。
答案 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中的功能。听起来像是一个杀手级的应用程序,虽然我仍然有点困惑,为什么他们不只是在内置变量或函数中提供目录名称。
无论如何,这似乎有效,至少乍一看。我仍然只是漂浮这个没有任何真正的备份,所以非常欢迎评论这种方法的实用性和替代建议。