我试图了解makefile的工作原理。如果我尝试以下
1.out : 1.inp
cat 1.inp
它,按预期工作(如果1.inp更新为1.out或如果1.out不存在,则打印1.inp的内容)。
然后我需要做以下事情:
cat 1.inp
cat 2.inp
cat 3.inp
我认为我可以使用
%.out : %.inp
cat $<
但它不起作用。任何人都可以向我解释%
的使用吗?
答案 0 :(得分:4)
在你的第一个makefile中:
1.out: 1.inp
cat 1.inp
1.out
是目标,其中包含先决条件 1.inp
和命令 cat 1.inp
。这构成了规则
制作1.out
并且如果你运行makefile,指定没有明确的目标或目标1.out
,那么
规则将被执行。
在你的第二个makefile中:
%.out: %.inp
cat $<
您只是表达了一个模式规则,用于从某种 .inp形式的先决条件中创建某种 .out形式的目标您尚未指定makefile可以生成的任何实际目标。
您可以将1.out
指定为具有以下makefile的目标:
%.out: %.inp
cat $<
1.out:
在这种情况下,1.inp
将cat
- 1.inp
更新1.out
或者您可以指定假冒目标,例如all
,在这样的makefile中具有先决条件目标1.out
,2.out
,3.out
:
.PHONY: all
%.out: %.inp
cat $<
all: 1.out 2.out 3.out
在这种情况下,1.inp
,2.inp
和3.inp
中的每一个都会cat
- 当它比相应的.out
文件更新时。{/ p>
每当make发现它必须制作某种 .out形式的目标时,它会认识到模式规则是适用的,并将执行匹配的实例模式规则。