定义 SHELL:为什么有些目标失败并出现错误"invalid syntax"而另一个目标不会失败?



我有一个Makefile,如下所示(摘录(:

# be a POSIX guy!
SHELL = /bin/dash
# avoid accursed tabs
.RECIPEPREFIX +=
PROJECT = my_project
# before-commit stuff
CHANGED_FILES = $(shell git ls-files --modified)
files ?= $(CHANGED_FILES)
lint:
pyflakes $(files)
lint-all:
pyflakes $(PROJECT)
STAGING_DB_PORT = 5437
staging-db-start:
ssh -fNL 0.0.0.0:$(STAGING_DB_PORT):localhost:$(STAGING_DB_PORT) staging-db
ss -tlpn sport eq :$(STAGING_DB_PORT)
staging-db-stop:
ssh -O check staging-db
ssh -O stop staging-db
ss -tlpn sport eq :$(STAGING_DB_PORT)
staging-db-check:
ss -tlpn sport eq :$(STAGING_DB_PORT)
ssh -O check staging-db
.PHONY: lint, lint-all, staging-db-start, staging-db-stop, staging-db-check

当我运行目标时,说staging-db-check它工作得很好。虽然,当我运行目标lint时,它失败并显示错误:

Makefile:2:9: invalid syntax
SHELL = /bin/dash
^

对我来说,这很奇怪。我读过文档,他们说你总是必须设置变量SHELL所以我决定这样做。但是我无法弄清楚哪里有错误?

我有 GNU make,版本 4.2.1。

GNU Make 从不生成以下形式的诊断:

Makefile:2:9: invalid syntax
SHELL = /bin/dash
^

但是pyflakes做到了,这是由lint目标的配方运行的程序:

lint:
pyflakes $(files)

如您所知,pyflakeslints Python 源文件。您的$(files),如分配 由:

# before-commit stuff
CHANGED_FILES = $(shell git ls-files --modified)
files ?= $(CHANGED_FILES)

展开为包含Makefile的文件列表。您的Makefile不是 一个 Python 源文件和Makefile中语法不正确的第一行 有效的 Python 是:

SHELL = /bin/dash

下面是一个较短的生成文件:

生成文件

# be a POSIX guy!
SHELL = /bin/dash
.PHONY: all
all:
echo "Hello World"

用于重现错误:

$ pyflakes Makefile
Makefile:2:9: invalid syntax
SHELL = /bin/dash
^

有没有办法从变量中排除非 python 文件$files?

是的。假设 Python 文件是扩展名为.py的文件,更改:

CHANGED_FILES = $(shell git ls-files --modified)

自:

CHANGED_FILES = $(filter %.py,$(shell git ls-files --modified))

查看功能:

$(filter pattern...,text)
$(filter-out pattern...,text)

in 8.2 字符串替换和分析函数 在 GNU 制作手册中

如果你这样做,也许最好把CHANGED_FILES改成CHANGED_PYTHON_FILES.

最新更新