2010-06-23 8 views
1

Мне нужно знать, есть ли какой-либо вариант для компиляции проекта delphi только в том случае, если был изменен исходный или любой используемый блок, пакет и т. Д.Delphi условная компиляция

Если это невозможно, вторая альтернатива: есть ли какая-либо опция для создания точно такой же двоичной копии, составляющей два раза один и тот же проект.

Спасибо.

Редактировать: Использование предназначено для хэша на основе WebUpdate.

+1

Я уверен, что Delphi не компилирует неизменные единицы, если вы не строите. –

+0

Но он генерирует другой хэш. Это может быть временная метка или что-то еще ... Но двоичный файл всегда отличается. –

+0

Глядя на информацию о версии, Delphi 2010, кажется, помещает CompileDate в exe (он включает время суток). Но почему вы хотели бы сделать один и тот же экзамен дважды? И я могу точно сказать вам, что Jens Björnhager прав, Delphi не компилирует неизменные единицы (их укусил при использовании разных условных определений для разных проектов). –

ответ

0

Delphi компилирует только измененные единицы при компиляции и компилирует все блоки независимо от состояния изменения в сборке.

Exe никогда не бывает одинаковым, на двоичном уровне. Просто дважды построил проект, переименовал exe для расширения txt и сравнил их с Beyond Compare: он показывает различия.

+0

У вас есть метка времени и cheksum в заголовке PE, который будет отличаться от каждой компиляции. –

+0

Да, но различия более распространены, чем это. На самом деле очень распространено ... –

+0

Просто проверил сравнение, которое я сделал снова. Есть много различий, хотя большинство из них - это точно такой же различие между двумя exe. См. Http://www.bjmsoftware.com/delphistuff/exe_comparison.jpg –

2

Delphi «compile» скомпилирует только измененные единицы. Но, как сказано, у блока есть данные, поэтому компилятор может проверить, какие потребности нужно обновить, а какие нет. И исполняемый файл может измениться, потому что процесс сборки может переупорядочить exe. Обновления в Интернете не должны использовать хеш-файл, он должен использовать информацию о версии, чтобы решить, что обновлять, а что нет. Вот как установщики проверяют, какие файлы следует заменить.

+0

Ваш подход прав, но я пытаюсь с чем-то более общим. –

+1

Хеш может сказать вам, только если файл отличается или нет, если он старше или новее. Это одна из причин, по которой были добавлены сведения о версии. – 2010-06-23 21:11:01

+0

@Idsandon: Если файлы одинаковые - кто заботится о том, что является более новым и старше? Не говоря уже о том, что внешние атрибуты файлов могут вам это сказать. Проблема с информацией о версии заключается в том, что ее необходимо изменить (вручную или автоматически), чтобы быть эффективной. Не было бы ничего более безопасного, чем сравнение хэшей/файла, если бы не тот факт, что нет автоматического переопределения автоматического изменения временной метки. –

0

Одно (жесткое) решение: сделайте свой exes с помощью Makefile! Файл makefile позволяет вам сказать: «Этот exe сделан из этих файлов, используя эти команды». Make будет запускать только «эти команды», если хотя бы один из файлов, которые вы перечисляете как составляющие ваш exe, новее, чем ваш exe.

Жесткая часть в этом заключается в создании списка файлов, которые составляют ваш exe: вы можете легко получить список файлов, перечисленных в DPR/DPROJ, но вам также необходимо будет идентифицировать все связанные ресурсы ($ R), все включенные файлы ($ INCLUDE), все файлы, которые implicitelly скомпилированы Delphi, потому что они используются в предложениях «uses» и находятся на пути к библиотеке.

Создание файла Makefile для общего случая очень сложно, но для одного конкретного проекта это может сработать. Например, вы можете подумать, что ваш файл зависит только от файлов, перечисленных в файлах DPR, а затем убедитесь, что вы добавили все соответствующие файлы в DPR.

Смежные вопросы