Makefile顺序执行

时间:2014-03-25 09:58:41

标签: makefile gnu

我有以下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

目标 date ls 分别生成一个文件,目标 print ,将它们打印出来。

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

2 个答案:

答案 0 :(得分:7)

或只是添加管道符号:

all: | generate print
  

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

     

目标:正常先决条件|为了仅-先决条件

答案 1 :(得分:2)

您想要的规则的依赖等级是全部 - &gt;打印 - &gt;生成。 'print'应该依赖'generate'。

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

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

你可以明确地制作一个打印规则,说它依赖于生成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 $^

如果打印不是明确依赖于文件或生成,则可以决定先执行打印操作,然后再生成生成操作。

这样可行但我们收到错误,因为非existant文件生成的cat不起作用。

更进一步。 。 。摆脱生成规则。如果他们明确详细说明他们生成了什么文件,我认为日期和ls规则会更好。

all: print

date.txt:
    date > date.txt

ls.txt:
    ls -la > ls.txt

print: ls.txt date.txt
    cat $^

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

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

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

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

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