cmake list append for compiler flags yields bogus results?

cmake

Solution

In this case, you would indeed normally use the `set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -new -flags -here")` technique.

You're right in that in most other contexts CMake can "translate" a semi-colon separated list into something meaningful for the compiler (e.g. the list of source files in an executable), but in this case, CMake takes the flags as a single, complete string to pass to the compiler/linker.

You could if you really wanted keep the list of flags as a CMake list, but then before exiting the CMakeLists.txt, you could yourself "translate" the list into a single string value of `CMAKE_C_FLAGS`, but it's unusual to see this.

Problem

I need to add various flags to my C and C++ compile lines in my CMake files (CMake 2.8.10.2). I see some people use `add_definitions` but from what I can see that is intended for preprocessor flags (`-D`). I have some flags that I don't want passed to the preprocessor. So I've been trying to modify `CMAKE_C_FLAGS` and `CMAKE_CXX_FLAGS`. I see that some people were using something like: ``` set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -new -flags -here") ``` but then I read in the cmake docs that this is less efficient, and the right way to do it is to use `list(APPEND ...)`, like this: ``` list(APPEND CMAKE_C_FLAGS -new -flags -here) ``` However, when I do this my compile line contains the flags separated by semicolons and is a syntax error. I read that this is now lists are stored internally, but I figured this would be taken care of by cmake when I used the variable. This seems so basic; am I doing something wrong? I mean, what the heck good are these lists if they can't be used unless you happen to want a semicolon-separated list of values (and who wants that, other than I guess Windows %PATH% settings or something)? Should I be using the quoted version even though the docs suggest it's less efficient/appropriate?

Original source