【发布时间】:2016-12-04 08:36:58
【问题描述】:
我希望一个规则像一个函数一样运行,例如 gzip 我所有的临时目标。我在 makefile 中编写了这些规则:
%.file0:
touch $@
%.file1: %
touch $@
%.file2: %
touch $@
%.gz: %
echo "zipping to $@"
touch $@
我可以打电话
$ make -n dotted.file.file0.file1.file2.gz -f makefile
touch dotted.file.file0
touch dotted.file.file0.file1
touch dotted.file.file0.file1.file2
echo "zipping to dotted.file.file0.file1.file2.gz"
rm dotted.file.file0 dotted.file.file0.file1.file2 dotted.file.file0.file1
我的最后一个目标将被成功压缩。然后我可以 gzip dotted.file.file0.file1 之前:
$ make -n dotted.file.file0.file1.gz.file2 -f makefile
touch dotted.file.file0
touch dotted.file.file0.file1
echo "zipping to dotted.file.file0.file1.gz"
touch dotted.file.file0.file1.gz.file2
rm dotted.file.file0 dotted.file.file0.file1.gz dotted.file.file0.file1
该文件在被赋予规则 %.file2 之前也会被 gzip 压缩。但我不能 gzip 几个目标:
$ make -n dotted.file.file0.file1.gz.file2.gz -f makefile
make: *** No rule to make target `dotted.file.file0.file1.gz.file2.gz'. Stop.
我怎样才能做到这一点,即在多个目标上应用 %.gz 规则?
编辑 1
从另一个角度来看,我尝试用这种方式重写我的规则:
%.file0:
touch $@
%.file1: %.gz
touch $@
%.file2: %.gz
touch $@
%.gz: %
echo "zipping to $@"
touch $@
然后我调用make:
$ make -n dotted.file.file0.file1.file2 -f makefile
make: *** No rule to make target `dotted.file.file0.file1.file2'. Stop.
我希望/希望 gnu-make 以这种顺序执行规则:
- ask for the file dotted.file.file0.file1.file2
- go to rule %.file2
- ask for the dependency dotted.file.file0.file1.gz
- go to rule %.gz
- as for the dependency dotted.file.file0.file1
- go to rule %.file1
- as for the dependency dotted.file.file0.gz
- go to rule %.gz
- as for the dependency dotted.file.file0
- go to rule %.file0
- create file dotted.file.file0
但是,如果我只要求一条规则应用%.gz,那么这一次就可以了。
生成文件:
%.file0:
touch $@
%.file1: %.gz # !!! Notice I left this single dependency to the rule %.gz
touch $@
%.file2: % ## !!! Notice I removed the .gz here
touch $@
%.gz: %
echo "zipping to $@"
touch $@
命令:
$make -n dotted.file.file0.file1.file2 -f makefile
touch dotted.file.file0
touch dotted.file.file0.file1
echo "zipping to dotted.file.file0.file1.gz"
touch dotted.file.file0.file1.gz
touch dotted.file.file0.file1.file2
rm dotted.file.file0.file1.gz dotted.file.file0 dotted.file.file0.file1
【问题讨论】:
-
是否有某些原因需要这些复合文件名(例如
bar.file0.file1.file2而不是bar.file2)? -
唯一的原因是跟踪哪些步骤(规则)已应用于文件,这是有用的。这就是为什么 make 不会两次应用相同的规则吗?
-
你在乞求这个问题。构建
bar.file0.file1.file2可能需要一些努力和聪明才智来完成;构建bar.file2要容易得多,而且名称传达的信息完全相同。