Makefile顺序执行

scr*_*rrr 5 gnu makefile

我有以下Makefile:

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

date: 
    date > date.txt

ls:
    ls -la > ls.txt

generate: ls date

print: *.txt
    cat $^

clean:
    rm *.txt
Run Code Online (Sandbox Code Playgroud)

目标日期ls生成每个文件,目标打印,打印出来.

如何编写目标all,以便它首先生成文件然后打印出来?

ako*_*ond 7

或者只是添加管道符号:

all: | generate print
Run Code Online (Sandbox Code Playgroud)

从make manual:可以通过在先决条件列表中放置管道符号(|)来指定仅订单的先决条件:管道符号左侧的任何先决条件都是正常的; 右边的任何先决条件都是仅限订单:

目标:正常先决条件| 订单仅-先决条件

  • 我认为问题是打印输入在开始时评估(当*.txt通配符不匹配时),所以这也不起作用.HM (3认同)
  • 这如何是一个有效的答案?仅限订单的先决条件并不能解决问题。他们只命令执行各自的配方,而不需要更新目标!它们与执行顺序无关!/sf/answers/1739969801/ (2认同)

gao*_*the 3

你想要的规则的依赖层次是全部->打印->生成。“打印”应该依赖于“生成”。

你的 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 $^
Run Code Online (Sandbox Code Playgroud)

如果打印未显式依赖于文件或生成,则 Make 可以决定先执行打印操作,然后再执行生成操作。

这是可行的,但我们收到一个错误,因为不存在的文件生成的猫不起作用。

更进一步。。。摆脱生成规则。我认为如果 date 和 ls 规则明确详细说明了它们生成的文件,则会更好,即

all: print

date.txt:
    date > date.txt

ls.txt:
    ls -la > ls.txt

print: ls.txt date.txt
    cat $^
Run Code Online (Sandbox Code Playgroud)

*。TXT。如果您想对具有相同扩展名的多个文件进行操作,那么您可以执行不同的操作,例如将文件列表放入 make 变量中。您可以使用 make 规则来计算此文件列表(在 make 中使用 shell cmd)。但是,如果是生成文件的东西,则该 make 规则不能依赖于已存在的文件。

制作手册给出的规则非常接近原始打印规则 - 在规则先决条件中使用通配符。 http://www.gnu.org/software/make/manual/make.html#Wildcard-Examples

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

对于 make 文件来说,make 系统的某些部分缺少对另一个部分的依赖是一个常见问题。通常构建系统会摆脱这个问题,但有时它可能会导致奇怪的情况(例如,目标文件在链接后被编译)。

make手册有很好的介绍。 http://www.gnu.org/software/make/manual/make.html#Introduction