我试图让Make在每次更新图形时重新编译报告。我有以下代码:
fig1.eps : images/code/fig1.m
matlab -nodesktop -nosplash -r 'run ./images/code/fig1.m'
如何在所有图形上进行匹配-如fig * .eps。我想检查所有数据并更新那些不是最新的数据。
当我运行上面的命令时,它会不断重新运行。这就是说:生成了fig1.eps。再次运行make之后,它应该给我一条消息“ fig1.eps是最新的”。但是,脚本没有重新运行。为什么要这样做?
答案 0 :(得分:1)
- 如何匹配所有数字-例如fig * .eps。我想检查所有数据并更新那些不是最新的数据。
如果您使用的是make
的GNU实现,则可以使用模式规则:
fig%.eps : images/code/fig%.m
matlab -nodesktop -nosplash -r 'run ./$<'
如果您使用的是make
的另一个版本,则最好为每个图形编写一个单独的规则,而不必为每个图形编写一个单独的规则,该后缀规则将在与相应的Matlab脚本相同的目录中生成文件,类似:
.m.eps :
matlab -nodesktop -nosplash -r 'run ./$<'
.SUFFIXES: .m .eps
但是,这两个选项中的任何一个都要求您在某处指定要创建的所有图形。简单地说,您将枚举:
FIGS = fig1.eps fig2.eps fig5a.eps fig17.1.eps
...,然后将数字指定为默认(或其他一些)目标的先决条件:
all: $(FIGS)
但是,对于GNU make
,如果以有益的方式安排和命名Matlab文件,则还可以使用通配符扩展或shell命令来获取结果:
FIGS = $(shell cd images/code && ls fig*.m | sed 's/\.m$$/.eps')
- 当我运行上面的命令时,它会不断重新运行。这就是说:生成了fig1.eps。我再次运行make之后,它应该给我 一条消息“ fig1.eps是最新的”。但是,脚本没有重新运行。 为什么要这样做?
很可能是因为您的matlab命令没有产生规则的目标。例如,它可能正在创建一个具有相同名称但在不同目录中的文件,或者它根本没有将其输出写入文件中。可能是因为还触发了其他规则,这些规则导致.eps
文件被删除。