我有以下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
文件更改为父目录?
这个问题与规则的配方的每一行都在一个专用的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
实例是另一个(子)进程。因此,它只会更改该子进程的工作目录。
这就是为什么你不能通过执行脚本来改变shell的工作目录的原因相同:因为脚本在一个新的shell实例中运行(即:一个子进程)。