for makefile中的循环不起作用

时间:2018-05-02 22:48:38

标签: bash makefile gnu-make

在我的makefile中,我有:

all:
  for i in {20..50000..10} ; do \
    echo "Computing $$i" ;\
  done

哪个应该在单独的行上打印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 stable只打印字符串“{20..50000..10}”。为什么是这样?在makefile中为循环写这个的可移植方法是什么?

2 个答案:

答案 0 :(得分:4)

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

    static void Main(string[] args)
    {
#if DEBUG
        try
        {
#endif
            UIApplication.Main(args, null, "AppDelegate");
#if DEBUG
        }
        catch (Exception ex)
        {
            var msg = ex.Message;
            var temp = ex.StackTrace;
            if(System.Diagnostics.Debugger.IsAttached)
                System.Diagnostics.Debugger.Break();
            throw;
        }
#endif
    }

你会发现它不像你希望的那样有效。 Make总是调用/bin/sh -c 'for i in {20..5000..10}; do echo $i; done' (应该是一个POSIX shell)来运行配方:如果它使用调用makefile的人碰巧使用的任何shell,那将是一种可移植性的灾难。

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

/bin/sh

到你的makefile。

答案 1 :(得分:1)

坚持POSIX兼容循环:

all:
  i=20; while [ "$$i" -le 50000 ]; do \
    echo "Computing $$i"; i=$$((i + 10));\
  done