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

saf*_*fsd 4 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)
Run Code Online (Sandbox Code Playgroud)

Ben*_*enG 11

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

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

现在,PDF目标生成一个report.pdffrom report.tex.我猜有一个隐含的依赖性和report.texspeed_analysis.tex(通过特克斯包括或类似的东西).

这个:

Depends(report, speed)
Run Code Online (Sandbox Code Playgroud)

如果它缺失则表达依赖是正确的.虽然我很惊讶PDF构建器的扫描程序没有看到隐式依赖...

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

scons --tree=all
Run Code Online (Sandbox Code Playgroud)

它应该看起来像这样:

+ report.pdf
  + report.tex
  + speed_analysis.tex
    + code/speed.py
    + /usr/bin/python
  + /usr/bin/pdflatex
Run Code Online (Sandbox Code Playgroud)

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

Command('speed_analysis.tex', 'code/speed.py', 'python $SOURCE -o $TARGET')
Run Code Online (Sandbox Code Playgroud)