SCons - конвертировать все изображения в каталоге - PullRequest
1 голос
/ 12 февраля 2010

Я хотел бы написать файл SConstruct, который преобразует (например, все файлы JPEG в каталоге в PNG).

Думаю, у меня с Строителем все в порядке:

ConvToPNG = Builder(action = 'convert $SOURCE $TARGET',
        suffix = '.png',
        src_suffix = '.jpg')
env['BUILDERS']['ConvToPNG'] = ConvToPNG

Но тогда я не уверен, как составить список всех целей, которые нужно построить. Я могу сделать это в Python-у таким образом:

* +1007 *

И тогда, возможно, я буду использовать псевдоним для тех:

env.Alias('convert_all', pix_conversions)

Или же сделайте узел вручную и сделайте его Depends в преобразованиях.

Дело в том, что, похоже, это то, для чего предназначены сканеры. Но я не мог заставить это работать хорошо. Я попытался создать Builder, который работал бы с каталогом и вызывать Scanner, который бы добавил несколько целей, но это не сработало, потому что внутреннее устройство SCons ожидает, что Builder будет работать с файлом. (или, по крайней мере, это то, что я почерпнул из сообщений об ошибках).

Есть ли более SCons-y способ сделать это?

Ответы [ 2 ]

1 голос
/ 14 февраля 2010

Ваши шаги кажутся нормальными, но для узла 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 проверит MD5-хэш ваших файлов JPEG, и если какой-либо файл изменился с момента последнего преобразования, то сборщик будет запущен снова.

1 голос
/ 13 февраля 2010

Сканеры предназначены для неявных зависимостей.

например. Вы хотите построить foo, который зависит от foo.c, который делает #include из bar.c. Таким образом, когда вы говорите SCons собирать foo с зависимостью foo.c, сканер C автоматически подберет неявную зависимость bar.c на основе явного зависимость foo.c.

...