SCons - 转换目录中所有图片

1 投票
2 回答
835 浏览
提问于 2025-04-15 19:13

我想写一个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哈希值,如果某个文件自上次转换以来有变化,那么构建程序会再次启动。

撰写回答