C 如何更改变量';在makefile中while循环中的s值?

C 如何更改变量';在makefile中while循环中的s值?,c,linux,variables,makefile,C,Linux,Variables,Makefile,我正在编写一个名为run.mk的简单makefile,如下代码所示 a = 0 b := $(shell echo `expr $(a) + 1`) app: main.o gcc -o app main.o main.o: main.c gcc -c main.c test: while [ $(a) -lt 10 ];\ do\ echo $(a);\ a:= $(shell echo `expr $(a) + 1`);\

我正在编写一个名为run.mk的简单makefile,如下代码所示

a = 0 
b := $(shell echo `expr $(a) + 1`)

app: main.o
    gcc -o app main.o
main.o: main.c
    gcc -c main.c
test:
    while [ $(a) -lt 10 ];\
    do\
      echo $(a);\
      a:= $(shell echo `expr $(a) + 1`);\
      echo $(a);\
    done
当我使用命令make-f run.mk test运行这个makefile时,出现错误:a未找到,循环无限运行,即变量a的值未在a:=$(shell echo
expr$(a)+1
)的while循环内更新。但是,在开始时,变量b的值通过相同的代码行$(shell echo
expr$(a)+1
)设置为1
。请告诉某人如何更新循环中变量a的值


谢谢。

您正在混合shell脚本变量和make变量

test
的方法是一个shell脚本(从
while
done
)。Make变量,例如
$(a)
在开始执行之前展开,因此
while
行是
while[0-lt 10]
,这始终是真的。

赋值
a:=…
不起作用,因为它是makefile语法,而不是shell语法。即使它确实有效,也不会影响
行。

您正在混合shell脚本变量和make变量

test
的方法是一个shell脚本(从
while
done
)。Make变量,例如
$(a)
在开始执行之前展开,因此
while
行是
while[0-lt 10]
,这始终是真的。

赋值
a:=…
不起作用,因为它是makefile语法,而不是shell语法。即使它确实有效,也不会影响
,而
行。

您混淆了
make
语法和shell语法。配方中的命令由shell运行(make将其展开一次后)。外壳是一个独立的过程,在外壳中发生的任何事情都是完全看不见的。所有make sees都是退出代码(以了解是否存在错误)。shell不可能以任何方式修改make的行为(更改变量值等)

因此,按照您的规则,make所做的是首先扩展
test
的配方(顺便说一句,这对于目标来说是一个非常糟糕的名称,因为
test
实际上已经在您的系统上了),以获得此结果:

while [ 0 -lt 10 ]; \
do \
    echo 0; \
    a:= 1; \
    echo 0;\
done
扩展完成后,它会将该文本发送到shell以执行,显然这将永远运行(请注意,
a:=1
不是有效的shell命令)

既然你只告诉我们你试过什么,但没有告诉我们你实际上想做什么,我们就不能帮你做你想做的

如果您想编写一个将循环10次打印一个值的配方,那么必须完全使用shell语法,而不是make语法。像这样:

test:
        a=$(a); \
        while [ $$a -lt 10 ];\
        do\
          echo $$a;\
          a=`expr $$a + 1`;\
          echo $$a;\
        done
$$
将变量从make展开中转义出来,并导致shell运行此shell脚本:

a=0; \
while [ $a -lt 10 ];\
do\
  echo $a;\
  a=`expr $a + 1`;\
  echo $a;\
done

你把
make
语法和shell语法搞混了。配方中的命令由shell运行(make将其展开一次后)。外壳是一个独立的过程,在外壳中发生的任何事情都是完全看不见的。所有make sees都是退出代码(以了解是否存在错误)。shell不可能以任何方式修改make的行为(更改变量值等)

因此,按照您的规则,make所做的是首先扩展
test
的配方(顺便说一句,这对于目标来说是一个非常糟糕的名称,因为
test
实际上已经在您的系统上了),以获得此结果:

while [ 0 -lt 10 ]; \
do \
    echo 0; \
    a:= 1; \
    echo 0;\
done
扩展完成后,它会将该文本发送到shell以执行,显然这将永远运行(请注意,
a:=1
不是有效的shell命令)

既然你只告诉我们你试过什么,但没有告诉我们你实际上想做什么,我们就不能帮你做你想做的

如果您想编写一个将循环10次打印一个值的配方,那么必须完全使用shell语法,而不是make语法。像这样:

test:
        a=$(a); \
        while [ $$a -lt 10 ];\
        do\
          echo $$a;\
          a=`expr $$a + 1`;\
          echo $$a;\
        done
$$
将变量从make展开中转义出来,并导致shell运行此shell脚本:

a=0; \
while [ $a -lt 10 ];\
do\
  echo $a;\
  a=`expr $a + 1`;\
  echo $a;\
done

使用GNU make 4.0,您可以使用Guile来做复杂的事情。使用GNU make 4.0,您可以使用Guile来做复杂的事情。