2015-09-04 4 views
0
функции

Python, может быть действием SCons используется в Builder, как описано в SCons user manual. Эта функция будет вызываться SCons всякий раз, когда ЛЮБОЙ из источников меняется. Источники передаются в виде списка SCons файлов объекты Внутри этой функции я хочу знать, если конкретный источник был изменен (и, таким образом, какие исходные файлы вынуждены SCons восстановить цель строителя).Получить какие файлы были изменены файлы внутри Scons строителя действий

так что если «file.target» построен с использованием «file1.src» и «file2.src» с помощью пользовательского построителя, который вызывает в Python функцию «custom_build»:

env.CUSTOM_BUILDER('file.target', ['file1.src', 'file2.src']) 

def custom_build(env, source, target): 
    # Checks if file1.src has been modified 
    if source[0].has_been_modified: # Does something like this exist?? 

Я осмотрел этот файл объектов при отладке, но без успеха. Есть ли какое-либо свойство, чтобы знать, что определенный файл изменился внутри построителя SCons?

+1

Это не задача Действия Строителя. Определяя файлы '* .src' как источники для вашей цели, SCons автоматически регистрирует зависимость между этими файлами. Когда изменяется один из ваших исходных файлов (в зависимости от того, какой метод Decider() вы используете), вы вызываете свое действие «custom_build». Его единственная задача - воссоздать цель из данных источников, решение о том, когда этот шаг произойдет, находится на другом уровне. – dirkbaechle

+0

Я понимаю вашу точку зрения. Но предположим, что для воссоздания цели мне нужно знать, какие файлы были изменены. Предположим, что целью является простой файл, в котором перечислены файлы, которые были изменены из всех возможных источников, которые могут использоваться для воссоздания цели. У Сконса есть эта информация, поэтому мой вопрос касался того, как ее получить. –

+0

Я нашел и разместил решение, которое соответствует моим потребностям. В любом случае, спасибо за ваше время и беспокойство. –

ответ

0

Я нашел возможное решение при поиске на узле .__ init__ пакет (Scons опциона --debug = объяснить дает здесь информацию об источниках на каждую мишень). Это не очень приятно, но, похоже, выполняет эту работу. По крайней мере, это мне подходит. Ключ должен использовать changed_since_last_build на цель.

def build(env, target, source): 
    old = target[0].get_stored_info() 
    old = old.binfo 
    old.prepare_dependencies() 
    old_bkids = old.bsources + old.bdepends + old.bimplicit 
    old_bkidsigs = old.bsourcesigs + old.bdependsigs + old.bimplicitsigs 
    osig = dict(zip(old_bkids, old_bkidsigs)) 

    for src_file, info in osig.iteritems(): 
     print str(src_file) + ' change status: ' + str(src_file.changed_since_last_build(target[0], info)) 
+0

Из того, что я вижу, вы просто используете тот же метод, который SCons использует внутри, чтобы узнать, был ли файл изменен или нет. Но вы выполняете этот код прямо в SConstruct/SConscript всякий раз, когда вы вызываете свой новый метод «build» явно. Это не удастся, если (один из) ваших источников создается во время самой сборки (например, с автогенерированным заголовком). Он может работать для вас в достаточно простых случаях, но я хотел бы предупредить других пользователей не использовать этот метод в своих проектах. Извините, они упадут на их лицо. – dirkbaechle

+0

Короткое дополнительное замечание: вы в настоящее время вызываете 'changed_since_last_build' на источник, а не на цель. – dirkbaechle

Смежные вопросы