2009-05-06 53 views
4

我正在使用scons中的命令生成器来指定需要调用特定脚本来生成特定文件。如何限制SCons命令生成器仅在其依赖关系发生更改时才运行?

我想只运行该脚本,如果它已被修改,因为该文件以前生成。 “命令”构建器的默认行为似乎是始终运行该脚本。我该如何改变这一点?

这是我目前SConstruct:

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

回答

11

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

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

,该PDF目标产生从report.tex一个report.pdf。我猜想有一个从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

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

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

我认为你需要为第二到指定的依赖参数命令:

Command('speed_analysis.tex','code/speed.py','python code/speed.py') 
相关问题