2011-08-24 33 views
0

我完全難住如何在Makefile中做到這一點Makefile(計數)

比方說,我有一個目標。在目標內部,我有一個循環。我如何更改變量以跟蹤迭代?

例如:

COUNTER = 0 
target: 
    (loop){ 
     COUNTER++ 
     echo COUNTER 
} 

我知道,在Makefile中變量只擴大,我不知道他們是否可以永久改變,但必須有一個方法可以做到這一點,對不對? :(

這裏有一些來源都在問類似的問題好像這些例子只是暫時改變變量:

也許我必須以某種方式使用eval功能?

也許我每次都必須在Makefile字符串中追加一個字符,然後使用shell中的某些內容來計算字符數?

+0

在你的第一個例子中的第一個答案給出了一個可行的解決方案。你爲什麼還在問這個問題?此外,您使用「暫時」和「永久」是沒有意義的。 – Beta

+0

不用於迭代。我將不得不做一個新的變量來保存每個數字 –

+0

所以......你想增加一個規則內的變量,然後在另一個規則中使用新的值?你知道手術的順序嗎?這兩條規則有什麼特別的關係嗎? – Beta

回答

4

如果變量沒有生存的規則,這應該做的(我假設的bash):

clean: 
    @n=0 ; \ 
    for x in $(THINGS_TO_BE_DELETED); do \ 
    if [ -f $$x ] ; then \ 
     rm $$x; \ 
     let "n+=1" ; \ 
    fi ; \ 
    done ; \ 
    echo deleted $$n files; 
+0

ahhhh!我很親密! 錯誤:/ bin/sh:let:找不到 'let'是bash內建的 –

+0

@Trevor Hickey:好的,你用什麼shell? (如果您不確定,請嘗試從命令行中echo $ SHELL',或者更好地在規則中使用命令。) – Beta

+0

GOT IT!如果你沒有設置變量'SHELL',Make默認使用/ bin/sh。所以通過添加「SHELL:=/bin/bash」,我可以使用'let'命令。我從未期望得到如此巨大的幫助,感謝您的耐心測試 –

1

這裏是一個解決方案:寫一個簡單的腳本是這樣的:

#!/bin/bash 
count=`cat count.txt` 
count=$((count + 1)) 
echo $count 
cat $count > count.txt 

$ echo "0" > count.txt 

初始化文件,然後把它作爲一個.PHONY要求建立任何你想。

+0

我試圖避免使用makefile外的文件,但我想沒有其他辦法! –