如何限制SCons Command构建器仅在其依赖项已更改时才运行?

时间:2009-05-06 04:53:19

标签: python scons

我正在使用scons中的Command构建器来指定需要调用特定脚本来生成特定文件。

我想仅在以前生成文件后修改脚本才运行该脚本。 “命令”构建器的默认行为似乎是始终运行脚本。我怎么能改变这个?

这是我目前的SConstruct:

speed = Command('speed_analysis.tex','','python code/speed.py')
report = PDF(target = 'report.pdf', source = 'report.tex')
Depends(report, speed)

2 个答案:

答案 0 :(得分:11)

首先,看起来code/speed.py无法控制输出文件名...硬编码输出文件名在scons中通常被认为是不好的做法(请参阅yacc工具)。它会更好地读取:

speed = Command('speed_analysis.tex', [], 'python code/speed.py -o $TARGET')

现在,PDF目标从report.pdf生成report.tex。我猜测从report.texspeed_analysis.tex的隐含依赖(通过Tex包含或类似的东西)。

此:

Depends(report, speed)

如果缺少依赖关系,那么表达该依赖是正确的。虽然我很惊讶PDF构建器的扫描程序没有看到隐式依赖...

您应该使用以下方法验证dep树:

scons --tree=all

看起来应该是这样的:

+ report.pdf
  + report.tex
  + speed_analysis.tex
    + code/speed.py
    + /usr/bin/python
  + /usr/bin/pdflatex

现在,回答关于脚本(speed.py)总是在运行的问题,那是因为它没有输入。没有什么可以让scons检查。该脚本文件必须读取某事作为输入,如果只是py文件本身。你需要告诉scons所有直接和隐含的依赖关系,以便短路后续运行:

Command('speed_analysis.tex', 'code/speed.py', 'python $SOURCE -o $TARGET')

答案 1 :(得分:1)

也许你的例子不完整,但你不应该这样做:

env = Environment()
env.Command(....

我认为您需要将依赖项指定为Command的第二个参数:

Command('speed_analysis.tex','code/speed.py','python code/speed.py')