Stray backslash appearing when CMAKE_CXX_FLAGS_RELEASE used in custom command

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Stray backslash appearing when CMAKE_CXX_FLAGS_RELEASE used in custom command

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?
 

--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
https://cmake.org/mailman/listinfo/cmake
Reply | Threaded
Open this post in threaded view
|

Re: Stray backslash appearing when CMAKE_CXX_FLAGS_RELEASE used in custom command

Eric Doenges
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
[hidden email] | Tel: +49 89 457 695-0 | www.mvtec.com

Find our privacy policy here.

 Sign up for our MVTec Newsletter!

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

 

MVTec Software GmbH Logo

--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
https://cmake.org/mailman/listinfo/cmake
Reply | Threaded
Open this post in threaded view
|

Re: Stray backslash appearing when CMAKE_CXX_FLAGS_RELEASE used in custom command

Stephen Morris
In reply to this post by Stephen Morris
On 4 November at 08:43, Eric Doenges wrote:
> 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 ...

Thank you! I'd never have worked this out for myself, though it makes perfect sense now you've explained it.

Thank you for answering my other question about -fPIC -std=gnu++17 as well.

--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
https://cmake.org/mailman/listinfo/cmake