如何通过文件模式将 Makefile 中的变量设置为文件名,前提是该模式只有一个匹配项

How to set a variable in a Makefile to a filename via a file pattern, only if the pattern has ONE match

我有一个 GNU make 的 makefile,可以从 markdown 文本文件构建文档。 makefile 有一个变量 INPUT 我想设置为 markdown 文件的文件名。所有降价文件都遵循 *.md.

模式

但是我只想在只有一个文件匹配模式时设置INPUT到文件名,如果有多个markdown文件,make应该退出出现错误。

我尝试了显而易见的选择

INPUT ?= *.md

但这当然会将 INPUT 设置为**所有*匹配项的列表。因此,对于仅包含 file_a.md 的目录,但在包含

的目录中,它可以正常工作
file_a.md
file_b.md

INPUT 之后包含“file_a.md file_b.md”,这打乱了我期望 INPUT 包含 一个 文件或退出的规则。

有什么方法可以使用 makefile 语法分配 INPUT 吗?

要执行您想要的操作,您需要使用 $(wildcard) 函数强制立即完成 globbing(否则 make 将等到变量在适当的位置使用后再展开 glob)。

INPUT ?= $(wildcard *.md)

ifneq (1,$(words $(INPUT)))
    $(error Too many or two few input files found.)
endif