Discussion:
[cmake-developers] [CMake] libc++ usage in CMake with Clang?
Robert Dailey
2018-08-21 13:41:06 UTC
Permalink
I'll explain a bit why I'm asking. I noticed that for code bases that
work on Android plus other UNIX platforms, they unconditionally
specify `-stdlib=libc++`, however this doesn't work on Ubuntu by
default, which uses gnu stl + gcc/clang. So you get compiler errors.
There's no way for me to "search" a platform to see if it is eligible
for the libc++ flag, I simply have to either disable it completely or
conditionally include it based on target platform and/or toolchain.
None of these really address the root cause.

I'm not even really sure what a find module for this would do... but
typically find modules don't provide compiler flags, so I'm not sure
if that's the right tool for the job. Would love to hear from the
developers on this, so I've cross posted to the dev mailing list in
this reply.
I'm also interested in the answer to Robert's question. I've been using
set( CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} -stdlib=libc++")
but it seems like there should be a more elegant approach.
-tk
-----Original Message-----
Sent: Monday, August 20, 2018 11:48 AM
Subject: [CMake] libc++ usage in CMake with Clang?
Is the only way to use libc++ to muck with compile flags? Or is there a proper find module for this or something? Is there a more CMake-esque way of specifying the STL library to use with the toolchain?
--
Powered by www.kitware.com
Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ
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
https://cmake.org/mailman/listinfo/cmake
--
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-developers
Craig Scott
2018-08-21 20:47:56 UTC
Permalink
Post by Robert Dailey
I'll explain a bit why I'm asking. I noticed that for code bases that
work on Android plus other UNIX platforms, they unconditionally
specify `-stdlib=libc++`, however this doesn't work on Ubuntu by
default, which uses gnu stl + gcc/clang. So you get compiler errors.
There's no way for me to "search" a platform to see if it is eligible
for the libc++ flag, I simply have to either disable it completely or
conditionally include it based on target platform and/or toolchain.
None of these really address the root cause.
I'm not even really sure what a find module for this would do... but
typically find modules don't provide compiler flags, so I'm not sure
if that's the right tool for the job. Would love to hear from the
developers on this, so I've cross posted to the dev mailing list in
this reply.
Excuse the brevity, but it sounds like you might be looking for the
CXX_EXTENSIONS target property (sorry if I've misunderstood your problem,
let me know why it isn't appropriate if so). See the following article for
a more complete overview of this and related properties:

https://crascit.com/2015/03/28/enabling-cxx11-in-cmake/
Post by Robert Dailey
I'm also interested in the answer to Robert's question. I've been using
set( CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} -stdlib=libc++")
but it seems like there should be a more elegant approach.
-tk
-----Original Message-----
Sent: Monday, August 20, 2018 11:48 AM
Subject: [CMake] libc++ usage in CMake with Clang?
Is the only way to use libc++ to muck with compile flags? Or is there a
proper find module for this or something? Is there a more CMake-esque way
of specifying the STL library to use with the toolchain?
--
Powered by www.kitware.com
http://www.cmake.org/Wiki/CMake_FAQ
Kitware offers various services to support the CMake community. For more
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
https://cmake.org/mailman/listinfo/cmake
--
Powered by www.kitware.com
http://www.cmake.org/Wiki/CMake_FAQ
Kitware offers various services to support the CMake community. For more
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
https://cmake.org/mailman/listinfo/cmake-developers
--
Craig Scott
Melbourne, Australia
https://crascit.com

New book released: Professional CMake: A Practical Guide
<https://crascit.com/professional-cmake/>
Robert Dailey
2018-08-21 21:18:19 UTC
Permalink
Post by Craig Scott
https://crascit.com/2015/03/28/enabling-cxx11-in-cmake/
Unfortunately that's not the same. Extensions manage C++ language
features and STL capabilities, but -stdlib is for selecting an STL
implementation, AFAIK. Such as GNU STL and LLVM STL (which is libc++
to clang).
--
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-developers
Craig Scott
2018-08-21 23:40:36 UTC
Permalink
Post by Craig Scott
Post by Craig Scott
Excuse the brevity, but it sounds like you might be looking for the
CXX_EXTENSIONS target property (sorry if I've misunderstood your problem,
let me know why it isn't appropriate if so). See the following article for
Post by Craig Scott
https://crascit.com/2015/03/28/enabling-cxx11-in-cmake/
Unfortunately that's not the same. Extensions manage C++ language
features and STL capabilities, but -stdlib is for selecting an STL
implementation, AFAIK. Such as GNU STL and LLVM STL (which is libc++
to clang).
Sorry, yes I misunderstood your problem. After a little digging, it seems
like you probably shouldn't be using the -stdlib option on Linux
<https://stackoverflow.com/a/50407611/1938798> anyway. FWIW, for Android,
the roadmap
<https://android.googlesource.com/platform/ndk/+/master/docs/Roadmap.md> is
converging on a single STL implementation too.

Regarding your earlier comment:

I'll explain a bit why I'm asking. I noticed that for code bases that
Post by Craig Scott
work on Android plus other UNIX platforms, they unconditionally
specify `-stdlib=libc++`, however this doesn't work on Ubuntu by
default, which uses gnu stl + gcc/clang. So you get compiler errors.
There's no way for me to "search" a platform to see if it is eligible
for the libc++ flag, I simply have to either disable it completely or
conditionally include it based on target platform and/or toolchain.
None of these really address the root cause.
If you are trying to control which STL to use for Android builds,
CMake variables like CMAKE_ANDROID_STL_TYPE are probably the more
appropriate way to do that rather than hard-coding compiler flags.
This would also mean that non-Android builds won't be affected since
they would simply ignore that variable (and target properties it may
affect) and should then pick up the right STL implementation
automatically.The Android-specific variable would ideally be set in a
toolchain file rather than in the project itself.
--
Craig Scott
Melbourne, Australia
https://crascit.com

New book released: Professional CMake: A Practical Guide
<https://crascit.com/professional-cmake/>
Ian Henriksen
2018-08-22 03:39:43 UTC
Permalink
Post by Craig Scott
Post by Craig Scott
Post by Craig Scott
Excuse the brevity, but it sounds like you might be looking for the
CXX_EXTENSIONS target property (sorry if I've misunderstood your problem,
let me know why it isn't appropriate if so). See the following article for
Post by Craig Scott
https://crascit.com/2015/03/28/enabling-cxx11-in-cmake/
Unfortunately that's not the same. Extensions manage C++ language
features and STL capabilities, but -stdlib is for selecting an STL
implementation, AFAIK. Such as GNU STL and LLVM STL (which is libc++
to clang).
Sorry, yes I misunderstood your problem. After a little digging, it seems
like you probably shouldn't be using the -stdlib option on Linux
<https://stackoverflow.com/a/50407611/1938798> anyway. FWIW, for Android,
the roadmap
<https://android.googlesource.com/platform/ndk/+/master/docs/Roadmap.md>
is converging on a single STL implementation too.
All that first link says is that -stdlib is a flag that is specific to
clang and that it shouldn't be used with gcc. You can use clang on Linux
with either libstdc++ or libc++. I often use libc++ on Linux by setting
CMAKE_CXX_FLAGS on the command line, though I'll admit that for me it's
usually just to check if problems that come up are OS dependent, compiler
dependent, or standard library dependent. You have to be careful since
libstdc++ and libc++ have incompatible ABIs, but it's a useful feature.
That said, I have no idea if specifying the standard library implementation
merits handling at the CMake level since only clang supports switching
anyway.

Just my two cents though.

Best,

Ian
Post by Craig Scott
I'll explain a bit why I'm asking. I noticed that for code bases that
Post by Craig Scott
work on Android plus other UNIX platforms, they unconditionally
specify `-stdlib=libc++`, however this doesn't work on Ubuntu by
default, which uses gnu stl + gcc/clang. So you get compiler errors.
There's no way for me to "search" a platform to see if it is eligible
for the libc++ flag, I simply have to either disable it completely or
conditionally include it based on target platform and/or toolchain.
None of these really address the root cause.
If you are trying to control which STL to use for Android builds, CMake variables like CMAKE_ANDROID_STL_TYPE are probably the more appropriate way to do that rather than hard-coding compiler flags. This would also mean that non-Android builds won't be affected since they would simply ignore that variable (and target properties it may affect) and should then pick up the right STL implementation automatically.The Android-specific variable would ideally be set in a toolchain file rather than in the project itself.
--
Craig Scott
Melbourne, Australia
https://crascit.com
New book released: Professional CMake: A Practical Guide
<https://crascit.com/professional-cmake/>
--
Powered by www.kitware.com
http://www.cmake.org/Wiki/CMake_FAQ
Kitware offers various services to support the CMake community. For more
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
https://cmake.org/mailman/listinfo/cmake
Craig Scott
2018-08-22 09:05:53 UTC
Permalink
On Wed, Aug 22, 2018 at 1:39 PM, Ian Henriksen <
Post by Ian Henriksen
Post by Craig Scott
Post by Craig Scott
Post by Craig Scott
Excuse the brevity, but it sounds like you might be looking for the
CXX_EXTENSIONS target property (sorry if I've misunderstood your problem,
let me know why it isn't appropriate if so). See the following article for
Post by Craig Scott
https://crascit.com/2015/03/28/enabling-cxx11-in-cmake/
Unfortunately that's not the same. Extensions manage C++ language
features and STL capabilities, but -stdlib is for selecting an STL
implementation, AFAIK. Such as GNU STL and LLVM STL (which is libc++
to clang).
Sorry, yes I misunderstood your problem. After a little digging, it seems
like you probably shouldn't be using the -stdlib option on Linux
<https://stackoverflow.com/a/50407611/1938798> anyway. FWIW, for
Android, the roadmap
<https://android.googlesource.com/platform/ndk/+/master/docs/Roadmap.md>
is converging on a single STL implementation too.
All that first link says is that -stdlib is a flag that is specific to
clang and that it shouldn't be used with gcc. You can use clang on Linux
with either libstdc++ or libc++. I often use libc++ on Linux by setting
CMAKE_CXX_FLAGS on the command line, though I'll admit that for me it's
usually just to check if problems that come up are OS dependent, compiler
dependent, or standard library dependent. You have to be careful since
libstdc++ and libc++ have incompatible ABIs, but it's a useful feature.
That said, I have no idea if specifying the standard library implementation
merits handling at the CMake level since only clang supports switching
anyway.
Good clarification, thanks. I was only thinking GCC on Linux and wasn't
considering clang (which was a bit dumb on my part - blame the lack of
coffee early in the morning ;) ).

Getting back to Robert's original query, the only part of the CMake code
base that I can see attempting to account for a -stdlib option is for
detection of gcc include paths, and this is only for Eclipse and CodeBlocks
generators (according to the comments in
Modules/CMakeExtraGeneratorDetermineCompilerMacrosAndIncludeDirs.cmake). It
doesn't seem to be related to providing any support for manipulating it in
a project. The only other place -stdlib seems to be mentioned is in the
setup of the macOS release build of CMake itself, which isn't relevant to
the discussion here.

If CMake were to offer direct support for -stdlib, it sounds like it would
be a clang-specific feature, so a clang-specific target property and/or
variable may be a way forward, analogous to the way it is done for Android.
Alternatively, maybe it could be done with generator expressions, but it
would be a bit verbose and harder to ensure the same -stdlib was used
consistently throughout if many targets were involved. But maybe just a
fairly simple check is good enough here, something like this (using
directory properties instead of variables):

if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND NOT ANDROID)
add_compile_options(-stdlib=libc++)
# Presumably need the above for linking too, maybe other options
missing as well
add_link_options(-stdlib=libc++) # New command on CMake master, not
in 3.12 release
endif()

The linking comments above are in response to discussions in a recent issue
<https://gitlab.kitware.com/cmake/cmake/issues/18275> also related to the
-stdlib option. One down side of the above is no transitive dependency
details, something that a target property could achieve. I'll pause here
and see what others think.
Post by Ian Henriksen
Just my two cents though.
Best,
Ian
Post by Craig Scott
I'll explain a bit why I'm asking. I noticed that for code bases that
Post by Craig Scott
work on Android plus other UNIX platforms, they unconditionally
specify `-stdlib=libc++`, however this doesn't work on Ubuntu by
default, which uses gnu stl + gcc/clang. So you get compiler errors.
There's no way for me to "search" a platform to see if it is eligible
for the libc++ flag, I simply have to either disable it completely or
conditionally include it based on target platform and/or toolchain.
None of these really address the root cause.
If you are trying to control which STL to use for Android builds, CMake variables like CMAKE_ANDROID_STL_TYPE are probably the more appropriate way to do that rather than hard-coding compiler flags. This would also mean that non-Android builds won't be affected since they would simply ignore that variable (and target properties it may affect) and should then pick up the right STL implementation automatically.The Android-specific variable would ideally be set in a toolchain file rather than in the project itself.
--
Craig Scott
Melbourne, Australia
https://crascit.com
New book released: Professional CMake: A Practical Guide
<https://crascit.com/professional-cmake/>
--
Powered by www.kitware.com
http://www.cmake.org/Wiki/CMake_FAQ
Kitware offers various services to support the CMake community. For more
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
https://cmake.org/mailman/listinfo/cmake
--
Craig Scott
Melbourne, Australia
https://crascit.com

New book released: Professional CMake: A Practical Guide
<https://crascit.com/professional-cmake/>
Loading...