Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Appending to CMAKE_C_FLAGS

Tags:

I'm using CMake for a project that comes in two versions, one of which requires -lglapi and the other does not.

So far the lines we used look like that:

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

I added an if statement in my CMakeList.txt exactly after those lines:

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

The SINGLE_MODE variable is defined a little up. When I use the message command to display the content of the flag variables it looks alright:

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

But when I start compiling I am running into a compile error. Using the verbose mode I realized that in the compiler call it looks like that:

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

I.e. somehow a semicolon got added before adding the -lglapi to the list.

Did anyone here encounter a similar issue and knows a way to fix this issue? I've googled quite a while and studied the CMake manual but couldn't see what I did wrong here.

Thanks, Tobias

like image 273
TobiSF Avatar asked Apr 27 '15 16:04

TobiSF


2 Answers

Try to do this instead:

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

Then, you are sure you append -lglapi to the existing ${CMAKE_CXX_FLAGS} string. Else, looks like something like a CMake list is being created.

like image 69
jpo38 Avatar answered Sep 18 '22 08:09

jpo38


Since CMake 3.4 you do:

string(APPEND CMAKE_CXX_FLAGS " -lglapi") 

This very handy when you want to set the flags only for one language (C++ in the example above), but if you want to set the same flags for all languages, you can simply do:

add_compile_options(-lglapi) 

Both commands change the flags for the whole directory, if you want to set the flags for only one target, do:

target_compile_options(my_lib PUBLIC -lglapi) 

Flags on a target can either be PUBLIC, PRIVATE or INTERFACE, allowing to transitively forward the flags from one target to the other.

like image 41
Benoit Blanchon Avatar answered Sep 21 '22 08:09

Benoit Blanchon