首页 > 解决方案 > cd .. 在 Makefile 中没有 ONESHELL 的情况下工作

问题描述

docs中,需要添加一个targetin.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 也会从父文件夹中删除。由于在独立的 shell 进程中运行,我不明白它cd ..是如何使用命令删除父文件夹中的 zip 的make clean,因为它不包含在.ONESHELL?

版本:Ubuntu 18.04 上的 GNU Make 4.1

标签: ubuntumakefilegnu-make

解决方案


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

GNU make 手册说:

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


推荐阅读