如何在Makefile中输入父目录?

时间:2018-02-16 17:03:02

标签: shell makefile

我有以下Makefile(GNU Make 3.81):

CWD:=$(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))

all:
        pwd
        cd "$(CWD)/.."
        pwd
        cd ".."
        pwd

这是输出:

$ make
pwd
/Users/kenorb/temp/foo
cd "/Users/kenorb/temp/foo/.."
pwd
/Users/kenorb/temp/foo
cd ".."
pwd
/Users/kenorb/temp/foo

似乎cd通过..向父目录发送不会产生任何影响。

如何将当前工作目录相对于Makefile文件更改为父目录?

1 个答案:

答案 0 :(得分:1)

这个问题与规则的配方的每一行都是在一个专用的shell实例中执行(即:一个新进程)这一事实有关。因此,在一行中运行cd对另一行中的命令没有任何影响,因为这些命令由不同的进程执行。

更改配方的工作目录

您可以使用.ONESHELL(GNU Make 3.82或更高版本)在单个相同的shell实例中运行所有配方的行:

CWD:=$(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))

.ONESHELL:
all:
        pwd
        cd "$(CWD)/.."
        pwd
        cd ".."
        pwd

或者只是将所有命令保存在一行中:

CWD:=$(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))

all:
        pwd; cd "$(CWD)/.."; pwd; cd ".."; pwd

工作目录的更改仅在 该配方中生效。

请注意,无法更改调用make的shell的makefile中的当前工作目录,因为这是一个进程'属性,以及正在运行的make实例将执行cd的是另一个(子)进程。因此,它只会更改该子进程的工作目录。

这就是为什么你不能通过执行没有 sourcing 它的脚本来改变shell的工作目录的原因:因为脚本在一个新的shell实例中运行(即:一个子进程)。