如何在规则之外使用makefile变量

如何在规则之外使用makefile变量,makefile,gnu-make,Makefile,Gnu Make,现在我正在学习如何使用makefile,并且在规则中的变量方面遇到了问题。我的目标是解析包含其他文件名的文件,将其保存在变量中,并将该变量用作“目标模式”,在每个文件上运行规则。下面是我的问题的一个简单示例(我正在编写文件名以使其更简单) 当我运行此命令时: variable = file1.txt file2.txt file3.txt run : $(variable) $(variable): %.txt: echo File is $@ 我得到了以下,这就是我想要的: $

现在我正在学习如何使用makefile,并且在规则中的变量方面遇到了问题。我的目标是解析包含其他文件名的文件,将其保存在变量中,并将该变量用作“目标模式”,在每个文件上运行规则。下面是我的问题的一个简单示例(我正在编写文件名以使其更简单)

当我运行此命令时:

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' > $@