Makefile循环:在循环开始前弹出“找不到命令错误”,但此后工作正常

时间:2019-10-22 14:20:51

标签: makefile

我想以增加的输入大小运行程序,所以我引入了一个包含循环的run目标。

run:
    input_size = 1000 ; while [[ $$input_size -le 10000 ]] ; do \
        echo $$input_size ; \
        ./main.out $$input_size ; \
        ((input_size = input_size + 1000)) ; \
    done

我收到以下错误:

/bin/sh: input_size: command not found

之后,循环将按预期工作。

3 个答案:

答案 0 :(得分:1)

bash中,分配符号周围不能有空格(不同于make):

input_size=1000

或者,您可以使用bash算术扩展,它对空白的使用更为轻松:

SHELL := /bin/bash

run:
    for (( input_size = 1000; input_size < 10000; input_size += 1000 )); do \
        echo $$input_size; \
    done

答案 1 :(得分:1)

您的makefile文件存在多个问题,如果我们修复了您的版本,则应该为:

run:
    input_size=1000 ; while [ $$input_size -le 10000 ] ; do \
        echo $$input_size ; \
        ./main_out $$input_size ; \
        input_size=$$((input_size + 1000)) ; \
    done

一种更简单的生成数字序列的方法是使用seq

run:
    for input_size in $$(seq 1000 1000 10000); do  \
    echo $$input_size ; \
    ./main_out $$input_size ; \
    done

答案 2 :(得分:1)

请非常清楚您遇到的问题:

问题在于make不能使用用户拥有的任何shell运行配方:对于可重复的构建,这将是一场灾难。 make always(根据POSIX标准)在/bin/sh shell(即POSIX shell)中运行配方。

您的食谱正在使用bash Shell的增强功能,而POSIX Shell中不提供这些功能。您需要重写配方以使用POSIX Shell功能,或者显式地请求使用bash来代替POSIX Shell运行配方(当然,这意味着makefile不能移植到{{ 1}}不可用,如果有问题的话。

您可以通过将其添加到makefile中来完成后者:

bash