[cmake-developers] CXX_STANDARD and linking

Stephen Kelly steveire at gmail.com
Sun Oct 4 10:47:40 EDT 2015


Brad King wrote:

> On 09/28/2015 03:20 PM, Brad King wrote:
>> for now we should look at turning off all language standard and
>> compile feature support for SolarisStudio when not hosted on Linux.
> 
> Done here:
> 
>  Features: Disable support for Oracle SolarisStudio on non-Linux
>  https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=61bc0f73
> 
>  Tests: Suppress WriteCompilerDetectionHeader failure on SunPro
>  https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=5fdf7594
> 
> I also made a fix for Linux:
> 
>  Features: Fix C++98 flags on Oracle SolarisStudio 12.4 on Linux
>  https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=c824b23d
> 
> Steve, please review these changes.

Thanks, I've put some thought into this now.

The existing CMake feature deals with compilation, but does not deal with 
linking. 

We pass -std=foo when compiling but not when linking. In the case of GNU and 
Clang, this works because the standard library binary is the same regardless 
of that flag. I did some experiements, and 

* passing no -std flag
* passing -std=c++11
* passing -std=gnu++11

each resulted in invoking collect2 or ld with identical parameters for GNU 
and Clang in respective situations.

For Solaris, the situation is different. My understanding of standard 
libraries there is summarized here:

 https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=4c69ec6f

Namely, we can pass -std=c++03 or -std=c++11 in the the compile step to use 
specific dialect features for compilation, but to specify the 
appropriate/corresponding standard library (the GNU one) we also need to 
specify one of those flags at link time.

Currently cmake has no feature for specifying flags to use at link time for 
a particular standard library. This missing feature is also apparent when 
noting that we can specify a particular standard library to Clang by using 
the -stdlib=libc++ or -stdlib=libstdc++ flags. Using GNU we can specify the 
flag -nodefaultlibs to avoid automatic linking with libstdc++ and then 
specify additional flags to compile and link to libc++ if we wish.

This is the same missing feature whether talking about SolarisStudio, GNU, 
or Clang.

I think the current state is that CMake-compile-features can work with 
SolarisStudio to specify compile flags, but CMake currently has no feature 
for inferring link flags as a result of that. That is, the responsibility 
for specifying the link flags remains with the user for now. 

So, is this thread really about a bug, or is it a feature request? 

Perhaps those commits should be reverted. I see no reason for SolarisStudio 
on linux to behave any differently than on solaris, so the commit relating 
to that is probably not appropriate. When testing the compiler on linux, it 
is possible that I was operating as if the link flags were user 
responsibility and had configured my environment accordingly (though I don't 
remember).

I wrote here some ideas of a design for specifying the standard library to 
use: 

 http://thread.gmane.org/gmane.comp.programming.tools.cmake.devel/13284/focus=13296

Perhaps, rather than passing CMAKE_CXX11_EXTENSION_COMPILE_OPTION to the 
linker, we should work more on a design like the above way to specify a 
standard library. 

The compile features can imply a default and a set of allowed alternatives 
(for example, compiling with cxx_static_assert implies the use of stdlibc++ 
or libc++ with Clang by default but there is a way to use the other 
instead).  The COMPATIBLE_INTERFACE features may also be used to ensure that 
targets which link together all use the same standard library.

Thanks,

Steve.




More information about the cmake-developers mailing list