必须从docs中向target
添加一个.ONESHELL
,以使所有命令在同一子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进程中运行,我不了解它,如何使用make clean
命令删除父文件夹中的zip,因为它不包含在.ONESHELL
中?
版本:Ubuntu 18.04上的GNU Make 4.1
答案 0 :(得分:3)
.ONESHELL
不接受前提条件(或更准确地说,它会忽略它们)。如果定义它,则整个makefile都将启用它。当前无法仅为单个目标指定.ONESHELL
。
GNU制作手册说:
如果
.ONESHELL
特殊目标出现在makefile中的任何位置,则 all 每个目标的配方行将提供给shell的一次调用。