ubuntu cd..在Makefile中不使用ONESHELL

ahy6op9u  于 2023-04-29  发布在  Shell
关注(0)|答案(1)|浏览(232)

docs开始,需要在.ONESHELL中添加一个target,以使所有命令都在同一个子shell进程中运行。进一步的讨论是here
这是我的makefile

.PHONY: clean build
.ONESHELL: deploy

zip := my.zip

clean:
    cd ..
    rm -f $(zip)

build: clean
    npm install .
    zip -r ../$(zip) . \
        --exclude=package-lock.json \
        --exclude=.gitignore \
        --exclude=makefile \
        --exclude=*.git* 

... more lines

所以当我执行make build时,父文件夹中的zip文件被创建。当我执行make clean(从同一目录)时,zip也从父文件夹中删除。我不明白的是,既然cd ..运行在一个独立的shell进程中,那么父文件夹中的zip文件是如何通过make clean命令删除的,因为它不包括在.ONESHELL中?
版本:GNU Make 4.1在Ubuntu 18上。04

7cjasjjr

7cjasjjr1#

.ONESHELL不接受先决条件(或者更准确地说,它忽略了先决条件)。如果您定义了它,它将对整个makefile启用。目前无法仅为单个目标指定.ONESHELL
GNU make手册说:
如果.ONESHELL特殊目标出现在makefile中的任何地方,那么每个目标的 all 配方行将提供给shell的单个调用。
如果你想知道这适用于包含的makefile--如果集合中的任何一个指定了.ONESHELL:,则所有这些中的每个配方都将应用它。

相关问题