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

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

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

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

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

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

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

1

Решение

От Руководство пользователя SCons, раздел 8, Зависимости только для заказа, Вы можете использовать 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 источником компоновщика Программы, вы должны обмануть (здесь мы передаем его как флаг ссылки), в противном случае вы получите автоматическую полную зависимость от него.

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

1

Другие решения

Других решений пока нет …