2011-12-19 12 views
20

Cerco di impostare una macro del preprocessore nella riga di comando di CMake. Ho provato:Come definire una macro del preprocessore C++ tramite la riga di comando con CMake?

set generator="Visual Studio 8 2005" 
set params=-D MY_MACRO=1 
cmake.exe -G %generator% %params% ..\some_project 

ma non è né definito quando compilo né posso trovare il nome MY_MACRO nei file generati da CMake a tutti, tranne che per CMakeCache.txt dove è presente sotto forma:

MY_MACRO:UNINITIALIZED=1 

Come posso farlo?

+1

Se hai risolto questo ora sarei interessato alla soluzione –

+1

@TimMeyer: No. Apparentemente è impossibile. – ybungalobill

+0

@ybungalobill: Non è possibile iniettare macro dalla riga di comando, è possibile modificare solo macro esistenti definite in CMakeLists.txt. Inoltre, * set params = -D MY_MACRO = 1 * dovrebbe essere * set params = -DMY_MACRO = 1 * – NeoH4x0r

risposta

6

Prova questo: -D CMAKE_CXX_FLAGS=/DMY_MACRO=1

+3

Funziona a metà. Sovrascrive il valore di 'CMAKE_CXX_FLAGS'. Ho provato '-D CMAKE_CXX_FLAGS ="/DMY_MACRO = 1 $ {CMAKE_CXX_FLAGS} "' ma '$ {CMAKE_CXX_FLAGS}' non viene ampliato. Qualcuno sa come risolvere questo? – ybungalobill

+0

Le stringhe tra virgolette doppie sulla riga di comando verranno espanse da bash. Dato che non hai una variabile d'ambiente chiamata CMAKE_CXX_FLAGS, bash la espande in "", prima che cmake lo veda. Usa invece le virgolette singole. – Tolli

+0

@Tolli che sembra non funzionare neanche. Impedisce a bash di espandere la variabile, ma cmake non lo espande neanche. Passa direttamente al compilatore il valore letterale '/ DMY_MACRO = 1 $ {CMAKE_CXX_FLAGS}' – pavon

-5

Se non avete una buona ragione per non , si dovrebbe usare ADD_DEFINITIONS(<name>=<value>[, ...]).

Basta aggiungere la seguente riga al CMakeLists.txt:

ADD_DEFINITIONS("MY_MACRO=1") 

CMake si prenderà cura della sintassi degli interruttori (sia esso -D<name>=<value> o /D<name>=<value>).

+13

La modifica di CMakeLists.txt non viene considerata come una soluzione da riga di comando. E sì, ho una buona ragione per non farlo. Devo automatizzare il processo di compilazione e io * non dovrei * cambiare le fonti. – ybungalobill

+0

Mi dispiace per lo spazio; Volevo aggiungere una soluzione a linea di comando, ma non era proprio quello che stavi cercando. Tuttavia, farlo dalla linea di comando renderà infelice la tua giornata, fidati di me. – hiobs

+0

A volte la riga di comando è più utile di un'applicazione GUI e talvolta no. Davvero non penso che tu possa dire che questo renderà la tua giornata infelice, in quanto dipende molto dalla situazione, dall'abilità dell'utente e dalle preferenze personali. – NeoH4x0r

14

Una buona alternativa sarebbe quella di definire un'opzione cmake:

OPTION(DEFINE_MACRO "Option description" ON) # Enabled by default 

Seguito da una condizione:

IF(DEFINE_MACRO) 
    ADD_DEFINITIONS(-DMACRO) 
ENDIF(DEFINE_MACRO) 

Poi si può trasformare l'opzione ON/OFF tramite linea di comando con CMake utilizzando il -D flag. Esempio:

cmake -DDEFINE_MACRO=OFF .. 

per assicurarsi che il compilatore sta ricevendo la giusta definizione, è possibile chiamare effettuare in modalità dettagliata e verificare la macro essere definita o no:

make VERBOSE=1 

Questa è una buona soluzione anche poiché make ricompilerà il codice quando si modificano le opzioni di cmake.

+2

Ciò richiede modifiche delle CMakeList, quindi non è una soluzione (-1). – ybungalobill

Problemi correlati