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