我有一个像这样的目录树,在文件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
)?答案 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
。