Bug #72352 Provide option to link against libCstd instead of stlport4 on Solaris 10+

Submitted: 15 Apr 2014 17:29 Modified: 18 Jun 2014 12:45
Reporter: Valeriy Kravchuk Email Updates:
Status: Closed Impact on me:
None 
Category:MySQL Server: Compiling Severity:S3 (Non-critical)
Version:5.6.14+, 5.6.18, 5.7.4 OS:Solaris
Assigned to: Tor Didriksen CPU Architecture:Any
Tags: cmake, libCstd, MySQL, regression, stlport4

[15 Apr 2014 17:29] Valeriy Kravchuk
Description:
It seems MySQL 5.6 does not provide any easy way to link against libCstd even for mysql client. This is what I see in cmake/build_configurations/compiler_options.cmake:

  # Solaris flags
  IF(CMAKE_SYSTEM_NAME MATCHES "SunOS")
    IF(CMAKE_SYSTEM_VERSION VERSION_GREATER "5.9")
      # Link mysqld with mtmalloc on Solaris 10 and later
      SET(WITH_MYSQLD_LDFLAGS "-lmtmalloc" CACHE STRING "")
    ENDIF()
    IF(CMAKE_C_COMPILER_ID MATCHES "SunPro")
      IF(CMAKE_SYSTEM_PROCESSOR MATCHES "i386")
        SET(COMMON_C_FLAGS                   "-g -mt -fsimple=1 -ftrap=%none -nofstore -xbuiltin=%all -xlibmil -xlibmopt -xtarget=generic")
        SET(COMMON_CXX_FLAGS                 "-g0 -mt -fsimple=1 -ftrap=%none -nofstore -xbuiltin=%all -xlibmil -xlibmopt -xtarget=generic -library=stlport4")
        # We have to specify "-xO1" for DEBUG flags here,
        # see http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6879978
        SET(CMAKE_C_FLAGS_DEBUG              "-xO1 ${COMMON_C_FLAGS}")
        SET(CMAKE_CXX_FLAGS_DEBUG            "-xO1 ${COMMON_CXX_FLAGS}")
        IF(32BIT)
          SET(CMAKE_C_FLAGS_RELWITHDEBINFO   "-xO2 ${COMMON_C_FLAGS}")
          SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-xO2 ${COMMON_CXX_FLAGS}")
        ELSEIF(64BIT)
          SET(CMAKE_C_FLAGS_RELWITHDEBINFO   "-xO3 ${COMMON_C_FLAGS}")
          SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-xO3 ${COMMON_CXX_FLAGS}")
        ENDIF()
      ELSE()
        # Assume !x86 is SPARC
        SET(COMMON_C_FLAGS                 "-g -Xa -xstrconst -mt")
        SET(COMMON_CXX_FLAGS               "-g0 -mt -library=stlport4")
        IF(32BIT)
          SET(COMMON_C_FLAGS               "${COMMON_C_FLAGS} -xarch=sparc")
          SET(COMMON_CXX_FLAGS             "${COMMON_CXX_FLAGS} -xarch=sparc")
        ENDIF()
        SET(CMAKE_C_FLAGS_DEBUG            "${COMMON_C_FLAGS}")
        SET(CMAKE_CXX_FLAGS_DEBUG          "${COMMON_CXX_FLAGS}")
        SET(CMAKE_C_FLAGS_RELWITHDEBINFO   "-xO3 ${COMMON_C_FLAGS}")
        SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-xO3 ${COMMON_CXX_FLAGS}")
      ENDIF()
    ENDIF()
  ENDIF()

stlport4 seems to be "hardcoded" in some other places in the source code as well:

openxs@ao756:~/bzr/mysql-5.6$ grep -rn stlport4 *
cmake/readline.cmake:103: # /opt/studio12u2/lib/stlport4/v9/libstlport.so.1
cmake/build_configurations/compiler_options.cmake:98: SET(COMMON_CXX_FLAGS "-g0 -mt -fsimple=1 -ftrap=%none -nofstore -xbuiltin=%all -xlibmil -xlibmopt -xtarget=generic -library=stlport4")
cmake/build_configurations/compiler_options.cmake:113: SET(COMMON_CXX_FLAGS "-g0 -mt -library=stlport4")
configure.cmake:85: "${CMAKE_CXX_FLAGS} -library=stlport4")
configure.cmake:95: SET(STLPORT_SUFFIX "lib/stlport4")
configure.cmake:97: SET(STLPORT_SUFFIX "lib/stlport4/v9")
configure.cmake:100: SET(STLPORT_SUFFIX "lib/stlport4/amd64")
mysql-test/lib/My/SafeProcess/CMakeLists.txt:29: STRING(REPLACE " -library=stlport4" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
mysql-test/lib/My/SafeProcess/CMakeLists.txt:30: STRING(REPLACE " -library=stlport4" "" CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG})
mysql-test/lib/My/SafeProcess/CMakeLists.txt:31: STRING(REPLACE " -library=stlport4" "" CMAKE_CXX_FLAGS_RELWITHDEBINFO ${CMAKE_CXX_FLAGS_RELWITHDEBINFO})
openxs@ao756:~/bzr/mysql-5.6$

Users may have some reasons to want to link at least mysql client with libCstd. I do not see stlport4 hardcoded in MySQL 5.5, for example. 

Please, provide some easy way to configure cmake to do this kind of a build.

How to repeat:
Try to build only mysql client from MySQL 5.6.x linked with libCstd instead of stlport4 on Solaris.

Suggested fix:
Either provide a way to select libCstd via cmake settings/options or document in the manual (http://dev.mysql.com/doc/refman/5.6/en/source-configuration-options.html maybe) why all/some binaries from MySQL 5.6 can not be built with libCstd on Solaris and how to built this way those binaries that can work with this library.
[16 Apr 2014 7:18] MySQL Verification Team
Hello Valeriy,

Thank you for the report.
Verified as described.

Thanks,
Umesh
[18 Jun 2014 12:45] Paul DuBois
Noted in 5.6.20, 5.7.5 changelogs.

A new CMake option, SUNPRO_CXX_LIBRARY, enables linking against
libCstd instead of stlport4 on Solaris 10 or later. This works only
for client code because the server depends on C++98. Example usage:

cmake -DWITHOUT_SERVER=1 -DSUNPRO_CXX_LIBRARY=Cstd
[7 Aug 2014 5:13] Laurynas Biveinis
$ bzr log -n0 -r 5960
------------------------------------------------------------
revno: 5960
committer: Tor Didriksen <tor.didriksen@oracle.com>
branch nick: 5.6-cmake
timestamp: Fri 2014-05-23 12:50:24 +0200
message:
  Bug#18605389 PROVIDE OPTION TO LINK AGAINST LIBCSTD INSTEAD OF STLPORT4 ON SOLARIS 10+
  Bug#72352    Provide option to link against libCstd instead of stlport4 on Solaris 10+
  
  Patch for 5.6
  This patch enables the use of Cstd when building with SunStudio.
  It only works for client code, as the server depends on C++98
  Usage:
  cmake -DWITHOUT_SERVER=1 -DSUNPRO_CXX_LIBRARY=Cstd
  
  Also backport:
  Bug#14367046: PROBLEM BUILDING CLIENT ONLY

Portions of this website are copyright © 2001, 2002 The PHP Group

Page generated in 0.057 sec. using MySQL 8.4.7-u6-cloud

Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the respective copyright holders.
It is not reviewed in advance by Oracle and does not necessarily represent the opinion of Oracle or any other party.