【问题标题】:how to change a variable's value within a while loop in makefile?如何在makefile的while循环中更改变量的值?
【发布时间】:2014-01-23 20:44:48
【问题描述】:

我正在编写一个名为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

当我使用命令 ma​​ke -f run.mk test 运行此 makefile 时,出现错误:a not found 并且循环无限运行,即变量 a 的值未更新在 a:= $(shell echo expr $(a) + 1) 在 while 循环中。但是在开始时,变量 b 的值通过相同的代码行 $(shell echo expr $(a) + 1) 设置为 1。有人请告诉如何在循环中更新变量 a 的值。

谢谢。

【问题讨论】:

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

标签: c linux variables makefile


【解决方案1】:

您混淆了make 语法和shell 语法。配方中的命令由 shell 运行(在 make 扩展它们一次之后)。 shell 是一个单独的过程,shell 中发生的任何事情都是完全不可见的。所有 make 看到的是退出代码(知道是否有错误)。 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

【讨论】:

    【解决方案2】:

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

    test 的配方是一个 shell 脚本(从 whiledone)。使变量,例如 $(a) 在它开始执行之前被扩展,所以 while 行是 while [ 0 -lt 10 ] 这总是正确的。
    赋值 a:=... 不起作用,因为它是 makefile 语法,而不是 shell 语法。即使它确实有效,也不会影响while 行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-12
      • 1970-01-01
      • 2013-09-13
      • 2022-07-07
      • 1970-01-01
      • 2014-12-07
      • 2014-03-28
      • 1970-01-01
      相关资源
      最近更新 更多