Утилита контроля изменений в генерируемых файлах
От: anidal  
Дата: 05.09.19 10:30
Оценка:
Доброго всем дня.
Подскажите решение следующей проблемы:
Есть большой проект, состоящий из исходников и дополнительных файлов, генерируемых утилитой конфигурирования.
Дополнительные файлы включаются в исходники через #include

Проблема в том, что при изменении конфигурации утилита конфигурирования пересоздаёт все дополнительные файлы.
Как результат все исходники, где есть #include также требуется пересобирать.

Возможное решение проблемы — перед запуском утилиты конфигурирования снимать образ директорий с дополнительными файлами и после завершения
работы утилиты сравнивать пофайлово образ и текущие файлы.
Если файлы не поменялись по содержимому они восстанавливаются из образа (со старой датой создания/модификации) и в этом случае пересобирать требуется только те исходники, где реально поменялись #include файлы.

Есть ли какие-нибудь готовые решения?
Re: Утилита контроля изменений в генерируемых файлах
От: koenjihyakkei Россия  
Дата: 05.09.19 10:40
Оценка:
Здравствуйте, anidal, Вы писали:

Генерировать в temp файл, потом запускать diff(в случае винды — FC) этого файла с уже существующим, если они разные то заменять, иначе игнорировать.
Я думаю, это добавление всего пяти строчек в скрипт генератора, зачем отдельная утилита
Re: Утилита контроля изменений в генерируемых файлах
От: GhostCoders Россия  
Дата: 05.09.19 10:40
Оценка: 1 (1) +1
Здравствуйте, anidal, Вы писали:

A>Есть ли какие-нибудь готовые решения?

Например, есть в CMake (https://cmake.org/) решение для этой проблемы.

Там есть команда add_custom_command:

add_custom_command(
OUTPUT
Файл_или_набор_файлов_которые_генерятся_вашими_скриптами
COMMAND
Сама_команда_которую_нужно_выполнить_для_генерации_включая_ключи_коммандной строки
MAIN_DEPENDENCY
Главная_зависимость_если_этот_файл_поменялся_то_запускается_генерация_если_не_изменился_то_не_запускается
DEPENDS
Другие_зависимости_если_эти_файлы_поменялись_то_запускается_генерация_если_не_изменились_то_не_запускается
WORKING_DIRECTORY
Рабочий_каталог_для_запуска_команды_генерации
)

https://cmake.org/cmake/help/latest/command/add_custom_command.html

Я это использую в моем проекте beautiful-capi https://github.com/PetrPPetrov/beautiful-capi
для условного запуска генератора врап классов и прочего.

Если входной .xml файл (конфигурационный файл для bcapi) не изменился, то повторная компиляция проекта не запускает генерацию
необходимых .h и .cpp файлов, как результат проект не пересобирается полностью.
Третий Рим должен пасть!
Отредактировано 05.09.2019 10:41 GhostCoders . Предыдущая версия .
Re[2]: Утилита контроля изменений в генерируемых файлах
От: anidal  
Дата: 05.09.19 10:57
Оценка:
Здравствуйте, 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  
Дата: 05.09.19 12:08
Оценка: +2
Здравствуйте, anidal, Вы писали:

Если генератор свой — то можно перезаписывать файлы только если они реально изменились. Т.е. читать и сравнивать перед записью.
Re[2]: Утилита контроля изменений в генерируемых файлах
От: GhostCoders Россия  
Дата: 05.09.19 12:15
Оценка:
Здравствуйте, 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]: Утилита контроля изменений в генерируемых файлах
От: anidal  
Дата: 06.09.19 04:56
Оценка:
Здравствуйте, 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]: Утилита контроля изменений в генерируемых файлах
От: GhostCoders Россия  
Дата: 06.09.19 12:23
Оценка:
Здравствуйте, anidal, Вы писали:

A>FC делает это, но возвращает листинг различий. И как потом этот листинг в bat-файле обработать? Возвращала бы она 1 если различаются и 0 если одинаковы...

Кроме std::out еще есть код возврата. Лень проверять как там работает fc, но по-идее должен возвращать разные коды возврата, 0 или 1...
Третий Рим должен пасть!
Re[3]: Утилита контроля изменений в генерируемых файлах
От: GhostCoders Россия  
Дата: 06.09.19 12:25
Оценка: +1
Здравствуйте, anidal, Вы писали:

A>Переход на другую систему билда маловероятен, компилятор специфический. Но спасибо, появились идеи!

CMake можно по-идее настроить на нужный компилятор. Там есть переменные CMAKE_CXX_COMPILER (например, bcc32 для Borland), для линкера и прочие.
Третий Рим должен пасть!
Re[5]: Утилита контроля изменений в генерируемых файлах
От: anidal  
Дата: 09.09.19 06:57
Оценка:
Здравствуйте, GhostCoders, Вы писали:

GC>Здравствуйте, anidal, Вы писали:


A>>FC делает это, но возвращает листинг различий. И как потом этот листинг в bat-файле обработать? Возвращала бы она 1 если различаются и 0 если одинаковы...

GC>Кроме std::out еще есть код возврата. Лень проверять как там работает fc, но по-идее должен возвращать разные коды возврата, 0 или 1...

О, супер, я протупил. Действительно есть! Спасибо!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.