2015-04-27 15 views
10

Używam CMake dla projektu, który występuje w dwóch wersjach, z których jedna wymaga -lglapi, a druga nie.Dołączanie do CMAKE_C_FLAGS

Dotychczas linie użyliśmy wyglądać tak:

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

dodałem if moim CMakeList.txt dokładnie po tych liniach:

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

Zmienna SINGLE_MODE definiuje trochę w górę. Kiedy użyć polecenia komunikatów do wyświetlania zawartości zmiennych flag wygląda w porządku:

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

Ale kiedy zaczynam kompilacji używam w błąd kompilacji. Korzystając z trybu szczegółowego, zdałem sobie sprawę, że w wywołaniu kompilatora wygląda to następująco:

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

tj. w jakiś sposób dodano średnik przed dodaniem -lglapi do listy.

Czy ktoś napotkał podobny problem i zna sposób rozwiązania tego problemu? Mam google przez dłuższy czas i przestudiowałem podręcznik CMake, ale nie mogłem zobaczyć, co zrobiłem źle tutaj.

Dzięki, Tobias

+4

Czy próbowałeś 'SET (CMAKE_CXX_FLAGS" $ {CMAKE_CXX_FLAGS} -lglapi ")'? – jpo38

+0

@ jpo38 Powinieneś odpowiedzieć i uzyskać zasłużoną reputację :) – Antonio

+0

@ jpo38, dziękuję. To wystarczyło. Powinienem był o tym pomyśleć, ale po dłuższym spojrzeniu na coś, możesz na to zasłonić. – TobiSF

Odpowiedz

14

Spróbuj to zrobić w zamian:

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

Wtedy masz pewność, że dołączy do istniejącego -lglapi${CMAKE_CXX_FLAGS} ciąg. Inaczej wygląda jak lista CMake.

+0

To jest bardzo aktualny zestaw. Czy istnieje krótsze rozwiązanie? – nowox

+0

@nowox: Nie jestem nikim, kogo znam – jpo38

+0

Oh :(Tak naprawdę nie znam CMake'a, ale czy nie można użyć 'list (APPEND'? – nowox

0

Od CMake 3.4 zrobić:

string(APPEND CMAKE_CXX_FLAGS " -lglapi") 

to bardzo przydatne, gdy chcesz ustawić flagi tylko dla jednego języka (C++ w powyższym przykładzie), ale jeśli chcesz ustawić te same flagi dla wszystkich języków można po prostu zrobić:

add_compile_options(-lglapi) 

Oba polecenia zmienić flagi dla całego katalogu, jeśli chcesz ustawić flagi tylko dla jednego celu, wykonaj następujące czynności:

target_compile_options(my_lib PUBLIC -lglapi) 

Flagi na celu mogą być PUBLIC, PRIVATE or INTERFACE, co pozwala na przechodzenie do przodu flag z jednego celu na drugi.