【问题标题】:SCons - convert all images in a directorySCons - 转换目录中的所有图像
【发布时间】:2010-02-14 16:22:38
【问题描述】:

我想编写一个 SConstruct 文件,它将(例如)目录中的所有 JPEG 文件转换为 PNG。

我认为我的 Builder 没问题:

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)

或者手动创建一个节点并在转换中使用Depends

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

有没有更多的 SCons-y 方式来做到这一点?

【问题讨论】:

  • 你这样做是为了好玩吗?如果不看转换,ImageMagick 工具 (www.imagemagick.org)
  • 只是一个更新:SCons 做得很好,但是一旦我尝试在我们的真实数据上运行它,在各种目录中可能有 50,000 张图像,SCons 开始花费大约半个小时来考虑要转换哪些图像。所以我切换到make,一切都很好...... sigh

标签: python scons


【解决方案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 哈希,如果自上次转换以来某些文件发生更改,则构建器将再次启动。

【讨论】:

  • 你能解释一下 AlwaysBuild 函数在这种情况下的作用吗?谢谢!!
  • @Ross Rogers - 我看到了那个页面,但它对我来说有点太抽象了——AlwaysBuild 是否强制 convert_all 总是过时的?这是否意味着它将始终检查 .png 是最新的,还是意味着它将始终重建它们?谢谢你们!
  • AlwaysBuild 用于非文件系统对象,以确保在需要时构建它们。您的 Alias() 已创建虚拟目标,因此您需要确保每次运行 scons convert_all 时都会调用您的转换构建器。您可能会认为 AlwaysBuild 大致相当于 Makefile 中的 .PHONY。
【解决方案2】:

扫描器用于隐式依赖。

例如你想构建foo,它依赖于foo.c,它执行#includebar.c。因此,当您告诉 SCons 构建具有依赖关系 foo.cfoo 时,C scanner 将根据 显式 依赖关系 @ 自动获取 隐式 依赖关系 bar.c 987654329@.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 2014-01-17
    • 2014-07-25
    • 1970-01-01
    • 2015-07-19
    • 1970-01-01
    • 2019-07-28
    相关资源
    最近更新 更多