4

我在 scons 中使用命令生成器来指定需要调用特定脚本来生成特定文件。

我只想运行脚本,如果它自先前生成文件以来已被修改。命令生成器的默认行为似乎总是运行脚本。我怎样才能改变这个?

这是我目前的 SConstruct:

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

2 回答 2

11

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

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

现在,PDF 目标生成一个report.pdffrom report.tex。我猜从report.texto有一个隐含的依赖关系speed_analysis.tex(通过 Tex include 或类似的东西)。

这:

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')
于 2010-03-25T03:43:09.080 回答
1

也许您的示例不完整,但您不应该这样做:

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

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

Command('speed_analysis.tex','code/speed.py','python code/speed.py')
于 2009-05-06T15:07:13.650 回答