cd.. 在 Makefile 中无需 ONESHELL 即可工作

Rik*_*hah 0 ubuntu makefile gnu-make

docs来看,有必要添加一个targetin.ONESHELL以使所有命令在同一个子 shell 进程中运行。对此的进一步讨论请参见此处

这是我的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
Run Code Online (Sandbox Code Playgroud)

因此,当我这样做时make build,父文件夹中的 zip 文件就会被创建。当我这样做时make clean(从同一目录),zip 也会从父文件夹中删除。我不明白的是,因为cd ..在独立的 shell 进程中运行,所以父文件夹中的 zip 不包含make clean在 中,因此如何使用命令删除它.ONESHELL

版本:Ubuntu 18.04 上的 GNU Make 4.1

Mad*_*ist 5

.ONESHELL不接受先决条件(或者更准确地说,它忽略它们)。如果您定义了它,它将针对整个 makefile 启用。目前无法.ONESHELL仅指定单个目标。

GNU make 手册说:

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

以防万一您想知道:这适用于包含的 makefile - 如果其中任何一个指定了.ONESHELL:,则所有其中的每个配方都将应用它。