扩展
如果我很好地理解了您的问题,您需要制作 %.fig.py 如果它不存在并保持原样(如果它存在)。
首先,如果您不想删除中间文件,则应将它们定义为珍贵:
.PRECIOUS: %.fig.py %.fig.raw.py
另一方面,如果%.fig.py
依赖于%.raw.fig.py
它将被重建,如果后者被编辑。所以 make%.fig.py
不依赖,%.raw.fig.py
只在%.fig.py
处理时创建。
一个示例 Makefile:
#!/usr/bin/make -f
.PHONY: plots clean
plots: a.png
%.png: %.fig.py
echo +$@+ $<
touch $@
%.fig.py:
echo Construct $(@:.fig.py=.fig.raw.py)
touch $(@:.fig.py=.fig.raw.py)
echo +$@+
touch $@
.PRECIOUS: %.fig.py
clean:
echo [Clean]
rm -f *.png *.fig.py *.fig.raw.py
如果 a.png 不存在则输出:
$ ./a.mak
echo Construct a.fig.raw.py
Construct a.fig.raw.py
touch a.fig.raw.py
echo +a.fig.py+
+a.fig.py+
touch a.fig.py
echo +a.png+ a.fig.py
+a.png+ a.fig.py
touch a.png
所以它会创建a.fig.raw.py
.png` a.fig.py
。中间文件不会被删除。
输出如果a.fig.raw.py
被编辑(我用过touch a.fig.raw.py
):
$ touch a.fig.raw.py
$ ./a.mak
make: Nothing to be done for `plots'.
输出如果a.fig.py
被编辑:
$ touch a.fig.py; ./a.mak
echo +a.png+ a.fig.py
+a.png+ a.fig.py
touch a.png
在这种情况下a.png
被重新制作,但a.fig.raw.py
根本没有被触及。
添加
其他有趣的问题如何使makefile 依赖于目录。例如,一些文件被创建到目录foo1/bar1
和foo2/bar2
. 如果一个新文件被写入此目录之一,foo<n>_bar<n>.png
则应创建该文件。
这是生成文件:
#!/usr/bin/make -f
.PHONY: clean plots
DIRS := foo1/bar1 foo2/bar2
TARGETS := $(addsuffix .png,$(subst /,_,$(DIRS)))
plots: $(TARGETS)
# Avoid to try to remake the makefile itself
a.mak: ;
# Avoid to try to remake the dirs
$(DIRS): ;
%.png: %.fig.py
touch "$@"
%.fig.py: %.raw.fig.py
if [ -s "$@" ]; then touch "$@"; else cp "$<" "$@"; fi
.PRECIOUS: %.fig.py %.raw.fig.py
clean:
echo [Clean]
rm -f *.png *.fig.py *.fig.raw.py
.SECONDEXPANSION:
%.raw.fig.py: $$(subst _,/,%)
echo Check dirs
touch "$@"
测试输出:
$ ./a.mak clean
echo [Clean]
[Clean]
rm -f *.png *.fig.py *.fig.raw.py
$ ./a.mak
echo Check dirs
Check dirs
touch foo1_bar1.raw.fig.py
touch foo1_bar1.fig.py
touch foo1_bar1.png
echo Check dirs
Check dirs
touch foo2_bar2.raw.fig.py
touch foo2_bar2.fig.py
touch foo2_bar2.png
$ touch foo1
$ ./a.mak
make: Nothing to be done for `plots'.
$ touch foo1/bar1
$ ./a.mak
echo Check dirs
Check dirs
touch foo1_bar1.raw.fig.py
touch foo1_bar1.fig.py
touch foo1_bar1.png
$ vim foo1_bar1.fig.py
$ ./a.mak
touch "foo1_bar1.png"
$ ./a.mak
make: Nothing to be done for `plots'.