2016-01-22 21 views
5

Non riesco a ottenere cmake per verificare se un preprocessore è stato definito o meno. Ad esempio:cmake: come verificare se il preprocessore è definito

cmake_minimum_required(VERSION 2.8.9) 
project (cmake-test) 
add_definitions(-DOS=LINUX) 

if(NOT <what condition goes here?>) 
    message(FATAL_ERROR "OS is not defined") 
endif() 

I seguenti test non funzionano:

if (NOT COMMAND OS) 
if (NOT DEFINED OS) 
if (NOT OS) 

posso farlo funzionare utilizzando set() e proprio test per un cmake variabili regolare e quindi la definizione della macro preprocessore. Ad esempio:

set(OS LINUX) 
if (OS) 
    add_definitions(-DOS=${OS}) 
else() 
    message(FATAL_ERROR "OS is not defined") 
endif() 

Nel caso in cui, ti stai chiedendo perché ho bisogno di testare se la variabile/preprocessore è nello stesso file , è perché nella realizzazione finale di questi verranno da un file esterno che è include ed in principale CMakeFile.txt Es:

include(project_defs.txt) 
if (OS) 
    .... 
+0

Cosa intendi con pre-processore? CMake non ne ha uno ... – usr1234567

+0

CMake definisce automaticamente diverse variabili, che descrivono il sistema.Quindi puoi controllare (in comando 'if') queste variabili per includere il codice dipendente dal SO. Vedi [Variabili che forniscono informazioni] (https://cmake.org/cmake/help/v3.0/manual/cmake-variables.7.html#variables-that-provide-information). – Tsyvarev

+0

@ usr1234567 di pre-processore intendevo una variabile definita dall'opzione '-D' a' gcc' (come '# define'). –

risposta

1

Normalmente, tutte le definizioni che sono passati al compilatore sono controllati da CMake. Cioè, si crea una variabile CMake con

option(SOMEFEATURE "Feature description" ON) 

o

set(OS "" CACHE STRING "Select your OS") 

utente li imposta tramite cmake -D OS=DOS o nella GUI CMake. Quindi è possibile utilizzare l'operatore if() a add_definitions() condizionale nella riga di comando del compilatore.

UPDATE:

Se davvero si vuole accedere bandiere del preprocessore, c'è una proprietà COMPILE_DEFINITIONS bersaglio. Puoi accedervi in ​​questo modo:

get_target_property(OUTVAR target COMPILE_DEFINITIONS) 
+1

Quindi il secondo approccio che ho citato è probabilmente l'unico modo per farlo. Sarebbe stato bello se 'cmake' permettesse di testare le cose impostate tramite' add_definitions'. –

+0

@MandeepSandhu Vedi risposta aggiornata. – arrowd

+0

Grazie per l'aggiornamento. Ho cercato in 'COMPILE_DEFINITIONS' come i documenti per' add_definitions() 'lo menzionano. Tuttavia non sono stato in grado di recuperare le definizioni specificate (ho provato il tuo suggerimento di usare 'get_target_property' ma ho ottenuto' NOTFOUND'). Sto usando 'cmake 2.8.12.2' –

1

Questo per completare la risposta con arrowd.

Ho anche provato l'opzione COMPILE_DEFINITIONS come menzionato sopra con arrowd senza successo.

In seguito la documentazione di CMake, almeno per la versione 3.x, si scopre che quando si chiama add_definitions() in CMake, aggiunge le definizioni per la proprietà COMPILE_DEFINITIONS directory.

Pertanto, diciamo che si sta definendo il seguente secondo il vostro codice:

add_definitions(-DOS=LINUX) 

per recuperare la stringa con le definizioni aggiunte nella variabile "MYDEFS" è possibile utilizzare le seguenti linee in CMake:

get_directory_property(MYDEFS COMPILE_DEFINITIONS) 
MESSAGE(STATUS "Compile defs contain: " ${MYDEFS}) 

Quindi è possibile verificare se in ${MYDEFS} esiste la definizione che si sta cercando. Per esempio

if(MYDEFS MATCHES "^OS=" OR MYDEFS MATCHES ";OS=") 
    MESSAGE(STATUS "OS defined") 
else() 
    # You can define your OS here if desired 
endif() 
Problemi correlati