有关Make的一些基本问题:使用图形编译报表

时间:2019-06-04 19:06:44

标签: makefile

我试图让Make在每次更新图形时重新编译报告。我有以下代码:

fig1.eps : images/code/fig1.m
        matlab -nodesktop -nosplash -r 'run ./images/code/fig1.m'
  1. 如何在所有图形上进行匹配-如fig * .eps。我想检查所有数据并更新那些不是最新的数据。

  2. 当我运行上面的命令时,它会不断重新运行。这就是说:生成了fig1.eps。再次运行make之后,它应该给我一条消息“ fig1.eps是最新的”。但是,脚本没有重新运行。为什么要这样做?

1 个答案:

答案 0 :(得分:1)

  
      
  1. 如何匹配所有数字-例如fig * .eps。我想检查所有数据并更新那些不是最新的数据。
  2.   

如果您使用的是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')
  
      
  1. 当我运行上面的命令时,它会不断重新运行。这就是说:生成了fig1.eps。我再次运行make之后,它应该给我   一条消息“ fig1.eps是最新的”。但是,脚本没有重新运行。   为什么要这样做?
  2.   

很可能是因为您的matlab命令没有产生规则的目标。例如,它可能正在创建一个具有相同名称但在不同目录中的文件,或者它根本没有将其输出写入文件中。可能是因为还触发了其他规则,这些规则导致.eps文件被删除。