makefile 中的 for 循环不起作用

kyt*_*cka 3 bash makefile gnu-make

在我的生成文件中,我有:

all:
  for i in {20..50000..10} ; do \
    echo "Computing $$i" ;\
  done
Run Code Online (Sandbox Code Playgroud)

这应该在单独的行上打印数字 20, 30, 40, ..., 50000。

这适用于 Debian oldstable(GNU Make 4.0、GNU Bash 4.3),但不适用于 Debian stable(GNU Make 4.1 和 GNU Bash 4.4.12)。

Debian 稳定版只打印字符串“{20..50000..10}”。为什么是这样?在 makefile 中编写这个 for 循环的可移植方式是什么?

Mad*_*ist 6

如果您在 shell 提示符下运行它:

/bin/sh -c 'for i in {20..5000..10}; do echo $i; done'
Run Code Online (Sandbox Code Playgroud)

你会发现它不像你希望的那样工作。Make 总是调用/bin/sh(它应该是一个 POSIX shell)来运行配方:如果它使用调用 makefile 的人碰巧使用的任何 shell,那么对于可移植性来说将是一场灾难。

如果你真的想用 bash 语法编写你的 makefile 配方,那么你必须通过添加来明确要求:

SHELL := /bin/bash
Run Code Online (Sandbox Code Playgroud)

到你的makefile。