Алгоритм работы: процесс билда (компиляция)

February 19th, 2010

Здесь рассказывается о том, что происходит после нажатия на кнопку Compile. Как-то:

  1. Опции диалога Build Settings.
  2. Папки для файлов полученных в результате компиляции.
  3. Описание процесса компиляции.
  4. Копирование ресурсов.

Этот диалог позволяет указать в какие папки должны быть помещены выходные файлы, какого типа файлы генерировать, а также указать параметры и директивы для компилятора.

  • Галочка Use Base dir – включает “режим использования базовой папки“. В этом режиме, пути указанные в “Binary/Bpl/Dcu/Debug Dcu/Resource output folder” будут считаться как относительные в отношении базовой папки. То есть (смотрите скриншот), если в качестве базовой папки указано “D:\Work\D2009\!Build”, а в “Binary output folder” указано “Bin”, то в качестве выходной папки для бинарных файлов будет использоваться “D:\Work\D2009\!Build°Bin”.
    • Binary output folder – выходная папка для бинарных файлов (*.exe и *.dll). По сути, для всех файлов получаемых из .dpr файлов (delphi project file).
    • Bpl output folder – выходная папка для bpl файлов (*.bpl) – файлов получаемых из .dpk файлов.
    • Dcu output folder – выходная папка для dcu файлов (*.dcu) – скомпилированных с выбранными настройками  .pas файлов.
    • Debug dcu output folder – выходная папка для dcu файлов (*.dcu) – скомпилированных с выбранными настройками и отладочной информацией .pas файлов.
    • Resource output folder – папка в которую будут скопированы все ресурсы. Ресурсы – это файлы, совпадающие с маской заданной в Resource filemasks.
    • Global DEFINEs – define директивы, которые будут переданы компилятору (ключ командной строки dcc.32 -D)
    • Add. compiler switches – дополнительные параметры командной строки, которые будут переданы компилятору (dcc32.exe). Именно здесь можно указать, использовать ли оптимизацию, включать ли assert-ы и прочее. Чтобы получить полный список параметров, запустите dcc32.exe с параметром /?. Примечание: в разных версиях Delphi параметры могут отличаться.
  • Create output folders if not exist – если папки, указанные в качестве папок “* output folder” не существуют, они будут созданы. В противном случае будет сгенерирована ошибка.
  • Clean output folders before compile – если включена галочка и папки указанные в “* output folder” существуют, то они будут очищены (переименованы в .bak. Для подробной информации, читайте следующую часть).
  • Если включена галочка Register packages in IDE, то скомпилированные bpl-ки, которые не помечены как Runtime only, будут зарегистрированы в IDE.
  • Если включена галочка Build all units – то компилятору командной строки (dcc32.exe) будет передан параметр –B.
  • Если включена галочка Build debug DCU’s – то каждый пэкэдж будет скомпилирован 2 раза. Один раз с указанными настройками, и второй с отключенной оптимизацией и включённой отладочной информацией. (параметры dcc32.exe -$O- -$D+). Все полученные при второй компиляции .dcu-файлы будут помещены в папку указанную в качестве Debug dcu output folder.
  • Если включена галочка Copy Resource files – то по окончании компиляции из папок помеченных в дереве файлов как Resource будут скопированы все файлы, отвечающие маске, указанной в Resource filemasks. Эти файлы будут скопированы в папку указанную в качестве Resource output folder.

После нажатия на кнопку OK, Lazy Delphi Builder определит порядок компиляции пэкэджей в соответствии с зависимостями.

Здесь объясняется как получается, что Корзина становится забитой тысячами файлов, откуда берутся папки с расширением .bak.

Первым делом Lazy Delphi Builder проверят, а выбран ли хотя бы один файл. Если в закладке Select files to compile ничего не было выбрано, то Lazy Delphi Builder прекращает процесс компиляции.

Затем Lazy Delphi Builder проверяет, была ли отмечена галочка Clean output folders before compile, и если была то происходит следующее:

  1. Ищутся папки с названиями указанными в Bin, Bpl, Dcu, DebugDcu, Dcp и Res и суффиксом .bak. Найденные .bak папки удаляются в Корзину
  2. Ищутся существующие папки с названиями указанными в Bin, Bpl, Dcu, DebugDcu, Dcp и Res и переименовываются в “Название папки.bak”.
  3. Создаются чистые папки Bin, Bpl, Dcu, DebugDcu, Dcp и Res.

Примечание: Папки создаются в зависимости от установленных галочек. Например, если галочка Copy resource files была выключена, то папка Res не будет создана. Аналогично для папки DebugDcu.

Если при удалении, переименовании, создании папок произошла ошибка, то программа показывает сообщение об ошибке прекращает процесс компиляции.

Сначала Lazy Delphi Builder компилирует пэкэджи (.dpk). Потом проекты.

Для компиляции запускается соответствующий выбранной версии Delphi dcc32.exe.

Сначала компилируется версия без отладочной информации. Выходные папки: Bpl, Dcu, Dcp.

Затем, если была отмечена галочка Build Debug Dcu, собирается тот же пэкэдж, но уже с отладочной информацией. Выходные папки: Bpl, DebugDcu, Dcp.

Если была отмечена галочка Build All Units, то компилятор командной строки будет вызван с параметром –B.

Перед запуском компилятора, Lazy Delphi Builder считывает настройки из конфигурационного файл пэкэджа (в зависимости от версии IDE это *.DProj, *.BDSProj; *.dof). При этом, если в рядом с пэкэджем обнаружен файл “Название пэкэджа.сfg”, то этот файл переименовывается. По окончании компиляции, .cfg файл возвращается назад.

Примечание 1: .cfg файл будет возвращён даже в том случае, если при компиляции произошла ошибка. Единственно причина, когда это может не произойти, – это в том случае если процесс Lazy Delphi Builder-a будет убит системой или же через менеджер процессов. Если такое случилось, отправьте пожалуйста отчёт об ошибке.

Примечание 2: чтобы посмотреть, какие параметры передаются компилятору, запустите Lazy Delphi Builder, передав с параметром командной строки /debug и на закладке Installation Log отметьте галочку: Show compilation debug info.

Если при компиляции возникла ошибка, то сообщение об ошибке будет отправлено в лог.

Если число ошибок превысит разрешённый максимум (по умолчанию 2 ошибки), то компиляция остановится, и в лог ещё раз будут выведены сообщения об ошибках.

Если была включена галочка Register packages in IDE, и скомпилированный пэкэдж не был runtime пэкэджем, то после успешной компиляции, он будет зарегистрирован в IDE.

Если число ошибок не превысило допустимое, то Lazy Delphi Builder принимается за компиляцию проектов.

Финальная стадия компиляции – это копирование файлов ресурсов в специальную папку. На самом деле, это более актуально при установке пэкэджей в IDE. Суть в том, что при компиляции проекта, использующего сторонние компоненты, Delphi требует наличия файлов ресурсов и .dfm, используемы в этих компонентах.

Comments are closed.