Pré-processamento de makefile
Você pode controlar a sessão NMAKE usando diretivas e expressões de pré-processamento. Instruções de pré-processamento podem ser colocadas no makefile ou no Tools.ini
. Usando diretivas, você pode processar condicionalmente o makefile, exibir mensagens de erro, incluir outros makefiles, indefinir uma macro e ativar ou desativar determinadas opções.
Diretivas de pré-processamento de makefile
As diretivas de pré-processamento não diferenciam maiúsculas de minúsculas. O ponto de exclamação inicial (!
) deve aparecer no início da linha. Zero ou mais espaços ou guias podem aparecer após o ponto de exclamação, para recuo.
!CMDSWITCHES
{+
opção |-
opção } ...Ativa ou desativa cada opção listada. Espaços ou guias devem aparecer antes do operador
+
ou-
. Nenhum espaço pode aparecer entre o operador e as letras de opção. As letras não diferenciam maiúsculas de minúsculas e são especificadas sem uma barra (/
). Para ativar algumas opções e desativar outras, use especificações separadas de!CMDSWITCHES
.Somente
/D
,/I
,/N
e/S
podem ser usado em um makefile. EmTools.ini
, todas as opções são permitidas, exceto/F
,/HELP
,/NOLOGO
,/X
e/?
. As alterações especificadas em um bloco de descrição não entrarão em vigor até o próximo bloco de descrição. Esta diretiva atualizaMAKEFLAGS
; as alterações são herdadas durante a recursão, seMAKEFLAGS
for especificado.!ERROR
TextoExibe text no erro U1050 e, em seguida, interrompe o NMAKE, mesmo se
/K
,/I
,.IGNORE
,!CMDSWITCHES
ou o modificador de comando traço (-
) for usado. Espaços ou tabulações antes de text são ignorados.!MESSAGE
TextoExibe text para saída padrão. Espaços ou tabulações antes de text são ignorados.
!INCLUDE
[<
] filename [>
]Lê filename como um makefile e, em seguida, continua com o makefile atual. O NMAKE pesquisa o filename primeiro no diretório especificado ou atual e, em seguida, recursivamente por meio de diretórios de qualquer makefiles pai, em seguida, se filename estiver entre colchetes angulares (
< >
), em diretórios especificados pela macroINCLUDE
, que inicialmente é definida como a variável de ambienteINCLUDE
. Útil para passar configurações.SUFFIXES
,.PRECIOUS
, e regras de inferência para makefiles recursivos.!IF
constant_expressionProcessa instruções entre
!IF
e o próximo!ELSE
ou!ENDIF
se constant_expression for avaliado como um valor diferente de zero.!IFDEF
macro_nameProcessa instruções entre
!IFDEF
e a próxima!ELSE
ou!ENDIF
se macro_name for definida. Uma macro nula é considerada definida.!IFNDEF
macro_nameProcessa instruções entre
!IFNDEF
e a próxima!ELSE
ou!ENDIF
se macro_name não estiver definido.!ELSE
IF
[ constant_expression |IFDEF
macro_name |IFNDEF
macro_name ]Processa instruções entre
!ELSE
e a próxima!ENDIF
se a instrução anterior!IF
,!IFDEF
ou!IFNDEF
for avaliada como zero. As palavras-chave opcionais dão mais controle sobre o pré-processamento.!ELSEIF
Sinônimo para
!ELSE IF
.!ELSEIFDEF
Sinônimo para
!ELSE IFDEF
.!ELSEIFNDEF
Sinônimo para
!ELSE IFNDEF
.!ENDIF
Marca o final de um bloco
!IF
,!IFDEF
ou!IFNDEF
. Qualquer texto depois de!ENDIF
na mesma linha é ignorado.!UNDEF
macro_nameNão define macro_name.
Expressões no pré-processamento de makefile
O !IF
ou !ELSE IF
constant_expression consiste em constantes inteiras (em notação decimal ou em linguagem C), constantes de cadeia de caracteres ou comandos. Use parênteses para agrupar expressões. Expressões usam aritmética de inteiro longo com sinal C; os números estão no formulário complemento de dois bits de 32 bits no intervalo -2147483648 a 2147483647.
As expressões de pré-processamento makefile podem usar operadores que agem em valores constantes, códigos de saída de comandos, cadeias de caracteres, macros e caminhos do sistema de arquivos.
Operadores de pré-processamento de makefile
As expressões de pré-processamento makefile podem usar operadores que agem em valores constantes, códigos de saída de comandos, cadeias de caracteres, macros e caminhos do sistema de arquivos. Para avaliar a expressão, o pré-processador primeiro expande macros, executa comandos para, então, realizar as operações. Ele avalia as operações na ordem de agrupamento explícito entre parênteses e, em seguida, na ordem de precedência do operador. O resultado é um valor constante.
O operador DEFINED
é um operador lógico que age em um nome de macro. A expressão DEFINED( macro_name )
é verdadeira se macro_name estiver definido, mesmo que não tenha um valor atribuído. DEFINED
em combinação com !IF
ou !ELSE IF
é equivalente a !IFDEF
ou !ELSE IFDEF
. Porém, diferentemente dessas diretivas, o DEFINED
pode ser usado em expressões complexas.
O operador EXIST
é um operador lógico que age em um caminho do sistema de arquivos. EXIST( path )
é true se path existir. O resultado de EXIST
pode ser usado em expressões binárias. Se path contiver espaços, coloque-o entre aspas duplas.
Para comparar duas cadeias de caracteres, use o operador de igualdade (==
) ou de desigualdade (!=
). Coloque as cadeias de caracteres entre aspas duplas.
As constantes de inteiro podem usar os operadores unários na negação numérica (-
), no complemento de um (~
) e na negação lógica (!
).
As expressões podem usar os operadores a seguir. Os operadores de precedência igual são agrupados, e os grupos são listados em ordem decrescente de precedência. Os operadores unários são associados ao operando à direita. Os operadores binários de precedência igual associam operandos da esquerda para a direita.
Operador | Descrição |
---|---|
DEFINED( macro_name ) |
Produz um valor lógico para o estado de definição atual de macro_name. |
EXIST( caminho ) |
Produz um valor lógico para a existência de um arquivo em path. |
! |
NOT lógico unário. |
~ |
Complemento de um unário. |
- |
Negação unária. |
* |
Multiplicação. |
/ |
Divisão. |
% |
Módulo (pendências). |
+ |
Adição. |
- |
Subtração. |
<< |
Mudança bit a bit para esquerda. |
>> |
Mudança bit a bit para direita. |
<= |
Menor que ou igual a. |
>= |
Maior que ou igual a. |
< |
Menor que. |
> |
Maior que. |
== |
Igualdade. |
!= |
Desigualdade. |
& |
AND bit a bit. |
^ |
XOR bit a bit. |
| |
OR bit a bit. |
&& |
AND Lógico. |
|| |
OR Lógico. |
Observação
O operador XOR bit a bit (^
) é igual ao caractere de escape, e o escape deverá ser feito (como ^^
) quando ele for usado em uma expressão.
Executando um programa em pré-processamento
Para usar o código de saída de um comando durante o pré-processamento, especifique o comando, com quaisquer argumentos, entre colchetes ([ ]
). Todas as macros são expandidas antes que o comando seja executado. O NMAKE substitui a especificação de comando pelo código de saída do comando, que pode ser usado em uma expressão para controlar o pré-processamento.
Exemplo
!IF [my_command.exe arg1 arg2] != 0
!MESSAGE my_command.exe failed!
!ENDIF