Как заставить компоновщик SCons Command работать только в том случае, если изменились его зависимости? - PullRequest
4 голосов
/ 06 мая 2009

Я использую компоновщик команд в scons, чтобы указать, что для создания определенного файла необходимо вызвать определенный скрипт.

Я хотел бы запустить сценарий, только если он был изменен, так как файл был сгенерирован ранее. Поведение компоновщика команд по умолчанию, по-видимому, всегда запускает скрипт. Как я могу изменить это?

Это мой текущий SConstruct:

speed = Command('speed_analysis.tex','','python code/speed.py')
report = PDF(target = 'report.pdf', source = 'report.tex')
Depends(report, speed)

Ответы [ 2 ]

11 голосов
/ 25 марта 2010

Во-первых, похоже, что code/speed.py не управляет выходным именем файла ... Закодированные выходные имена файлов обычно считаются плохой практикой в ​​scons (см. Инструмент yacc). Было бы лучше читать так:

speed = Command('speed_analysis.tex', [], 'python code/speed.py -o $TARGET')

Теперь цель PDF выдает report.pdf из report.tex. Я предполагаю, что существует неявная зависимость от report.tex до speed_analysis.tex (через Tex include или что-то в этом роде).

Это:

Depends(report, speed)

Правильно ли выражать эту зависимость, если она отсутствует. Хотя я удивлен, что сканер для PDF Builder не увидел эту неявную зависимость ...

Вы должны проверить дерево депов, используя:

scons --tree=all

Это должно выглядеть примерно так:

+ report.pdf
  + report.tex
  + speed_analysis.tex
    + code/speed.py
    + /usr/bin/python
  + /usr/bin/pdflatex

Теперь, чтобы ответить на ваш вопрос о скрипте (speed.py), который всегда работает, это потому, что он не имеет ввода. Там нет ничего, чтобы scons проверить против. Этот файл сценария должен читать что-то в качестве входных данных, если только сам файл py. Вам необходимо сообщить scons обо всех прямых и неявных зависимостях, чтобы он мог закорачивать последующие запуски:

Command('speed_analysis.tex', 'code/speed.py', 'python $SOURCE -o $TARGET')
1 голос
/ 06 мая 2009

Возможно, ваш пример неполон, но вы не должны делать:

env = Environment()
env.Command(....

Я думаю, вам нужно указать свои зависимости в качестве второго аргумента команды:

Command('speed_analysis.tex','code/speed.py','python code/speed.py')
...