summaryrefslogtreecommitdiffstats
path: root/bootstrap
diff options
context:
space:
mode:
authorStephen Kelly <steveire@gmail.com>2014-12-31 11:23:50 (GMT)
committerStephen Kelly <steveire@gmail.com>2015-01-11 16:00:55 (GMT)
commit4c69ec6f121f303113d2f8a158d2e53b7d93d6b4 (patch)
tree20103933f0769170eb24dcb6bae54798b3471976 /bootstrap
parente5b914209742a70c72c6cf8a8e6e1e005d8830f2 (diff)
downloadCMake-4c69ec6f121f303113d2f8a158d2e53b7d93d6b4.zip
CMake-4c69ec6f121f303113d2f8a158d2e53b7d93d6b4.tar.gz
CMake-4c69ec6f121f303113d2f8a158d2e53b7d93d6b4.tar.bz2
SolarisStudio: Use alternative standard library to build CMake.
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.
Diffstat (limited to 'bootstrap')
-rwxr-xr-xbootstrap29
1 files changed, 29 insertions, 0 deletions
diff --git a/bootstrap b/bootstrap
index fe051e1..3574973 100755
--- a/bootstrap
+++ b/bootstrap
@@ -1154,6 +1154,35 @@ if [ "x${cmake_cxx_compiler_is_gnu}" != "x1" ]; then
cmake_test_flags=
fi
+
+if [ "x${cmake_cxx_compiler_is_gnu}" != "x1" ]; then
+ # Are we SolarisStudio?
+
+ TMPFILE=`cmake_tmp_file`
+ echo '
+ #if defined(__SUNPRO_CC)
+ #include <iostream>
+ int main() { std::cout << "This is SolarisStudio" << std::endl; return 0;}
+ #endif
+ ' > ${TMPFILE}.cxx
+ cmake_cxx_compiler_is_solarisstudio=0
+ if cmake_try_run "${cmake_cxx_compiler}" \
+ "${cmake_cxx_flags} " "${TMPFILE}.cxx" >> cmake_bootstrap.log 2>&1; then
+ cmake_cxx_compiler_is_solarisstudio=1
+ fi
+ if [ "x${cmake_cxx_compiler_is_solarisstudio}" = "x1" ]; then
+ echo "${cmake_cxx_compiler} is SolarisStudio compiler"
+ else
+ echo "${cmake_cxx_compiler} is not SolarisStudio compiler"
+ fi
+ rm -f "${TMPFILE}.cxx"
+
+ if [ "x${cmake_cxx_compiler_is_solarisstudio}" = "x1" ]; then
+ cmake_cxx_flags="${cmake_cxx_flags} -library=stlport4"
+ fi
+fi
+
+
# Test for kwsys features
KWSYS_NAME_IS_KWSYS=0
KWSYS_BUILD_SHARED=0