Доброго всем дня.
Подскажите решение следующей проблемы:
Есть большой проект, состоящий из исходников и дополнительных файлов, генерируемых утилитой конфигурирования.
Дополнительные файлы включаются в исходники через #include
Проблема в том, что при изменении конфигурации утилита конфигурирования пересоздаёт все дополнительные файлы.
Как результат все исходники, где есть #include также требуется пересобирать.
Возможное решение проблемы — перед запуском утилиты конфигурирования снимать образ директорий с дополнительными файлами и после завершения
работы утилиты сравнивать пофайлово образ и текущие файлы.
Если файлы не поменялись по содержимому они восстанавливаются из образа (со старой датой создания/модификации) и в этом случае пересобирать требуется только те исходники, где реально поменялись #include файлы.
Есть ли какие-нибудь готовые решения?
Re: Утилита контроля изменений в генерируемых файлах
Генерировать в temp файл, потом запускать diff(в случае винды — FC) этого файла с уже существующим, если они разные то заменять, иначе игнорировать.
Я думаю, это добавление всего пяти строчек в скрипт генератора, зачем отдельная утилита
Re: Утилита контроля изменений в генерируемых файлах
Если входной .xml файл (конфигурационный файл для bcapi) не изменился, то повторная компиляция проекта не запускает генерацию
необходимых .h и .cpp файлов, как результат проект не пересобирается полностью.
Здравствуйте, GhostCoders, Вы писали:
GC>Здравствуйте, anidal, Вы писали:
A>>Есть ли какие-нибудь готовые решения? GC>Например, есть в CMake (https://cmake.org/) решение для этой проблемы.
GC>Там есть команда add_custom_command:
GC>add_custom_command( GC> OUTPUT GC> Файл_или_набор_файлов_которые_генерятся_вашими_скриптами GC> COMMAND GC> Сама_команда_которую_нужно_выполнить_для_генерации_включая_ключи_коммандной строки GC> MAIN_DEPENDENCY GC> Главная_зависимость_если_этот_файл_поменялся_то_запускается_генерация_если_не_изменился_то_не_запускается GC> DEPENDS GC> Другие_зависимости_если_эти_файлы_поменялись_то_запускается_генерация_если_не_изменились_то_не_запускается GC> WORKING_DIRECTORY GC> Рабочий_каталог_для_запуска_команды_генерации GC>)
GC>https://cmake.org/cmake/help/latest/command/add_custom_command.html
GC>Я это использую в моем проекте beautiful-capi https://github.com/PetrPPetrov/beautiful-capi GC>для условного запуска генератора врап классов и прочего.
GC>Если входной .xml файл (конфигурационный файл для bcapi) не изменился, то повторная компиляция проекта не запускает генерацию GC>необходимых .h и .cpp файлов, как результат проект не пересобирается полностью.
Переход на другую систему билда маловероятен, компилятор специфический. Но спасибо, появились идеи!
Re: Утилита контроля изменений в генерируемых файлах
Здравствуйте, Mystic Artifact, Вы писали:
MA>Здравствуйте, anidal, Вы писали:
MA>Если генератор свой — то можно перезаписывать файлы только если они реально изменились. Т.е. читать и сравнивать перед записью.
+1. Кстати, в bcapi мы так и делаем — https://github.com/PetrPPetrov/beautiful-capi/blob/master/source/FileGenerator.py
def __write(self):
if self.filename:
lines = []
# ...
lines += self.get_lines()
# ...if os.path.exists(self.filename):
new_hash = FileGenerator.get_hash(lines)
file = open(self.filename, 'r')
old_hash = FileGenerator.get_hash(file)
if new_hash == old_hash:
return
with open(self.filename, 'w') as output_file:
for line in lines:
output_file.write(line)
Третий Рим должен пасть!
Re[3]: Утилита контроля изменений в генерируемых файлах
Здравствуйте, GhostCoders, Вы писали:
GC>Здравствуйте, Mystic Artifact, Вы писали:
MA>>Здравствуйте, anidal, Вы писали:
MA>>Если генератор свой — то можно перезаписывать файлы только если они реально изменились. Т.е. читать и сравнивать перед записью. GC>+1. Кстати, в bcapi мы так и делаем — https://github.com/PetrPPetrov/beautiful-capi/blob/master/source/FileGenerator.py
GC>
GC> def __write(self):
GC> if self.filename:
GC> lines = []
GC> # ...
GC> lines += self.get_lines()
GC> # ...
GC> if os.path.exists(self.filename):
GC> new_hash = FileGenerator.get_hash(lines)
GC> file = open(self.filename, 'r')
GC> old_hash = FileGenerator.get_hash(file)
GC> if new_hash == old_hash:
GC> return
GC> with open(self.filename, 'w') as output_file:
GC> for line in lines:
GC> output_file.write(line)
GC>
да, я так и планирую для своего генератора, но есть ряд файлов, которые генерятся посторонними утилитами. Либо внутри bat-файлов.
Вот я и ищу некое готовое решение, чтобы перед вызовом создания файла его прочитать, посчитать хеш и сравнить с новым и потом принимать решение нужно ли перезаписывать.
FC делает это, но возвращает листинг различий. И как потом этот листинг в bat-файле обработать? Возвращала бы она 1 если различаются и 0 если одинаковы...
Хотя склоняюсь что написать самому будет быстрее чем найти
Re[4]: Утилита контроля изменений в генерируемых файлах
Здравствуйте, anidal, Вы писали:
A>FC делает это, но возвращает листинг различий. И как потом этот листинг в bat-файле обработать? Возвращала бы она 1 если различаются и 0 если одинаковы...
Кроме std::out еще есть код возврата. Лень проверять как там работает fc, но по-идее должен возвращать разные коды возврата, 0 или 1...
Третий Рим должен пасть!
Re[3]: Утилита контроля изменений в генерируемых файлах
Здравствуйте, anidal, Вы писали:
A>Переход на другую систему билда маловероятен, компилятор специфический. Но спасибо, появились идеи!
CMake можно по-идее настроить на нужный компилятор. Там есть переменные CMAKE_CXX_COMPILER (например, bcc32 для Borland), для линкера и прочие.
Третий Рим должен пасть!
Re[5]: Утилита контроля изменений в генерируемых файлах
Здравствуйте, GhostCoders, Вы писали:
GC>Здравствуйте, anidal, Вы писали:
A>>FC делает это, но возвращает листинг различий. И как потом этот листинг в bat-файле обработать? Возвращала бы она 1 если различаются и 0 если одинаковы... GC>Кроме std::out еще есть код возврата. Лень проверять как там работает fc, но по-идее должен возвращать разные коды возврата, 0 или 1...
О, супер, я протупил. Действительно есть! Спасибо!