Получить scons для создания нового номера сборки

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

Это должно происходить только, когда цель устарела. IOW номер версии не меняется, если сборка не выполняется. Исходный файл контролируется исходным кодом и не является исходным файлом, иначе он может инициировать другую сборку при регистрации (из-за CI). УТОЧНЕНИЕ С точки зрения scons, код всегда будет устаревшим из-за автоматически сгенерированного исходного файла, но scons будет запускаться только из задания непрерывной интеграции (Jenkins) при обнаружении изменения SCM. .

Я просмотрел AddPostMethod, но это, кажется, срабатывает для всех файлов в списке исходных файлов.
Методы Command и Builder используют VARIANT_DIR, поэтому я не могу редактировать эти файлы, а затем возвращать их обратно, поскольку они больше не карта на репозиторий.

Я надеюсь, что просто неправильно понимаю некоторые тонкости scons, иначе у меня заканчиваются идеи!

Обновление Если подумать еще немного, комментарий Тома верен. Хотя у меня есть два файла, один текстовый файл с контролируемой версией (не исходный код) и один исходный файл без контроля исходного кода, нет возможности вернуть один файл и предотвратить непрерывный цикл сборки/регистрации. Jenkins увидит новый текстовый файл и запустит сборку, а scons увидит новый сгенерированный файл. Так что, если я не удалю сгенерированный файл в какой-то момент, хотя это, похоже, противоречит рабочему процессу обоих инструментов.

У кого-нибудь есть способ добиться этого? Это кажется довольно простым. В конечном счете, я просто хочу генерировать номера сборки каждый раз при запуске сборки.


person Adam Naylor    schedule 01.07.2013    source источник
comment
Я не уверен, что понимаю вопрос. Мне кажется, что вы всегда будете запускать перестроение таким образом, потому что, когда вы завершаете сборку после того, как что-то изменилось, вы обновляете исходный файл с новым номером и датой, а затем в следующий раз, когда вы делаете сборку, исходный файл изменился. Таким образом, это вызывает новую сборку.   -  person Tom Tanner    schedule 02.07.2013
comment
@TomTanner прав, за исключением того, что файл не будет проверен, поэтому CI (в данном случае Jenkins) не обнаружит изменение и не запустит scons. Но вы правы с точки зрения scons, источник изменился. Я объясню это более ясно в вопросе.   -  person Adam Naylor    schedule 02.07.2013
comment
Вы всегда можете ничего не делать в действии публикации, если источник не соответствует тому, который вы хотите?   -  person Tom Tanner    schedule 02.07.2013
comment
Я пошел по этому пути, но мне казалось, что я пытаюсь согнуть метод пост-экшена, чтобы сделать что-то, для чего он не предназначен. может еще раз посмотрю...   -  person Adam Naylor    schedule 02.07.2013
comment
вы должны быть в состоянии сделать AddPostAction('magic source file.o', func), если я правильно читаю документацию, но я никогда не использовал действие публикации, поэтому я не совсем уверен   -  person Tom Tanner    schedule 02.07.2013
comment
Ах, это может работать лучше. Я использовал AddPostAction(someProgram, func), что объясняет, почему я видел, как он запускался для каждого исходного файла, а не для одного.   -  person Adam Naylor    schedule 02.07.2013
comment
давайте продолжим это обсуждение в чате   -  person Adam Naylor    schedule 02.07.2013


Ответы (1)


Из раздела 8 Руководства пользователя SCons. , Зависимости только для заказа, вы можете использовать метод Requires:

import time

# put whatever text you want in your version.c; this is just regular python
version_c_text = """
char *date = "%s";
""" % time.ctime(time.time())
open('version.c', 'w').write(version_c_text)

version_obj = Object('version.c')

hello = Program('hello.c',
                LINKFLAGS = str(version_obj[0]))

Requires(hello, version_obj)

Следует отметить две вещи: сначала вы должны добавить явную зависимость Requires. Во-вторых, вы не можете сделать version_obj исходным кодом для сборщика программ, вам придется схитрить (здесь мы передаем его как linkflag), иначе вы получите автоматическую полную зависимость от него.

Это всегда будет обновлять версию.с, но не будет перестраиваться только потому, что версия.с изменилась.

person GaryO    schedule 11.06.2014