2009-08-28 17 views

risposta

12

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.

+5

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

+2

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' –

0

Questo accade per impostazione predefinita se l'argomento non è specificato poiché CMake non controlla il numero di parametri richiesti per una macro.

29

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) 
Problemi correlati