Как SCons может обнаружить изменения в скрипте SConstruct? - PullRequest
0 голосов
/ 10 мая 2018

Я хочу создавать файлы на основе переменных, которые назначены в файле SConstruct. Как в этом примере:

import os

env  = Environment(ENV = os.environ)

def text_file_maker(target, source, env):
    with open(str(target[0]), "w") as text_file:
        text_file.write(env['my_text'])
    return 0


env.Append( BUILDERS = {'Make_text' : Builder(action = text_file_maker)})


env.Make_text(target = 'sour.txt', 
    source = None, 
    my_text = 'lemon')


env.Make_text(target = 'sweet.txt', 
    source = None, 
    my_text = 'apple')

При запуске этого скрипта создаются два текстовых файла с содержимым «лимон» и «яблоко». Если я снова запускаю скрипт, SCons правильно обнаруживает, что цели существуют:

scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
scons: `.' is up to date.
scons: done building targets.

Теперь, если я меняю одну цель, например:

env.Make_text(target = 'sweet.txt', 
    source = None, 
    my_text = 'orange')

и запустите скрипт, я получу scons: '.' is up to date., а содержимое 'orange' не будет записано в sweet.txt.

Я мог бы указать зависимость:

Depends(['sweet.txt', 'sour.txt'], 'SConstruct')

но это вызывает перестройку для любого изменения в моем скрипте SConstruct.

Как я могу заставить SCons распознавать изменения в скрипте SConstruct, которые влияют на цели?

Это может быть очень простой вопрос, извините, если я пропустил что-то очевидное.

1 Ответ

0 голосов
/ 11 мая 2018

Ваш пример очень похож на ответ, который находится на странице руководства (Поиск "Объекты действия"):

https://scons.org/doc/production/HTML/scons-man.html

Третий и последующие аргументы, если они присутствуют, могут быть либо переменной конструкции, либо списком переменных конструкции, значения которых будут включены в сигнатуру действия при принятии решения о том, следует ли перестраивать цель, поскольку действие изменилось. Переменные также могут быть указаны с помощью параметра varlist = keyword ; если оба присутствуют, они объединены. Это необходимо всякий раз, когда вы хотите, чтобы цель была перестроена при изменении конкретной переменной конструкции. Это не часто требуется для строкового действия, так как расширенные переменные обычно являются частью командной строки, но может быть необходимо, если действие Python-функции использует значение переменной конструкции при генерации командной строки.

def build_it(target, source, env):
    # build the target from the 'XXX' construction variable
    open(target[0], 'w').write(env['XXX'])
    return 0

# Use positional arguments.
a = Action(build_it, '$STRINGIT', ['XXX'])

# Alternatively, use a keyword argument.
a = Action(build_it, varlist=['XXX'])

Так что в вашем случае измените:

env.Append( BUILDERS = {'Make_text' : Builder(action = text_file_maker)})

К

tfb_action = Action(text_file_maker, varlist=['my_text'])
env.Append( BUILDERS = {'Make_text' : Builder(action = tfb_action)})
...