Skip to content
  • Stephen Kelly's avatar
    SolarisStudio: Use alternative standard library to build CMake. · 4c69ec6f
    Stephen Kelly authored
    SolarisStudio ships a very old RogueWave standard library
    implementation (libCstd) and uses it by default for backward compatibility.
    The macros defined when building the system libCstd need to be the same as
    the macros defined when using it for binary compatibility reasons etc.  The
    SolarisStudio compiler driver adds macros such as _RWSTD_NO_MEMBER_TEMPLATES and
    _RWSTD_NO_CLASS_PARTIAL_SPEC etc. These macros disable certain APIs in the
    standard library headers.
    
    Although the compiler supports the features 'member templates' and 'partial
    template specialization', the standard library does not provide APIs which
    rely on those features.  This means that std::vector::insert in libCStd does
    not accept a pair of iterators from a different type of container, because
    that requires member templates, and reverse_iterator<const T> can not
    be constructed from a reverse_iterator<T> because that requires partial
    specialization (or at least the _RWSTD_NO_CLASS_PARTIAL_SPEC define) and
    member templates.
    
    This causes many problems while building CMake using SolarisStudio, which
    have not been well understood until now.  The problems are usually
    attributed to compiler limitations, while actually the problem is in
    the standard library, as in commit v3.0.0-rc1~99^2~1 (Help: Document non-use
    of std::set::insert., 2014-01-24) and commit 107dcac3 (Fix compilation with
    the Oracle / Sun compiler (#15318), 2014-12-12).
    
    SolarisStudio 12.3 and earlier also ships a version of stlport which may be
    used instead of libCstd by specifying -library=stlport4
    
     https://docs.oracle.com/cd/E18659_01/html/821-1383/bkakg.html
    
    SolarisStudio 12.4 ships a version of libstdc++ from GCC 4.8.2 which may be
    used by specifying -std=c++03 or -std=c++11 etc
    
     http://docs.oracle.com/cd/E37069_01/html/E37075/bkamw.html#OSSCPgnaof
    
    Use these more-capable standard library implementations when building cmake.
    This will allow more use of 'normal' C++ (such as std::vector::insert), and cause
    fewer surprises resulting from dashboards using SolarisStudio.
    
    Because cmake is not a library linked against by 3rd parties and does not have
    external dependencies, issues related to mixing code using libCStd and libstdc++
    do not apply.
    4c69ec6f