1

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

我认为我的 Builder 没问题:

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')]

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

env.Alias('convert_all', pix_conversions)

或者手工制作一个节点并将其Depends用于转换。

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

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

4

2 回答 2

1

扫描器用于隐式依赖。

例如,您要构建哪个foo取决于. 因此,当您告诉 SCons使用依赖项进行构建时,C 扫描器将根据显式依赖项自动获取式依赖项。foo.c#includebar.cfoofoo.cbar.cfoo.c

于 2010-02-13T06:01:39.380 回答
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 哈希,如果自上次转换以来某些文件发生更改,则构建器将再次启动。

于 2010-02-14T08:22:38.763 回答