Makefile 生成文件顺序执行

Makefile 生成文件顺序执行,makefile,gnu,Makefile,Gnu,我有以下生成文件: all: generate print # <-- doesn't work date: date > date.txt ls: ls -la > ls.txt generate: ls date print: *.txt cat $^ clean: rm *.txt all:generate print#所需规则的依赖性层次结构是all->print->generate。 “打印”应依赖于“生成” 您拥有的Ma

我有以下生成文件:

all: generate print # <-- doesn't work

date: 
    date > date.txt

ls:
    ls -la > ls.txt

generate: ls date

print: *.txt
    cat $^

clean:
    rm *.txt

all:generate print#所需规则的依赖性层次结构是all->print->generate。
“打印”应依赖于“生成”

您拥有的Makefile很有趣。第一次通过时,它使用{all->generate->ls,date}层次结构生成.txt文件,但打印失败。在第二关,如果你不做清洁,它会工作

您拥有的“打印”规则是有效的规则。但不允许make知道在执行“打印”之前需要执行“生成”操作

您可以显式地创建一个打印规则,该规则表示它依赖于生成date.txt和ls.txt。试着像这样改变你的“全部”和“打印”规则

编辑:对不起!我给出的第一个答案不起作用。测试它。这很有效。

all: print # <- just print target here as you don't want generate to happen after print
.
print: generate ls.txt date.txt
    cat $^
*.txt。如果要对具有相同扩展名的多个文件进行操作,则可以执行不同的操作,例如,将文件列表放入make变量中。您可以使用make规则来计算此文件列表(在make中使用shell cmd)。但是,如果生成这些文件的是文件,那么make规则就不能依赖于已经存在的文件

“生成手册”提供了一个非常接近原始打印规则的规则-在规则先决条件中使用通配符。

Make有一个相当简单的依赖层次结构。Make将按顺序遵循依赖关系。 了解makefile将遵循的顺序可能很棘手,但实际上它非常简单,因此在理解它时非常值得

make系统的某些部分缺少对另一部分的依赖性是makefiles的常见问题。通常,构建系统可以避免这种情况,但有时可能会导致奇怪的情况(例如,链接到中后正在编译的对象文件)

制作手册有很好的介绍。

只需添加管道符号:

all: | generate print
从:

通过在“先决条件”列表中放置管道符号(
|
),可以指定仅订购先决条件:管道符号左侧的任何先决条件都是正常的;右侧的任何先决条件仅适用于以下顺序:

targets : normal-prerequisites | order-only-prerequisites

我认为问题在于打印的输入在一开始就进行了评估(当*.txt通配符不匹配时),因此这也不起作用。这怎么是一个有效的答案?仅限订单的先决条件不是问题的答案。他们只命令执行各自的配方,而不需要更新目标!他们与执行命令无关!嗯,我想我真正需要的是,打印中的通配符扩展会在以后进行。因为我刚才在这里读到的:我认为这是不可能的。*。txt在调用generate之前进行计算。所以我想做的可能行不通。谢谢你,高伊特。不过,请看我在问题下方的评论。我认为问题在于通配符扩展的时间,这是不容易解决的,除非,正如您正确地说的,通过明确列出文件。这样就完全避免了通配符。通配符使得后面的内容更难理解。我本以为使用akond的答案中的“仅限订单先决条件”规则会起作用。但事实并非如此。嗯,很有趣。我想这正是你们讨论的问题。广告建议在印刷品中使用通配符。也不起作用。Makefile执行一个空cat。(需要按ctrl-D使其继续)<代码>打印:$(通配符*.txt)
。将通配符放入变量中,结果相同。因此,是的,我认为这归结为必须有一个通过规则到目标的显式链接。请理解:make将在开始运行任何配方之前完全先读取和解析所有make文件。在make解析规则
print:*.txt
时,它必须展开通配符,以便知道如何构建依赖关系的内部图。当时,没有与
*.txt
匹配的文件。使用
通配符
函数不会改变这个基本角色:始终首先解析makefile。我不知道你为什么需要
打印
来依赖这些文件;为什么不使用规则:
print:;cat*.txt
targets : normal-prerequisites | order-only-prerequisites