如何在Makefile中进入父目录?

3

我有以下的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

看起来通过 .. 切换到父级目录没有任何效果。

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

1个回答

5
这个问题与规则的每行配方在独立的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

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


请注意,在makefile中更改由调用make的shell创建的当前工作目录是不可能的,因为这是一个进程的属性,而执行cd的运行make实例是另一个(子)进程。因此,它只会更改该子进程的工作目录。

这也是您无法通过执行脚本来更改shell的工作目录而不“源化”它的原因:因为该脚本在新的shell实例(即子进程)中运行。


你使用的是哪个版本的GNU Make? - JFMR
.ONESHELL 在 GNU Make 3.82 及以上版本可用,您仍然可以尝试其他替代方法。 - JFMR

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