SCons - 转换目录中的所有图像

时间:2010-02-12 19:57:36

标签: python scons

我想编写一个SConstruct文件,将目录中的所有JPEG文件转换为PNG格式。

我想我的生成器好了:

ConvToPNG = Builder(action = 'convert $SOURCE $TARGET',
        suffix = '.png',
        src_suffix = '.jpg')
env['BUILDERS']['ConvToPNG'] = ConvToPNG

但后来我不确定如何列出需要构建的所有目标。我可以用Python-y的方式做到这一点:

pix_conversions = [env.ConvToPNG(jpg_src) for jpg_src in Glob('pix/img_*.jpg')]

然后也许我会为那些使用Alias:

env.Alias('convert_all', pix_conversions)

或者手动制作一个节点,并在转化时使用Depends

问题是,这似乎是扫描仪为其制造的东西。但我无法让它运作良好。我尝试制作一个可以在目录上工作的Builder,并调用一个可以添加一堆目标的Scanner,但它不起作用,因为SCons内部构件希望Builder在文件上运行。 (或者至少,这是我从错误信息中收集到的信息)。

有更多的SCons-y方式吗?

2 个答案:

答案 0 :(得分:1)

扫描程序用于隐式依赖项。

e.g。您希望构建foo,这取决于执行foo.c #include bar.c的{​​{1}}。因此,当您告诉SCons构建具有依赖关系foo的{​​{1}}时,C scanner将根据隐式依赖关系foo.c >显式依赖bar.c

答案 1 :(得分:1)

您的步骤似乎很好,但您需要将Alias节点传递给AlwaysBuild函数:

env.AlwaysBuild(env.Alias('convert_all', pix_conversions))

所以最终的结果是:

ConvToPNG = Builder(action = 'convert $SOURCE $TARGET',
        suffix = '.png',
        src_suffix = '.jpg')
env['BUILDERS']['ConvToPNG'] = ConvToPNG
pix_conversions = [env.ConvToPNG(jpg_src) for jpg_src in Glob('pix/img_*.jpg')]
env.AlwaysBuild(env.Alias('convert_all', pix_conversions))

没有任何扫描仪,它会正常工作。 SCons将检查您的JPEG文件的MD5哈希,如果自上次转换后某个文件发生了更改,那么构建器将再次启动。