如何在规则之外使用makefile变量
现在我正在学习如何使用makefile,并且在规则中的变量方面遇到了问题。我的目标是解析包含其他文件名的文件,将其保存在变量中,并将该变量用作“目标模式”,在每个文件上运行规则。下面是我的问题的一个简单示例(我正在编写文件名以使其更简单) 当我运行此命令时:如何在规则之外使用makefile变量,makefile,gnu-make,Makefile,Gnu Make,现在我正在学习如何使用makefile,并且在规则中的变量方面遇到了问题。我的目标是解析包含其他文件名的文件,将其保存在变量中,并将该变量用作“目标模式”,在每个文件上运行规则。下面是我的问题的一个简单示例(我正在编写文件名以使其更简单) 当我运行此命令时: variable = file1.txt file2.txt file3.txt run : $(variable) $(variable): %.txt: echo File is $@ 我得到了以下,这就是我想要的: $
variable = file1.txt file2.txt file3.txt
run : $(variable)
$(variable): %.txt:
echo File is $@
我得到了以下,这就是我想要的:
$ 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
问题是我想通过解析一个文件来定义变量
,我希望该文件是一个依赖项,因为如果它不存在,我将使用makefile中的另一个规则来创建它。因此,当我在这样的规则中定义变量时(我从echo中知道):
我得到以下信息:
$ 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 $@
我试着通读手册,用谷歌搜索,但我就是搞不懂。我还想象着我缺少一些简单的答案。非常感谢你的帮助!:) 如果您可以控制创建的
target1
文件的内容,这很简单:只需将该文件的格式设置为make变量赋值,然后使用include
命令,如下所示:
run:
include target1
run: $(variable)
$(variable): %.txt:
echo File is $@
target1:
echo 'variable = file1.txt file2.txt file3.txt' > $@
通过make的魔力,它将重新创建目标文件,然后自动重新调用自身。由于make的工作方式,它无法工作:首先make解析整个make文件,根据需要展开变量,等等。然后开始运行过时规则的配方。因此,当make运行包含
eval
的target1
配方时,makefile的其余部分已经被解析,并且变量
已经被扩展(到空字符串)。这非常感谢!工作起来很有魅力,你解释得很好!:)
run:
include target1
run: $(variable)
$(variable): %.txt:
echo File is $@
target1:
echo 'variable = file1.txt file2.txt file3.txt' > $@