在Makefile中包含另一个具有相对路径的Makefile

时间:2019-02-20 23:10:35

标签: makefile path gnu-make

我有一个像这样的目录树,在文件rules.Makefile中有一些“共享目标”:

├── Makefile
├── rules.Makefile
└── my_subdir
    └── Makefile

我想在父目录和子目录的Makefile中调用这些“共享目标”。

子目录Makefile中的“自定义目标”也应可从父目录中的Makefile调用。

由于某种原因,我只能从同级rules.Makefile(父目录中的那个)中调用Makefile中的目标。在子目录的Makefile中使用相对路径尝试访问父目录中的rules.Makefile时,我会遇到一些错误。

父目录中Makefile的内容:

RULES_MAKEFILE_PATH=$(PWD)/rules.Makefile
include $(RULES_MAKEFILE_PATH)

foo-parent:
    @echo $(RULES_MAKEFILE_PATH)

子目录中Makefile的内容(请注意,双点.. ):

RULES_MAKEFILE_PATH=$(PWD)/../rules.Makefile
include "$(RULES_MAKEFILE_PATH)"

foo-child:
    @echo $(RULES_MAKEFILE_PATH)

从父目录make foo-parent进行呼叫时,我会看到预期的路径。

从儿童Directyr make foo-child打电话时,我看到此错误:

$ make foo-child 
Makefile:9: "/<PARENT_PATH>/my_subdir/../rules.Makefile": No such file or directory
make: *** No rule to make target '"/<PARENT_PATH>/my_subdir/../rules.Makefile"'. Stop.
  • 如何使相对路径在“子目录”中工作?
  • 我又如何从父目录的Makefile调用子目录的foo-child中定义的目标(例如Makefile)?

2 个答案:

答案 0 :(得分:1)

上面关于 $(PWD) 的观点是正确的。但是,如果这不是问题,您仍然可以使用 shell 函数执行命令来获取另一个 Makefile 的路径以包含:$(shell pwd)

我为一个项目做了类似的事情,该项目受益于在许多地方使用相同的 Makefile,使用 git rev-parse --show-toplevel

MAKEFILE := $(shell git rev-parse --show-toplevel)/makefiles/example.def
include $(MAKEFILE)

答案 1 :(得分:0)

首先,$(PWD)不是一个特殊的变量。这只是一个普通变量,是从您的shell中导入的。因此,在所有包含的makefile中,在makefile 中的任何地方,它始终具有相同的值,不会因为您要包含来自其他目录的makefile而改变。

第二,即使对于$(CURDIR)(这是一个特殊变量,在make启动时由make设置为当前目录),当包含另一个目录中的makefile时,也永远不会重置。

并且,include行中的所有路径都是根据启动时make所在的目录而不是相对于当前解析的makefile的路径来评估的。因此,如果Makefile包含foo/Makefile,则foo/Makefile具有include bar.mk,make将寻找bar.mk而不是foo/bar.mk