2015-04-27 14 views
10

Uso CMake per un progetto disponibile in due versioni, una delle quali richiede -lglapi e l'altra no.Accodamento a CMAKE_C_FLAGS

Finora le linee che abbiamo usato sguardo come quello:

SET(CMAKE_C_FLAGS "-O3 -xSSE3 -restrict -lpthread -lX11 -ldrm") 
SET(CMAKE_CXX_FLAGS "-O3 -xSSE3 -restrict -lpthread -lX11 -ldrm") 

ho aggiunto un'istruzione if nel mio CMakeList.txt esattamente dopo quelle linee:

if(SINGLE_MODE) 
    SET(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} " -lglapi") 
    SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} " -lglapi") 
endif(SINGLE_MODE) 

La variabile SINGLE_MODE è definito un po ' su. Quando uso il comando di messaggio per visualizzare il contenuto delle variabili di bandiera appare bene:

-O3 -xSSE3 -restrict -lpthread -lX11 -ldrm -lglapi 

Ma quando inizio la compilazione Sono in esecuzione in un errore di compilazione. Usando la modalità dettagliata ho capito che nella chiamata del compilatore sembra che:

-O3 -xSSE3 -restrict -lpthread -lX11 -ldrm; -lglapi 

I.e. in qualche modo è stato aggiunto un punto e virgola prima di aggiungere il -lglapi alla lista.

Qualcuno ha riscontrato un problema simile e conosce un modo per risolvere questo problema? Ho cercato su Google un po 'di tempo e ho studiato il manuale di CMake, ma non sono riuscito a vedere cosa ho fatto di sbagliato qui.

Grazie, Tobias

+4

Hai provato 'SET (CMAKE_CXX_FLAGS" $ {CMAKE_CXX_FLAGS} -lglapi ")'? – jpo38

+0

@ jpo38 Dovresti dare una risposta e ottenere la tua meritata reputazione :) – Antonio

+0

@ jpo38, grazie. Questo ha fatto il trucco. Avrei dovuto pensarci io, ma dopo aver guardato qualcosa per troppo tempo, diventerai cieco per quello. – TobiSF

risposta

14

cercare di fare questo, invece:

if(SINGLE_MODE) 
    SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -lglapi") 
    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lglapi") 
endif(SINGLE_MODE) 

Poi, si è sicuri che si accoda -lglapi al ${CMAKE_CXX_FLAGS} stringa esistente. Altrimenti, sembra che si stia creando qualcosa come una lista di CMake.

+0

Questo è molto boilerplate. C'è una soluzione più breve? – nowox

+0

@nowox: non ne so nulla di – jpo38

+0

Oh :(Non so veramente CMake, ma non è possibile usare 'lista (APPEND'? – nowox

0

Dal CMake 3.4 fare:

string(APPEND CMAKE_CXX_FLAGS " -lglapi") 

questo molto utile quando si desidera impostare i flag solo per una lingua (C++ nell'esempio di cui sopra), ma se si desidera impostare le stesse bandiere per tutte le lingue , si può semplicemente fare:

add_compile_options(-lglapi) 

Entrambi i comandi cambiano le bandiere per l'intera directory, se si desidera impostare i flag per un solo obiettivo, fare:

target_compile_options(my_lib PUBLIC -lglapi) 

Le bandiere su un obiettivo possono essere PUBLIC, PRIVATE or INTERFACE, consentendo di inoltrare le bandiere da una destinazione all'altra.

Problemi correlati