【发布时间】:2023-02-18 03:23:54
【问题描述】:
我的 Makefile 有一个错误:
verify-prettier:
$(PRETTIER) --check **/*.yaml **/*.yml
未设置 PRETTIER 变量。
结果:
check **/*.yaml **/*.yml
bash: line 1: check: command not found
make: [Makefile:156: verify-prettier] Error 127 (ignored)
如果我不小心有一个未定义的变量,我想得到一个错误(不会被忽略)。
有没有办法相应地配置make?
版本:GNU Make 4.3
我们不需要支持其他 make 实现。
我知道这一点,但我希望它失败,而不仅仅是警告。
MAKEFLAGS=--warn-undefined-variables
更新,因为这似乎到现在为止还不可用,所以我创建了一个功能请求:https://savannah.gnu.org/bugs/?63737
【问题讨论】:
-
GNU make 中没有选项会在引用空变量时生成致命错误。只有
--warn-undefined-variables会产生警告,但不会产生错误,它只会在不明确的变量,不空的变量(这些不是一回事)。 -
@MadScientist 感谢您的评论。我现在让我的问题更精确了。
-
只是另一个顺序:GNU make 调用
sh(有些系统,比如 Red Hat,会将sh链接到bash,但其他系统不会);sh和bash(默认情况下)都不会扩展像**这样的高级通配符。对于 shell,这与*相同。很可能你的**/*.yml并没有按照你的想法行事。 -
我在之前的评论中提到了这一点。 globbing 在 POSIX 中的工作方式是 shell 将尝试扩展 globbing。如果它匹配某些东西,那么那个东西就会被传递给命令。如果它不匹配任何内容,则将 glob 传递给命令。因此,如果您运行
echo **/*.yml并且目录中有一个与*/*.yml匹配的文件,则该文件将被传递。如果没有匹配*/*.yml的文件,则将传递字符串**/*.yml。构建系统依赖于存在或不存在的文件是危险的,因此如果您希望传递 glob,则应该引用它。 -
另外,通过引用它,每个阅读您的命令的人都会理解您正在尝试做什么(将 globbing 字符传递给命令)。否则他们会对为什么你的构建系统中没有
.yml文件感到困惑。