我想编写一个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方式吗?
答案 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哈希,如果自上次转换后某个文件发生了更改,那么构建器将再次启动。