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. Em Tools.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 atualiza MAKEFLAGS; as alterações são herdadas durante a recursão, se MAKEFLAGS for especificado.

  • !ERRORtext

    Exibe 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.

  • !MESSAGEtext

    Exibe text para saída padrão. Espaços ou tabulações antes de text são ignorados.

  • !INCLUDE [ < ] filename [ > ]

    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 macro INCLUDE, que inicialmente é definida como a variável de ambiente INCLUDE. Útil para passar configurações .SUFFIXES, .PRECIOUS, e regras de inferência para makefiles recursivos.

  • !IFconstant_expression

    Processa instruções entre !IF e o próximo !ELSE ou !ENDIF se constant_expression for avaliado como um valor diferente de zero.

  • !IFDEFmacro_name

    Processa instruções entre !IFDEF e a próxima !ELSE ou !ENDIF se macro_name for definida. Uma macro nula é considerada definida.

  • !IFNDEFmacro_name

    Processa instruções entre !IFNDEF e a próxima !ELSE ou !ENDIF se macro_name não estiver definido.

  • !ELSE [ IFconstant_expression | IFDEFmacro_name | IFNDEFmacro_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.

  • !UNDEFmacro_name

    Não define macro_name.

Expressões no pré-processamento de makefile

O !IF ou !ELSE IFconstant_expression consiste em constantes inteiras (em notação decimal ou em linguagem C), constantes de string 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

Confira também

Referência a NMAKE