我有以下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
文件更改为父目录?
答案 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实例中运行(即:一个子进程)。