ПРИМЕЧАНИЕ Это 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 Дата.
Спасибо tom. Что касается 'Depends()', это имеет смысл. Как заставить мою программу зависеть от цели моего строителя? 'SomeProg' всегда скомпилирован правильно, проблема заключается в том, что SCons не вызывает вызов создателя' IncrementBuildNumber', когда я меняю файл cpp, который косвенно '# включает' файл ', который он создает (' BuildNumber.h') , Я рассмотрю идею post action. Спасибо, Том. –
Что касается вашего последнего сообщения. Строго, 'BuildNumber.h' необходимо обновить _before_ сборки SomeProg и действительно только в том случае, если SomeProg не обновлен (и поэтому его необходимо перестроить). Если я обновляю его после этого, это не приведет к тому, что SomeProg всегда будет устаревшим? –
@AdamNaylor, если вам нужно что-то сделать до того, как будет создана цель, рассмотрите возможность использования функции AddPreAction() Scons. Вот связанный ответ: http://stackoverflow.com/a/17329704/1158895 – Brady