用于检查拼写的 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 个作业并行进行。

解释:

  • wildcardpatsubst 是 2 个 GNU make 函数。
  • 虚假目标被声明为 .PHONY 特殊目标的先决条件。它们是不是真实文件的目标。 Make 需要了解它们,以防万一存在同名文件。
  • $(OKDIR)/%: $(MDDIR)/%.md | $(OKDIR) ... 是模式规则。
  • | $(OKDIR) 是仅订单的先决条件。

所有这些在GNU make manual中都有很好的解释。