用于检查拼写的 Makefile
Makefile for checking spelling
我正在尝试配置一个生成文件,以便我可以在其中使用 aspell 检查 .mb 文件的文件夹。我不确定如何配置它,但我试过这个:
spellcheck-en:
for f in src/docs/en/*.md; do aspell --lang=en check $f; done
问题是,makefile 没有读取 $f 所以当我 运行 'make spellcheck-en' 我得到这个:
Error: You must specify a file name.
Error: You must specify a file name.
Error: You must specify a file name.
Error: You must specify a file name.
Error: You must specify a file name.
make: *** [Makefile:29: spellcheck-en] Error 255
但是,运行在终端上执行此操作:“for f in src/docs/en/*.md; do aspell --lang=en check $f; done”不是问题。有没有其他方法在 makefile 中指示 $f?
谢谢。
此答案与您在评论中已修复的问题无关。您的 Makefile 在将 $f
替换为 $$f
之后工作时并不比等效的 shell 脚本好。它有两个主要缺点:
- 如果您再次运行同样的检查并且文本文件没有改变,它们将被再次检查,这是无用的,
- 无法并行检查。
下面解决了这两个缺点:
# File Makefile
MDDIR := src/docs/en
OKDIR := .ok
MDFILES := $(wildcard $(MDDIR)/*.md)
OKFILES := $(patsubst $(MDDIR)/%.md,$(OKDIR)/%,$(MDFILES))
.PHONY: spellcheck-en
spellcheck-en: $(OKFILES)
$(OKDIR)/%: $(MDDIR)/%.md | $(OKDIR)
aspell --lang=en check $<
touch $@
$(OKDIR):
mkdir -p $@
.PHONY: clean
clean:
rm -rf $(OKDIR)
如果你现在运行:
make -j8 spellcheck-en
或者只是(因为第一个目标 spellcheck-en
是默认目标):
make -j8
您将仅检查自上次检查后更改的文件,并且您将 运行 这些检查与一次最多 8 个作业并行进行。
解释:
wildcard
和 patsubst
是 2 个 GNU make 函数。
- 虚假目标被声明为
.PHONY
特殊目标的先决条件。它们是不是真实文件的目标。 Make 需要了解它们,以防万一存在同名文件。
$(OKDIR)/%: $(MDDIR)/%.md | $(OKDIR) ...
是模式规则。
| $(OKDIR)
是仅订单的先决条件。
所有这些在GNU make manual中都有很好的解释。
我正在尝试配置一个生成文件,以便我可以在其中使用 aspell 检查 .mb 文件的文件夹。我不确定如何配置它,但我试过这个:
spellcheck-en:
for f in src/docs/en/*.md; do aspell --lang=en check $f; done
问题是,makefile 没有读取 $f 所以当我 运行 'make spellcheck-en' 我得到这个:
Error: You must specify a file name.
Error: You must specify a file name.
Error: You must specify a file name.
Error: You must specify a file name.
Error: You must specify a file name.
make: *** [Makefile:29: spellcheck-en] Error 255
但是,运行在终端上执行此操作:“for f in src/docs/en/*.md; do aspell --lang=en check $f; done”不是问题。有没有其他方法在 makefile 中指示 $f?
谢谢。
此答案与您在评论中已修复的问题无关。您的 Makefile 在将 $f
替换为 $$f
之后工作时并不比等效的 shell 脚本好。它有两个主要缺点:
- 如果您再次运行同样的检查并且文本文件没有改变,它们将被再次检查,这是无用的,
- 无法并行检查。
下面解决了这两个缺点:
# File Makefile
MDDIR := src/docs/en
OKDIR := .ok
MDFILES := $(wildcard $(MDDIR)/*.md)
OKFILES := $(patsubst $(MDDIR)/%.md,$(OKDIR)/%,$(MDFILES))
.PHONY: spellcheck-en
spellcheck-en: $(OKFILES)
$(OKDIR)/%: $(MDDIR)/%.md | $(OKDIR)
aspell --lang=en check $<
touch $@
$(OKDIR):
mkdir -p $@
.PHONY: clean
clean:
rm -rf $(OKDIR)
如果你现在运行:
make -j8 spellcheck-en
或者只是(因为第一个目标 spellcheck-en
是默认目标):
make -j8
您将仅检查自上次检查后更改的文件,并且您将 运行 这些检查与一次最多 8 个作业并行进行。
解释:
wildcard
和patsubst
是 2 个 GNU make 函数。- 虚假目标被声明为
.PHONY
特殊目标的先决条件。它们是不是真实文件的目标。 Make 需要了解它们,以防万一存在同名文件。 $(OKDIR)/%: $(MDDIR)/%.md | $(OKDIR) ...
是模式规则。| $(OKDIR)
是仅订单的先决条件。
所有这些在GNU make manual中都有很好的解释。