2011-12-22 101 views
2

可能重複:
arithmetic in a Makefile的Makefile:更新變量

我非常使用的Makefile初學者。我想更新變量,這樣或多或少:

LEVEL=0 

train: 
    while (eval_score > previous_eval_score) 
    make iterate 

iterate: 
    do stuff 
    write files to /path/to/$(LEVEL)/asdf.txt 
    $(LEVEL)++ 

換句話說,每一次迭代一些文件寫入一個目錄中,第一至/路徑/到/ 0,則/路徑/到/ 1等等,直到達到某個閾值。

顯然,不允許更新或重新分配函數內的變量。我已經搜索了一段時間,但無法找到任何滿意的答案。也許我有,但我不明白一切。我也嘗試過在bash中計算的東西,但最終我仍然需要更新變量。也許我應該嘗試更新文件,而不是每次迭代,只需從文件中讀取?

謝謝你的時間。

+0

能否請您解釋一下爲什麼純淨殼就不會在這裏就夠了? 'while(eval_score> previous_eval_score);做東西;寫文件;完成「似乎更容易和更富有表現力,所以我認爲你有一個去做的理由。 – thiton 2011-12-22 15:17:04

+0

嗨蒂頓,謝謝你的回覆。 makefile還包含一些其他功能,這些功能依次調用一些腳本,其中一些功能是分層的,在我看來這很適合。我也更喜歡make,因爲我覺得它更優雅,更易於管理。但你可能是正確的,我也可以使用shell腳本。我想解決的主要問題是每當迭代完成時向$(LEVEL)變量添加1。我只是很好奇,看看是否可以做,而不必做出重大改變。問候,吉迪恩 – Gideon 2011-12-22 17:33:08

回答

0

你的Makefile的主要問題是每個make iterate都會產生一個子make,它可以更新它的環境變量,但對父make不起作用,因此對下一次迭代沒有影響。另外,您不能更新規則內的變量,但這是次要問題。

你可以做迭代make就像你的建議,並通過增加外殼的水平:

train: 
    LEVEL=0; while need_more_iterations; do \ 
     $(MAKE) LEVEL=$$LEVEL iterate; \ 
     LEVEL=`echo $$LEVEL + 1 | bc`; \ 
    done 
+0

非常感謝您的回覆,我會盡力實施。最好的,吉迪恩 – Gideon 2011-12-22 17:50:00