2013-07-03 2 views
2

ПРИМЕЧАНИЕ Это my previous question.Scons Builder не реконструирует свою цель

Мое мышления Я непонимание одной из наиболее фундаментальных аспектов того, как Scons работает, но вот иллюстративное подмножество моей проблемы:

У меня есть файл SConscript, содержащие (в основном):

def IncrementBuildNumber(env, target, source): 
    #write some #define's to 'target' file using vanilla python code 
    return None 

someProg = env.Program('SomeProg', source_list) 

buildNumber = env.Builder(action = IncrementBuildNumber) 
buildNumber_h = buildNumber(env, env.GetBuildPath('BuildNumber.h'), []) 
env.Depends(someProg, buildNumber_h) 

Так что в основном я делаю Builder, который вызывает функцию Python, которая записывает код C++ в файл target. Этот конструктор вызывается с моим BuildNumber.h файлом, в котором мне нужен исходный код #include.
Заключительный звонок Depends() - это попытка вызвать конструктор каждый раз, когда SomeProg перестроен.

Этот подход почти работает. При первом построении все работает правильно, BuildNumber.h генерируется с правильным номером сборки.
Немедленная перестройка правильно считает все актуальной и не вызывает повторного вызова создателя IncrementBuildNumber.
Однако проблема в том, что я обновляю файл .cpp, который косвенно зависит от BuildNumber.h. Он восстанавливает измененный исходный файл, но я предполагаю, что цель Builder является актуальной и решает не вызывать ее.

Как я могу заставить SCons «понадобиться» для вызова моего строителя (или команды или чего бы то ни было, когда это необходимо) всякий раз, когда вещи, зависящие от него, нуждаются в перестройке?

Я чувствую себя довольно близко к решению, но просто не хватает какой-то окончательной части знаний о том, как работает Скон.

я, возможно, придется отметить, что я использую VARIANT_DIR так что я могу удалить файлы, если это необходимо ...
Кроме того, я попытался AlwaysBuild(), но как вы уже догадались, это всегда Приращивает даже когда someProg вверх-to Дата.

ответ

0

Во-первых, ваша последняя линия работает как env.Depends(some_prog, None).

Возможно, это не то, что вы намеревались.

Что касается вашего другого вопроса, если он не создает «SomeProg» после компиляции вашего файла cpp, возможно ли, что вы используете только проверки md5, и в этом случае возможно, что содержимое файла .o Фактически, даже если вы меняете файл .h? Поскольку в этом случае, SCons не будет беспокоить восстановление исполняемого файла.

Кроме того, если вы хотите изменить BuildNumber.h в результате создания someProg, почему бы не повторить его как действие post? происходит ли действие более одного раза?

+0

Спасибо tom. Что касается 'Depends()', это имеет смысл. Как заставить мою программу зависеть от цели моего строителя? 'SomeProg' всегда скомпилирован правильно, проблема заключается в том, что SCons не вызывает вызов создателя' IncrementBuildNumber', когда я меняю файл cpp, который косвенно '# включает' файл ', который он создает (' BuildNumber.h') , Я рассмотрю идею post action. Спасибо, Том. –

+0

Что касается вашего последнего сообщения. Строго, 'BuildNumber.h' необходимо обновить _before_ сборки SomeProg и действительно только в том случае, если SomeProg не обновлен (и поэтому его необходимо перестроить). Если я обновляю его после этого, это не приведет к тому, что SomeProg всегда будет устаревшим? –

+0

@AdamNaylor, если вам нужно что-то сделать до того, как будет создана цель, рассмотрите возможность использования функции AddPreAction() Scons. Вот связанный ответ: http://stackoverflow.com/a/17329704/1158895 – Brady

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