Voglio creare una macro il cui argomento è facoltativo. Se non specificato, il valore dell'argomento dovrebbe essere una stringa vuota. Come posso fare questo? Grazie per l'aiuto.Argomento facoltativo nella macro cmake
risposta
CMake non controlla (AFAIK) il numero di variabili passate a una macro, quindi è possibile procedere e dichiararlo come qualsiasi altra macro.
C'è anche una variabile ${ARGN}
che si espande in un elenco di tutte le variabili "rimanenti" passate a una macro, che può essere utile.
Aggiornamento Come indicato nel Sam s' comment, CMake ora non riesce a meno che tutti gli argomenti previsti (nome) sono dati quando si chiama una macro o funzione.
Questo accade per impostazione predefinita se l'argomento non è specificato poiché CMake non controlla il numero di parametri richiesti per una macro.
Eventuali argomenti denominati nella definizione macro sono necessari per i chiamanti. Tuttavia, la macro può ancora accettare argomenti facoltativi purché non vengano esplicitamente denominati nella definizione di macro.
Cioè, i chiamanti sono autorizzati a passare argomenti extra (che non sono stati nominati nella lista degli argomenti della macro). La tua macro può verificare l'esistenza di tali argomenti extra controllando la variabile ${ARGN}
.
Attenzione: ARGN
non è una variabile "normale" cmake. Per usarlo con il comando list()
, è necessario copiarlo in una variabile normale prima:
macro (mymacro required_arg1 required_arg2)
# Cannot use ARGN directly with list() command,
# so copy it to a variable first.
set (extra_macro_args ${ARGN})
# Did we get any optional args?
list(LENGTH extra_macro_args num_extra_args)
if (${num_extra_args} GREATER 0)
list(GET extra_macro_args 0 optional_arg)
message ("Got an optional arg: ${optional_arg}")
endif()
endmacro (mymacro)
Ora CMake viene visualizzata per controllare se sono passati troppo pochi variabile. Questa risposta ora sembra essere sbagliata, o almeno è sul mio cmake 2.8.8 – Sam
La tua macro può ancora avere "argomenti" opzionali purché non siano nominati nella definizione della macro. Cioè, i chiamanti sono autorizzati a passare argomenti extra che non sono stati nominati nella lista degli argomenti della macro. La tua macro può controllare questi argomenti extra usando '$ {ARGN}'. Attenzione: ARGN non è una variabile cmake "normale". Per usarlo con il comando list(), devi prima copiarlo in una variabile normale: 'set (extra_macro_args $ {ARGN})'. Quindi puoi fare cose come 'lista (LENGTH extra_macro_args num_extra_args)' seguita da 'if ($ {num_extra_args} MAGGIORE 0) yadayadayada' –