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

StackOverflow https://stackoverflow.com/questions/828075

  •  06-07-2019
  •  | 
  •  

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

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

这是我目前的SConstruct:

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

解决方案

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

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

现在,PDF目标从 report.tex 生成 report.pdf 。我猜测从 report.tex 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')

其他提示

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

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

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

Command('speed_analysis.tex','code/speed.py','python code/speed.py')
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top