SCons - 转换目录中所有图片
我想写一个SConstruct文件,用来把一个文件夹里的所有JPEG文件转换成PNG格式。
我觉得我的构建器写得还不错:
ConvToPNG = Builder(action = 'convert $SOURCE $TARGET',
suffix = '.png',
src_suffix = '.jpg')
env['BUILDERS']['ConvToPNG'] = ConvToPNG
但是我不太确定怎么列出所有需要构建的目标。我可以用一种Python风格的方法来做:
pix_conversions = [env.ConvToPNG(jpg_src) for jpg_src in Glob('pix/img_*.jpg')]
然后我可能会用一个别名来处理这些目标:
env.Alias('convert_all', pix_conversions)
或者手动创建一个节点,让它依赖于这些转换。
问题是,这看起来像是扫描器的功能。但我没能让它正常工作。我尝试创建一个可以在文件夹上运行的构建器,并调用一个扫描器来添加很多目标,但没成功,因为SCons内部的逻辑是期望构建器在文件上运行。(至少,我从错误信息中得出的结论是这样的)。
有没有更符合SCons的方式来做到这一点呢?
2 个回答
1
扫描器是用来处理隐式依赖关系的。
比如说,你想要构建一个叫foo
的程序,而这个程序依赖于foo.c
文件,而foo.c
又包含了bar.c
文件。这样,当你告诉SCons去构建foo
,并且指定了依赖foo.c
时,C扫描器会自动识别出隐式依赖bar.c
,这是基于你已经明确指定的显式依赖foo.c
。
2
你的步骤看起来没问题,但你需要把别名节点传递给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哈希值,如果某个文件自上次转换以来有变化,那么构建程序会再次启动。