2016-11-17 26 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

非常感谢!像魅力一样工作,你解释得非常好! :) –