我有一个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)
如您所知,pyflakes
lints 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
.