2016-11-17 60 views
2

現在我正在學習如何使用makefile並且在規則內部遇到變量問題。我的目標是解析包含其他文件名稱的文件,將其保存在變量中,並將該變量用作「目標模式」以在每個文件上運行規則。這裏是我的問題的一個簡單例子(我正在寫入文件名以簡化它)。如何在規則外使用makefile變量

當我運行此:

variable = file1.txt file2.txt file3.txt 

run : $(variable) 

$(variable): %.txt: 
    echo File is [email protected] 

我得到以下,這正是我想要的:

$ make run 
echo File is file1.txt 
File is file1.txt 
echo File is file2.txt 
File is file2.txt 
echo File is file3.txt 
File is file3.txt 

的問題是我想通過解析一個文件來定義variable,我想該文件是一個依賴項,因爲如果它不存在,我將在makefile中使用另一個規則。所以,當我在這樣的規則(我知道現在還有沒有從我的回聲)定義變量:

target1 : 
    $(eval variable = file1.txt file2.txt file3.txt) 
    echo $(variable) 

run : $(variable) 

$(variable): %.txt: 
    echo File is [email protected] 

我得到如下:

$ make target1 
echo file1.txt file2.txt file3.txt 
file1.txt file2.txt file3.txt 

而且這樣的:

$ make run 
make: Nothing to be done for `run'. 

所以我的問題是如何定義一個規則中的變量,並將其用於某些行:

$(variable): %.txt: 
    echo File is [email protected] 

我試過閱讀手冊和谷歌搜索,但我無法弄清楚這一點。我也想象有一些簡單的答案我錯過了。非常感謝你的幫助! :)

+0

由於make方式的原因,它不起作用:FIRST根據需要解析整個makefile,擴展變量等。那麼讓開始爲過時的規則運行食譜。所以,當make運行包含'eval'的'target1'的配方時,makefile的其餘部分已經被解析並且'variable'已經被擴展(到空字符串)。 – MadScientist

回答

2

如果你能控制target1創建的文件的內容,這是很簡單:只是使文件的格式是一個make變量賦值,然後使用include命令,就像這樣:

run: 

include target1 

run: $(variable) 

$(variable): %.txt: 
     echo File is [email protected] 

target1: 
     echo 'variable = file1.txt file2.txt file3.txt' > [email protected] 

通過automatically generated makefiles的魔法,make將重新創建該目標文件,然後自動重新調用它自己。

+0

非常感謝!像魅力一樣工作,你解釋得非常好! :) –