cd ..在Makefile中没有ONESHELL的情况下工作

时间:2018-07-26 16:07:00

标签: ubuntu makefile gnu-make

必须从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

1 个答案:

答案 0 :(得分:3)

.ONESHELL不接受前提条件(或更准确地说,它会忽略它们)。如果定义它,则整个makefile都将启用它。当前无法仅为单个目标指定.ONESHELL

GNU制作手册说:

  

如果.ONESHELL特殊目标出现在makefile中的任何位置,则 all   每个目标的配方行将提供给shell的一次调用。