C 如何更改变量';在makefile中while循环中的s值?
我正在编写一个名为run.mk的简单makefile,如下代码所示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`);\
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 echoexpr$(a)+1
)的while循环内更新。但是,在开始时,变量b的值通过相同的代码行$(shell echoexpr$(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来做复杂的事情。