在makefile中使用$PWD获取父目录的基本名称

5
我需要在我的Makefile中自动化一个可变的对齐。我的Makefile的完整文件路径是:
/home/e2/branchname/projectname/modulename/Makefile

在我的Makefile中,我有一个变量BUILD_DIR,其中的一部分应该等于完整路径中的branchname。
所以我这样做了:
BRANCH_NAME= $(shell cd ../.. && basename "$PWD" && cd projectname/modulename)
BUILD_DIR=$(HOME)/$(BRANCH_NAME)/build

显然,我原本期望BUILD_DIR在这里是~/branchname/build,但在执行make后,我得到的是~/WD/build。我认为很可能是我使用了错误的BRANCH_NAME。我想知道我做错了什么?如果是的话,我希望能得到一些建议,关于如何正确地进行操作。
谢谢。
2个回答

5

这是因为在Make中,$具有特殊的含义,如果你想将其传递到shell中,就需要进行“转义”。在Make中,你需要将美元符号加倍来进行转义。因此,你需要使用$$PWD

另外,你所做的事情并不是最好的方法 - 如果可能的话,最好避免使用shell,并利用Make功能。在你的情况下,完成你想要的最佳方法如下:

BUILD_DIR := $(abspath $(dir $(lastword $(MAKEFILE_LIST)))/../../build)

您需要将上述行放置在相关的makefile文件中,靠近顶部,以便在include任何其他makefiles之前。请注意保留HTML标记。


但是,如果我使用 $(PWD),它会给我 modulename 而不是 branchname - wangx1ng
@wangx1ng,我更正了我的答案,一开始是错误的。抱歉。 - Mark Galeck
谢谢,$$PWD解决了问题!在这种特定情况下,abspath解决方案是意外地正确的,并且它给了我~/branchname/build。但是我应该能够在这里获取branchname部分,因为BRANCH_NAME也需要在我的Makefile中的某个地方使用。在那种情况下,abspath行不通。 - wangx1ng
@wangx1ng 如果是这样,你想要执行 BRANCH_NAME := $(abspath $(dir $(lastword $(MAKEFILE_LIST)))/../..)。相信我,在 Makefile 中除非必要,否则不要使用 $(shell),因为该功能不可用。其中一个原因是,你的 "shell" 解决方案存在微妙的错误。它之所以能够工作,是因为你从与你的 Makefile 相同的目录中调用了 >make。如果不同,并且你使用了 -f Makefile 选项,它会很快出错。 - Mark Galeck
@wangx1ng 哦,我明白了,你只需要一个单词。那么请添加 $(notdir)BRANCH_NAME := $(notdir $(abspath $(dir $(lastword $(MAKEFILE_LIST)))/../..)) - Mark Galeck
显示剩余2条评论

3
我想出了这个命令:
ENVIRONMENT := $(shell basename $(dir $(abspath $(dir $$PWD))))
如果执行该命令,您将得到:
ENVIRONMENT=项目名称

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接