我想要一個規則表現爲一個函數,例如可以gzip所有我的臨時目標。我寫這些規則在makefile:將gnu-make規則作爲函數應用
%.file0:
touch [email protected]
%.file1: %
touch [email protected]
%.file2: %
touch [email protected]
%.gz: %
echo "zipping to [email protected]"
touch [email protected]
我可以叫
$ 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壓縮。那麼我可以前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 [email protected]
%.file1: %.gz
touch [email protected]
%.file2: %.gz
touch [email protected]
%.gz: %
echo "zipping to [email protected]"
touch [email protected]
然後我打電話讓:
$ 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 [email protected]
%.file1: %.gz # !!! Notice I left this single dependency to the rule %.gz
touch [email protected]
%.file2: % ## !!! Notice I removed the .gz here
touch [email protected]
%.gz: %
echo "zipping to [email protected]"
touch [email protected]
命令:
$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')? – Beta
唯一的重點是跟蹤哪些步驟(規則)已應用於文件,這是提供信息。這就是爲什麼不會使用相同的規則兩次? – kaligne
你在問這個問題。建立'bar.file0.file1。file2'大概可以用一些努力和聰明來完成;建立'bar.file2'要容易得多,而且名字傳達的信息完全相同。 – Beta