Pre-elaborazione di makefile
È possibile controllare la sessione NMAKE usando le direttive e le espressioni di pre-elaborazione. Le istruzioni di pre-elaborazione possono essere inserite nel makefile o in Tools.ini
. Usando le direttive, è possibile elaborare in modo condizionale il makefile, visualizzare i messaggi di errore, includere altri makefile, annullare la definizione di una macro e attivare o disattivare determinate opzioni.
Direttive di pre-elaborazione di makefile
Le direttive di pre-elaborazione non fanno distinzione tra maiuscole e minuscole. Il punto esclamativo iniziale (!
) deve essere visualizzato all'inizio della riga. Zero o più spazi o tabulazioni possono essere visualizzati dopo il punto esclamativo, per il rientro.
!CMDSWITCHES
{+
opzione |-
} ...Attiva o disattiva ogni opzione elencata. Gli spazi o le schede devono essere visualizzati prima dell'operatore
+
o-
. Non possono essere visualizzati spazi tra l'operatore e le lettere di opzione. Le lettere non fanno distinzione tra maiuscole e minuscole e vengono specificate senza una barra (/
). Per attivare alcune opzioni e disattivarne altre, usare specifiche separate di!CMDSWITCHES
.Solo
/D
,/I
,/N
e/S
possono essere usati in un makefile. InTools.ini
tutte le opzioni sono consentite tranne/F
,/HELP
,/NOLOGO
,/X
e/?
. Le modifiche specificate in un blocco di descrizione non diventano effettive fino al blocco di descrizione successivo. Questa direttiva aggiornaMAKEFLAGS
; le modifiche vengono ereditate durante la ricorsione, seMAKEFLAGS
specificato.!ERROR
TestoVisualizza il testo nell'errore U1050, quindi interrompe NMAKE, anche se
/I
!CMDSWITCHES
/K
.IGNORE
viene usato , o il modificatore di comando trattino ().-
Spazi o tabulazioni prima che il testo venga ignorato.!MESSAGE
TestoVisualizza il testo nell'output standard. Spazi o tabulazioni prima che il testo venga ignorato.
!INCLUDE
[<
] filename [>
]Legge il nome file come makefile, quindi continua con il makefile corrente. NMAKE cerca prima il nome file nella directory specificata o corrente, quindi in modo ricorsivo tramite le directory di qualsiasi makefile padre, quindi, se filename è racchiuso tra parentesi angolari (
< >
), nelle directory specificate dallaINCLUDE
macro, che inizialmente viene impostata sullaINCLUDE
variabile di ambiente. Utile per passare.SUFFIXES
le impostazioni,.PRECIOUS
e le regole di inferenza ai makefile ricorsivi.!IF
constant_expressionElabora le istruzioni tra
!IF
e il successivo!ELSE
o!ENDIF
se constant_expression restituisce un valore diverso da zero.!IFDEF
macro_nameElabora le istruzioni tra
!IFDEF
e il successivo!ELSE
o!ENDIF
se è definito macro_name . Una macro Null viene considerata definita.!IFNDEF
macro_nameElabora le istruzioni tra
!IFNDEF
e il successivo!ELSE
o!ENDIF
se macro_name non è definito.!ELSE
[IF
constant_expression macro_nameIFDEF
| macro_name ] |IFNDEF
Elabora le istruzioni tra
!ELSE
e la successiva!ENDIF
se l'istruzione ,!IFDEF
o!IFNDEF
precedente!IF
ha valutato zero. Le parole chiave facoltative consentono di controllare ulteriormente la pre-elaborazione.!ELSEIF
Sinonimo di
!ELSE IF
.!ELSEIFDEF
Sinonimo di
!ELSE IFDEF
.!ELSEIFNDEF
Sinonimo di
!ELSE IFNDEF
.!ENDIF
Contrassegna la fine di un
!IF
blocco ,!IFDEF
o!IFNDEF
. Qualsiasi testo dopo!ENDIF
nella stessa riga viene ignorato.!UNDEF
macro_nameMacro_name non definito.
Espressioni nella pre-elaborazione di makefile
L'oggetto !IF
o !ELSE IF
constant_expression è costituito da costanti integer (in notazione decimale o in linguaggio C), costanti stringa o comandi. Usare le parentesi per raggruppare le espressioni. Le espressioni usano l'aritmetica aritmetica con segno con segno C; i numeri sono in forma di complemento a 32 bit nell'intervallo -2147483648 da 2147483647.
Le espressioni possono usare operatori che agiscono su valori costanti, codici di uscita da comandi, stringhe, macro e percorsi del file system.
Operatori di pre-elaborazione di makefile
Nelle espressioni della pre-elaborazione di makefile è possibile usare operatori che agiscono sui valori delle costanti, sui codici di uscita dei comandi, su stringhe, macro e percorsi del file system. Per valutare l'espressione, il preprocessore espande prima le macro e quindi esegue i comandi e quindi esegue le operazioni. Valuta le operazioni in ordine di raggruppamento esplicito tra parentesi e quindi in ordine di precedenza dell'operatore. Il risultato è un valore costante.
L'operatore DEFINED
è un operatore logico che agisce sul nome di una macro. L'espressione DEFINED( macro_name )
è true se viene definita macro_name , anche se non ha un valore assegnato. DEFINED
in combinazione con !IF
o !ELSE IF
è equivalente a !IFDEF
o !ELSE IFDEF
. Tuttavia, a differenza di queste direttive, DEFINED
può essere usato in espressioni complesse.
L'operatore EXIST
è un operatore logico che agisce su un percorso del file system. EXIST( path )
è true se il percorso esiste. Il risultato da EXIST
può essere usato nelle espressioni binarie. Se il percorso contiene spazi, racchiuderlo tra virgolette doppie.
Per confrontare due stringhe, usare l'operatore di uguaglianza (==
) o l'operatore di disuguaglianza (!=
). Racchiudere le stringhe tra virgolette doppie.
Le costanti integer possono usare gli operatori unari per la negazione numerica (-
), il complemento (~
) e la negazione logica (!
).
Le espressioni possono usare gli operatori seguenti. Gli operatori con uguale precedenza vengono raggruppati e i gruppi vengono elencati in ordine di precedenza decrescente. Gli operatori unari si associano all'operando a destra. Gli operatori binari con uguale precedenza uguale si associano agli operandi da sinistra a destra.
Operatore | Descrizione |
---|---|
DEFINED( macro_name ) |
Produce un valore logico per lo stato di definizione corrente di macro_name. |
EXIST( sentiero ) |
Produce un valore logico per l'esistenza di un file nel percorso. |
! |
NOT logico unario. |
~ |
Complemento unario. |
- |
Negazione unaria. |
* |
Moltiplicazione. |
/ |
Divisione. |
% |
Modulo (resto). |
+ |
Addizione. |
- |
Sottrazione. |
<< |
Spostamento a sinistra bit per bit. |
>> |
Spostamento a destra bit per bit. |
<= |
Minore o uguale a. |
>= |
Maggiore o uguale a. |
< |
Minore di. |
> |
Maggiore di. |
== |
Uguaglianza. |
!= |
Disuguaglianza. |
& |
AND bit per bit. |
^ |
XOR bit per bit. |
| |
OR bit per bit. |
&& |
AND logico. |
|| |
OR logico. |
Nota
L'operatore XOR bit per bit (^
) è uguale al carattere di escape e deve essere preceduto da un carattere di escape (come ^^
) quando viene usato in un'espressione.
Esecuzione di un programma durante la pre-elaborazione
Per usare il codice di uscita di un comando durante la pre-elaborazione, specificare il comando, con qualsiasi argomento, tra parentesi quadre ([ ]
). Tutte le macro vengono espanse prima dell'esecuzione del comando. NMAKE sostituisce la specifica del comando con il codice di uscita del comando, che può essere usato in un'espressione per controllare la pre-elaborazione.
Esempio
!IF [my_command.exe arg1 arg2] != 0
!MESSAGE my_command.exe failed!
!ENDIF