我有以下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 ,以便首先生成文件,然后打印它?
答案 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