Предварительная обработка файла makefile
Вы можете управлять сеансом NMAKE с помощью директив и выражений предварительной обработки. Инструкции по предварительной обработке можно поместить в файл makefile или в Tools.ini
. С помощью директив можно условно обработать файл makefile, отобразить сообщения об ошибках, включить другие файлы makefile, отменить макрос и включить или отключить определенные параметры.
Директивы предварительной обработки файла makefile
Директивы предварительной обработки не учитывает регистр. Начальная восклицательный знак (!
) должна отображаться в начале строки. Ноль или несколько пробелов или вкладок могут отображаться после восклицательного знака для отступа.
!CMDSWITCHES
{+
option option-
| } ...Включает или отключает каждый указанный параметр . Пробелы или вкладки должны отображаться перед оператором или
-
оператором+
. Пробелы не могут отображаться между оператором и буквами параметров. Буквы не учитывает регистр и указываются без косой черты (/
). Чтобы включить некоторые параметры и отключить другие, используйте отдельные спецификации!CMDSWITCHES
.Только
/D
,/I
/N
и/S
может использоваться в файле makefile. ВоTools.ini
всех параметрах разрешены, кроме/F
,/HELP
,/NOLOGO
,/X
и/?
. Изменения, указанные в блоке описания, не вступают в силу до следующего блока описания. Эта директива обновляетсяMAKEFLAGS
; изменения наследуются во время рекурсии, еслиMAKEFLAGS
задано.!ERROR
СМСОтображает текст в ошибке U1050, а затем останавливает NMAKE, даже если
/I
!CMDSWITCHES
/K
.IGNORE
используется модификатор тире или тире ().-
Пробелы или вкладки перед тем, как текст игнорируется.!MESSAGE
СМСОтображает текст в стандартные выходные данные. Пробелы или вкладки перед тем, как текст игнорируется.
!INCLUDE
[ ]<
имя файла [ ]>
Считывает имя файла в виде файла makefile, а затем продолжается с текущим файлом makefile. NMAKE сначала ищет имя файла в указанном или текущем каталоге, а затем рекурсивно через каталоги любого родительского файла makefile, а затем, если имя файла заключено угловыми скобками (
< >
), в каталогах, указанных макросом, которое изначально задаетсяINCLUDE
переменнойINCLUDE
среды. Полезно передать.SUFFIXES
параметры и.PRECIOUS
правила вывода для рекурсивных файлов makefile.!IF
constant_expressionОбрабатывает операторы между
!IF
и следующими!ELSE
или!ENDIF
если constant_expression оценивается как ненулевое значение.!IFDEF
macro_nameОбрабатывает операторы между
!IFDEF
и следующими!ELSE
или!ENDIF
если macro_name определены. Макрос NULL считается определенным.!IFNDEF
macro_nameОбрабатывает операторы между
!IFNDEF
и следующими!ELSE
или!ENDIF
если macro_name не определены.!ELSE
[IF
constant_expression macro_name | |IFDEF
IFNDEF
macro_name ]Обрабатывает операторы между
!ELSE
и следующими!ENDIF
, если предыдущий!IFDEF
!IF
оператор или!IFNDEF
оператор оценивается до нуля. Необязательные ключевые слова дают дополнительный контроль над предварительной обработкой.!ELSEIF
Является синонимом элемента
!ELSE IF
!ELSEIFDEF
Является синонимом элемента
!ELSE IFDEF
!ELSEIFNDEF
Является синонимом элемента
!ELSE IFNDEF
!ENDIF
Помечает конец
!IF
или!IFDEF
!IFNDEF
блок. Любой текст после!ENDIF
того же строки игнорируется.!UNDEF
macro_nameНе определено macro_name.
Выражения в предобработке файлов makefile
Или !IF
!ELSE IF
constant_expression состоят из целых констант (в нотации десятичного или C-языка), строковых констант или команд. Используйте скобки для группирования выражений. Выражения используют арифметические целочисленные строки C; числа находятся в 32-разрядной двухфакторной форме в диапазоне -2147483648 до 2147483647.
Выражения могут использовать операторы, которые действуют на константных значениях, коды выхода из команд, строк, макросов и путей к файловой системе.
Операторы предварительной обработки файлов makefile
В выражениях предварительной обработки файлов makefile могут использоваться операторы, выполняющие действия с константными значениями, кодами завершения команд, строками, макросами и путями файловой системы. Чтобы оценить выражение, препроцессор сначала развертывает макросы, а затем выполняет команды, а затем выполняет операции. Он оценивает операции в порядке явной группировки в скобках, а затем в порядке приоритета оператора. Результатом является константное значение.
Оператор DEFINED
является логическим оператором, который действует в имени макроса. Выражение DEFINED( macro_name )
имеет значение true, если macro_name определен, даже если оно не имеет назначенного значения. DEFINED
в сочетании с !IF
или !ELSE IF
эквивалентен или эквивалентен !IFDEF
или !ELSE IFDEF
. Однако в отличие от этих директив, DEFINED
можно использовать в сложных выражениях.
Оператор EXIST
является логическим оператором, который действует на пути к файловой системе. EXIST( path )
значение true, если путь существует. Результат EXIST
можно использовать в двоичных выражениях. Если путь содержит пробелы, заключите его в двойные кавычки.
Чтобы сравнить две строки, используйте оператор равенства (==
) или оператор неравенства (!=
). Строки заключаются в двойные кавычки.
Целые константы могут использовать унарные операторы для числового отрицания (-
), дополнения одного (~
) и логического отрицания (!
).
В выражениях могут использоваться следующие операторы. Операторы с одинаковым приоритетом объединяются в группы, которые перечисляются в порядке убывания приоритета. Унарные операторы связываются с операндом справа. Бинарные операторы одинакового приоритета связывают операнды слева направо.
Operator | Description |
---|---|
DEFINED( macro_name ) |
Создает логическое значение для текущего состояния определения macro_name. |
EXIST( путь ) |
Создает логическое значение для существования файла по пути. |
! |
Унарное логическое НЕ. |
~ |
Унарное дополнение. |
- |
Унарное отрицание. |
* |
Умножение. |
/ |
Деление. |
% |
Модуль (остаток от деления). |
+ |
Сложение. |
- |
Вычитание. |
<< |
Побитовое смещение влево. |
>> |
Побитовое смещение вправо. |
<= |
Меньше или равно. |
>= |
Больше или равно. |
< |
Меньше. |
> |
Больше чем. |
== |
Равенство. |
!= |
Неравенство. |
& |
Битовый AND. |
^ |
Битовый XOR. |
| |
Битовый OR. |
&& |
Логический оператор AND. |
|| |
Логический оператор OR. |
Примечание.
Побитовый оператор XOR (^
) совпадает с символом escape- и должен быть экранирован (как ^^
) при использовании в выражении.
Выполнение программ в ходе предварительной обработки
Чтобы использовать код выхода команды во время предварительной обработки, укажите команду с любыми аргументами в скобках ([ ]
). Все макросы развертываются перед выполнением команды. NMAKE заменяет спецификацию команды кодом выхода команды, который можно использовать в выражении для управления предварительной обработкой.
Пример
!IF [my_command.exe arg1 arg2] != 0
!MESSAGE my_command.exe failed!
!ENDIF