1

我想运行一个输入大小增加的程序,所以我引入了一个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

之后,循环按预期工作。

4

3 回答 3

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
于 2019-10-22T14:26:21.793 回答
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
于 2019-10-22T14:28:35.997 回答
1

只是要非常清楚您遇到的问题:

问题是 make 不会使用用户拥有的任何 shell 运行配方:这对于可重复构建来说将是一场灾难。/bin/shmake always(根据 POSIX 标准)在作为 POSIX 外壳的外壳中运行配方。

您的食谱正在使用 shell 的增强功能,这些功能bash在 POSIX shell 中不可用。您需要重写您的配方以使用 POSIX shell 功能,或者明确请求使用 makebash来运行您的配方而不是 POSIX shell(当然这意味着您的 makefile 不能移植到任何bash不可用的系统,如果这是关注)。

您可以通过将其添加到您的 makefile 来执行后者:

SHELL := /bin/bash
于 2019-10-22T15:31:29.820 回答