我正在使用scons中的Command构建器来指定需要调用特定脚本来生成特定文件。
我想仅在以前生成文件后修改脚本才运行该脚本。 “命令”构建器的默认行为似乎是始终运行脚本。我怎么能改变这个?
这是我目前的SConstruct:
speed = Command('speed_analysis.tex','','python code/speed.py')
report = PDF(target = 'report.pdf', source = 'report.tex')
Depends(report, speed)
答案 0 :(得分:11)
首先,看起来code/speed.py
无法控制输出文件名...硬编码输出文件名在scons中通常被认为是不好的做法(请参阅yacc工具)。它会更好地读取:
speed = Command('speed_analysis.tex', [], 'python code/speed.py -o $TARGET')
现在,PDF目标从report.pdf
生成report.tex
。我猜测从report.tex
到speed_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')