Копия викизеркало

Это зеркало вики с pascal.chat. Правка, история и вход — там.

Macros and Conditionals/ru

English · Français · Русский

Обзор

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

Build macros (Макросы сборки) - это макросы, специфичные для проекта/пакета. Они не передаются компилятору. Ярким примером является LCLWidgetType, который определяется пакетом LCL и позволяет выбирать набор виджетов (carbon, gtk, qt, win32, wince, ...).

Conditionals (Условные определения) - это правила, позволяющие задавать макросы в зависимости от целевой платформы и/или других макросов. Например, вы можете использовать их для определения специальных параметров компоновщика при компиляции для Mac OS X. Они используют язык сценариев типа паскаль, позволяющий определять даже сложные правила.

Вы можете задать макросы сборки через Project / Project Options / Compiler Options / Additions and Overrides.

Вы можете задать условные определения через Project / Project Options / Compiler Options / Other / Conditionals (прим.перев.: в версиях Лазаруса 2.0.х и выше опция находится здесь Project / Project Options / Compiler Options / Custom Options).

Макросы сборки и условные определения существуют с Lazarus 0.9.29.

Условные определения

В условных определениях используется простой язык сценариев.

Изменение параметров компилятора с помощью условных определений

Сценарий условных определений может задавать некоторые переменные, значения которых используются IDE для параметров компилятора:

Для пакетов существует больше переменных для параметров использования. Эти пути наследуются, то есть добавляются ко всем пакетам/проектам, использующим этот пакет, прямо или косвенно:

Синтаксис условных определений

Поддерживаемые синтактические конструкции

Переменные

Переменные задаются просто путем присвоения значения. Есть несколько предопределенных переменных. См. список ниже.

Переменные могут быть определены или не определены:

pascal
if defined(Name) then ...
if undefined(Name) then ...
undefine(Name);

Если переменная задана, она имеет один из трех типов:

Переменная является false, если она имеет номер 0 или строку '0'. В противном случае это true. Это означает, что переменная без значения истинна и неопределенная переменная также истинна.

Вы можете изменить тип переменной с помощью:

pascal
a := '1';        // строка
a := integer(a); // преобразование в число с помощью StrToInt(), в случае неудачи 'a' остается строкой
a := int64(a);   // преобразование в число с помощью StrToInt6(), в случае неудачи 'a' остается строкой
a := string(a);  // преобразование в строку

Константы

pascal
a := 1234; // десятичная
a := $A1B; // шестнадцатеричная
a := &127; // восьмеричная
a := %101; // двоичная
a := '10'; // строковая
a := #123; // символьная

Операторы

Уровни приоритета:

Предопределенные переменные

Перед запуском условного сценария среда IDE инициализирует несколько переменных:

Предопределенные функции

Порядок вычисления макроса

  1. берутся значения текущего проекта
  2. если в проекте не определены значения для TargetOS, TargetCPU, IDE устанавливает значения по умолчанию
  3. SrcOS и SrcOS2 вычисляются из TargetOS
  4. вычисляются условные выражения используемых пакетов. Если пакет A использует пакет B, то условные выражения B вычисляются перед условными операторами A.
  5. Каждый условный сценарий начинается со значений проекта.
    • Если проект не определяет значение для макроса пакета, используется результат используемого пакета.
    • Сценарий может изменять любой макрос во время выполнения, но используются только макросы сборки и встроенные макросы. Например, вы можете установить для TargetOS другое значение, но это не повлияет ни на какой другой сценарий, ни на какой путь поиска с использованием $(TargetOS), даже на путь поиска самого пакета.
    • Если два пакета определяют один и тот же макрос сборки, то оба могут изменять значение (если только проект не устанавливает значение). Точный эффект зависит от порядка зависимости.
  6. Макросы IDE по умолчанию используются последними.

Примеры

Добавление флага компилятора для цели Linux

pascal
if TargetOS = 'linux' then 
  CustomOptions := '-dUseCThreads';

Примечание:

Добавление некоторых параметров компоновщика для цели Mac OS X

Компилятор использует для Mac OS X значение 'darwin' для TargetOS.

pascal
if TargetOS = 'darwin' then begin
  LinkerOptions += ' -framework Cocoa';
  if TargetCPU = 'i386' then 
    LinkerOptions += ' -framework OpenGL';
end;

Примечание:

Добавление некоторых параметров компоновщика для Mac OS X для всех проектов с использованием пакета

Пакеты имеют два разных набора опций. Набор, используемый для компиляции самого пакета, и параметры, добавленные ко всем проектам/пакетам, использующим пакет. Вам необходимо изменить параметр usage пакета:

pascal
if TargetOS = 'darwin' then begin
  UsageLinkerOptions += ' -framework Cocoa';
  if TargetCPU = 'i386' then 
    UsageLinkerOptions += ' -framework OpenGL';
end;

Добавление опции в пакет

Если ваш пакет предоставляет некоторые дополнительные части, например возможность использовать opengl, вы можете определить макрос сборки. Далее объясняется, как это настроить шаг за шагом:

Допустим, ваш пакет называется Pkg1 и позволяет включить поддержку opengl, скомпилировав его с флагом -dEnableOpenGL. В пакете должен быть логический параметр Pkg1_UseOpenGL со значениями 'True' и 'False'.

Откройте редактор пакетов 'pkg1', нажмите compiler options (Параметры компилятора), выберите страницу IDE Macros (Макросы IDE).

Нажмите кнопку слева +, чтобы добавить новый макрос. Он будет называться 'Pkg1_Macro1'. Щелкните узел дерева, чтобы переименовать его в 'Pkg1_UseOpenGL'.

Нажмите среднюю кнопку +, чтобы добавить новое значение макроса. Он будет называться 'Value1'. Щелкните узел дерева, чтобы переименовать его в 'True'. Повторите это для значения 'False'.

Добавьте следующий код в текстовое поле Conditionals (Compiler Options / Other / Conditionals):

pascal
if Pkg1_UseOpenGL = 'True' then 
  CustomOptions := '-dEnableOpenGL';

Примечание:

Добавление режима release/debug

Режим release/debug для вашего проекта и всех ваших пакетов

Примечание: для этого требуется Lazarus 0.9.31 или выше.

В параметрах компилятора проекта (Project / Project Options / Compiler Options / Build modes) добавьте режим сборки Release. Добавление этого режима сборки автоматически активирует его, поэтому все изменения параметров компилятора теперь выполняются только в этом режиме сборки.

В "Set Macro Values" (Установить значения макроса) щелкните левый столбец в последней строке "(none)". Установите его в "MyPackageOptions". Примечание: его нет в поле со списком.

Установите его значение в опции. Например, "-O3".

Этот макрос можно использовать в параметрах компилятора проекта и во всех пакетах.

Для каждого пакета выполните: Откройте параметры компилятора пакета, перейдите на страницу Other. Добавьте в Custom options текст $(MyPackageOptions).

Специальный режим release/debug для одного пакета

Допустим, нормальный режим - это режим debug, и вам нужен другой режим для release.

Откройте редактор пакетов 'pkg1', нажмите compiler options, выберите страницу Build Macros.

В разделе Build macros нажмите кнопку слева +, чтобы добавить новый макрос. Он будет называться 'Pkg1_Macro1'. Щелкните узел дерева, чтобы переименовать его в 'Pkg1_Release'.

Нажмите среднюю кнопку +, чтобы добавить новое значение макроса. Он будет называться 'Value1'. Щелкните узел дерева, чтобы переименовать его в 'True'. Повторите это для значения 'False'.

Добавьте следующий код в текстовое поле Conditionals:

pascal
if Pkg1_Release = 'True' then 
  // режим release
  CustomOptions := '-O3'
else
  // режим debug
  CustomOptions := '-Sa Ctroi';

Примечание:

Добавление макроса для путей поиска для работы с разными платформами

Допустим, ваш пакет называется Pkg1 и использует Windows GDI в MS Windows и X11 в Linux и BSD. Независимые от платформы модули находятся в основном каталоге пакета, и вы создали два подкаталога 'gdi' и 'x11', содержащие зависящие от платформы модули:

bash
/path/of/your/package/pkg1/
  pkg1.lpk
  pkg1.pas
  generalunit.pas
  gdi/
    backend.pas
  x11/
    backend.pas

Модуль backend в gdi следует использовать в Win32, Win64 и WinCE, а в Linux и FreeBSD следует использовать модуль backend в x11. Это означает, что путь поиска Other unit files (-Fu) (Другие файлы модулей (-Fu)) должен быть адаптирован в зависимости от целевой ОС. Ниже описывается, как настроить это шаг за шагом:

Откройте редактор пакетов 'pkg1', щелкните параметры компилятора, выберите страницу Build Macros (Сборка макросов).

Нажмите кнопку слева +, чтобы добавить новый макрос. Он будет называться 'Pkg1_Macro1'. Щелкните узел дерева, чтобы переименовать его в 'Pkg1_Backend'.

Нажмите среднюю кнопку +, чтобы добавить новое значение макроса. Он будет называться 'Value1'. Щелкните узел дерева, чтобы переименовать его в 'gdi'. Повторите это для значения 'x11'.

Добавьте следующий код в текстовое поле Conditionals:

pascal
// выбираем значение для Pkg1_Backend в зависимости от TargetOS
if undefined(Pkg1_Backend) then begin
  if SrcOS='win' then
    Pkg1_Backend:='gdi'
  else
    Pkg1_Backend:='x11';
end;

Макрос $(Pkg1_Backend) станет доступным после нажатия кнопки ОК. Итак, нажмите 'Ok', чтобы закрыть параметры компилятора, и откройте его снова, чтобы использовать его в пути поиска Other unit files (-Fu) (Другие файлы модулей (-Fu)).

Примечание:


From the Free Pascal wiki, page "Macros and Conditionals/ru", as it stood on 2021-01-24 after a change by Zoltanleo, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.

Версия 3, последнее изменение: WikiArchive, .