[CMake] Stray backslash appearing when CMAKE_CXX_FLAGS_RELEASE used in custom command

Eric Doenges doenges at mvtec.com
Mon Nov 4 02:43:37 EST 2019


Am 01.11.19 um 17:24 schrieb Stephen Morris:
> On 1 November at 10:02, Stephen Morris wrote:
>
>> My approach is basically to set up a custom command thus:
>> set(CXX_FLAGS ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG})   .. or whatever, depending on the current configuration..
>> get_target_property(compile_options, mytarget, COMPILE_OPTIONS) add_custom_command(OUTPUT myheader.h.gch
>>                                           COMMAND ${CMAKE_CXX_COMPILER} ${CXX_FLAGS} ${compile_options} -fPIC -std=gnu++17 -c myheader.h -o myheader.h.gch
>>                                            DEPENDS myheader.h) add_custom_target(BuildMyPCH
>>                                      DEPENDS myheader.h.gch) add_dependencies(mytarget, BuildMyPCH)
> My earlier question still stands, but at the time I wrote it I had only tested it for Debug builds where ${CMAKE_CXX_FLAGS_DEBUG} consisted of a single item, '-g'.
>
> I've since tried doing the same thing for a Release build, and this failed because ${CMAKE_CXX_FLAGS_RELEASE} has two items, '-O3 -DNDEBUG'. When the custom command is executed, this somehow becomes "-O3\ -DNDEBUG" on the command line, and the presence of the stray backslash causes the compilation to fail with the message,
>
> "cc1plus: error: argument to '-O' should be a non-negative integer. 'g', 's' or 'fast'"
>
> So why isn't the cmake variable placed properly onto the command line, and what can I do to prevent this behaviour?

Welcome to the wonderful world of lists and their interaction with 
quoting in CMake ! Since space is used as a list item separator outside 
of double quoted strings, CMake is escaping the space within CXX_FLAGS 
to keep it as a single element within the list of arguments passed to 
add_custom_command. To avoid this, you need to turn CXX_FLAGS into a 
list prior to using it in add_custom_command:

string(REGEX REPLACE " " ";" CXX_FLAGS "${CXX_FLAGS}")

Of course, this will not work if you want to pass a double quoted string 
as an actual command line argument ...

-- 

*Dr. Eric Dönges*
Senior Software Engineer

MVTec Software GmbH | Arnulfstr. 205 | 80634 Munich | Germany
doenges at mvtec.com <mailto:mustermann at mvtec.com> | Tel: +49 89 457 695-0 
| www.mvtec.com <http://www.mvtec.com>

Find our privacy policy here <https://www.mvtec.com/imprint>.

Sign up <https://www.mvtec.com/newsletter> for our MVTec Newsletter!

Geschäftsführer: Dr. Wolfgang Eckstein, Dr. Olaf Munkelt
Amtsgericht München HRB 114695

MVTec Software GmbH Logo
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://cmake.org/pipermail/cmake/attachments/20191104/fd75f78e/attachment.html>


More information about the CMake mailing list