如何在Makefile中获取父目录

时间:2018-07-29 13:01:23

标签: makefile

这是打印当前目录,而不是父目录:

run:
    @cd ..; \
    echo $(shell pwd)

我需要像这样的命令中的父目录:

run:
    @cd ..; \
    docker run -it --rm -p 8080:8080 -v $(shell pwd):/go/src/hello golang bash

2 个答案:

答案 0 :(得分:1)

请记住要通过调用shell并将配方发送到shell以便执行来使它们起作用。 Make没有“内置”外壳,因此它不直接运行配方。

问题在于$(shell ..)是一个make函数。所有的make变量和函数都在调用shell之前 进行了扩展(考虑:shell不知道如何处理make函数)。

这意味着首先扩展$(shell ...)之类的make函数并运行pwd,这将为您提供运行make进程的当前目录,然后将生成的字符串传递给shell执行。因此,shell会看到以下内容:

cd ..; echo /path/to/make/dir

您永远不需要在食谱中使用$(shell ...)函数 ;配方已经在外壳中运行了!相反,您想在配方中使用Shell语法。一个警告是,您必须转义美元符号(用$替换外壳$$),以便make不会将它们解释为make变量。因此,如果您写:

run:
    @cd ..; echo $$(pwd)

然后make扩展该字符串并将此命令发送到shell:

cd ..; echo $(pwd)

随心所欲。

答案 1 :(得分:0)

为什么不使用POSIXly强制变量PWD

run:
    @cd ..; echo $$PWD

今天保存一个过程!