如何在Makefile中输入父目录?

问题描述 投票:1回答:1

我有以下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 makefile
1个回答
1
投票

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

Changing the working directory for a recipe

您可以使用.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实例中运行(即:一个子进程)。

© www.soinside.com 2019 - 2024. All rights reserved.