2014-01-23 142 views
0

我正在編寫一個簡單的生成文件,名稱爲run.mk,如下面的代碼所示。如何在makefile的while循環中更改變量的值?

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 
當我運行使用命令 這個Makefile

使-f run.mk測試,錯誤出現:未找到和循環infinitly運行即變量a的值還沒有被更新一個:= $ (shell回聲expr $(a) + 1在while循環內。然而,開始時,變量b的值通過相同的代碼行$(shell echo expr $(a) + 1設置爲1。有人請告訴如何更新循環內變量a的值。

謝謝。

+0

隨着GNU讓4.0,你可以用詭計做複雜的事情。 –

回答

4

您在混合使用make語法和shell語法。配方中的命令由shell運行(在make擴展一次之後)。 shell是一個獨立的進程,任何發生在shell中的東西都是完全看不見的。所有make see都是退出代碼(要知道是否有錯誤)。 shell不可能以任何方式修改make的行爲(更改變量值等)

因此,根據您的規則,制定的操作是首先展開test的配方(順便提一句,這是一個對於一個目標,因爲test實際上是一個真正的程序已經在系統上),非常糟糕的名字得到這樣的結果:

while [ 0 -lt 10 ]; \ 
do \ 
    echo 0; \ 
    a:= 1; \ 
    echo 0;\ 
done 

擴張是後完成發送文本到shell執行,顯然是意志永遠運行(也請注意,a:= 1不是有效的shell命令)。

既然你只告訴我們你試過的是什麼,但並沒有告訴我們你究竟想要做什麼,我們不能幫你做你想做的事情。

如果你想要做的是寫一個循環10次打印一個值的配方,你必須完全使用shell語法來完成,而不是語法。就像這樣:

test: 
     a=$(a); \ 
     while [ $$a -lt 10 ];\ 
     do\ 
      echo $$a;\ 
      a=`expr $$a + 1`;\ 
      echo $$a;\ 
     done 

$$逃脫在這個shell腳本會被make擴大變量,結果被shell中運行:

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

你在混合shell腳本變量並創建變量。

test的配方是一個shell腳本(從whiledone)。使變量,如$(a)在開始執行之前展開,所以while行是while [ 0 -lt 10 ],它始終爲真。
賦值a:=...不起作用,因爲它是makefile語法,而不是shell語法。即使它確實有效,也不會影響while系列。