summaryrefslogtreecommitdiff
path: root/libmysql/CMakeLists.txt
diff options
context:
space:
mode:
authorVladislav Vaintroub <wlad@montyprogram.com>2013-01-25 17:26:10 +0100
committerVladislav Vaintroub <wlad@montyprogram.com>2013-01-25 17:26:10 +0100
commit76400fcc258c1895dcaed4c4c3ebbdc340d7a62a (patch)
tree29339ac9e6f59385e0271fc584be7f984a2daf0b /libmysql/CMakeLists.txt
parent8864940583fa7e5717ccfbfcdc95d4ded8b40e1e (diff)
downloadmariadb-git-76400fcc258c1895dcaed4c4c3ebbdc340d7a62a.tar.gz
MDEV-3842, MDEV-3923 :
Miscellaneous workarounds for drop-in compatibility problems with Linux distributions, arounf versioning of the MySQL 5.5 client shared library. There seems to be 3 different ways major distributions handle versioning 1. Fedora (also Mageia, and likely other Redhat descendants) way old, 5.1 API functions are given version libmysqlclient_16 new API functions (client plugins, mysql_stmt_next ) are given version libmysqlclient_18 some extra functions beyond API are exported. some functions are renamed. 2.Debian Wheezy way all functions are given libmysqlclient_18 version 3. Ubuntu way (or MySQL/MariaDB download packages) no versioning UIp to this fix, MariaDB distributions did not have any versioning in the libraries, this rendered client library incompatible to distributions thus exchanging distribution's libmysqlclient.so.18.0.0 with MariaDB's did not work nicely (anywhere but on Ubuntu) THE FIX is to build libraries the same way as distributions do it - when building RPMs, use same version script as Fedora does, Make sure to export extra-symbols, the same as Fedora exports. - when building DEBs, use the same version script as Debian Wheezy - do not use version scripts otherwise Also, makes sure that extensions of MySQL APIs (asynchronous client functionality) is exported by the shared libraries.
Diffstat (limited to 'libmysql/CMakeLists.txt')
-rw-r--r--libmysql/CMakeLists.txt164
1 files changed, 159 insertions, 5 deletions
diff --git a/libmysql/CMakeLists.txt b/libmysql/CMakeLists.txt
index f67b3962c1a..72fee72af77 100644
--- a/libmysql/CMakeLists.txt
+++ b/libmysql/CMakeLists.txt
@@ -23,7 +23,7 @@ INCLUDE_DIRECTORIES(
${ZLIB_INCLUDE_DIR})
ADD_DEFINITIONS(${SSL_DEFINES})
-SET(CLIENT_API_FUNCTIONS
+SET(CLIENT_API_FUNCTIONS_5_1
get_tty_password
handle_options
load_defaults
@@ -58,6 +58,7 @@ mysql_field_count
mysql_field_seek
mysql_field_tell
mysql_free_result
+mysql_get_parameters
mysql_get_client_info
mysql_get_host_info
mysql_get_proto_info
@@ -129,12 +130,164 @@ mysql_server_init
mysql_server_end
mysql_set_character_set
mysql_get_character_set_info
-mysql_stmt_next_result
+)
-CACHE INTERNAL "Functions exported by client API"
+SET(CLIENT_API_FUNCTIONS_5_5
+mysql_stmt_next_result
+# Client plugins
+mysql_client_find_plugin
+mysql_client_register_plugin
+mysql_load_plugin
+mysql_load_plugin_v
+mysql_plugin_options
+# Async API
+mysql_autocommit_cont
+mysql_autocommit_start
+mysql_change_user_cont
+mysql_change_user_start
+mysql_close_cont
+mysql_close_slow_part_cont
+mysql_close_slow_part_start
+mysql_close_start
+mysql_commit_cont
+mysql_commit_start
+mysql_fetch_row_cont
+mysql_fetch_row_start
+mysql_free_result_cont
+mysql_free_result_start
+mysql_kill_cont
+mysql_kill_start
+mysql_list_dbs_cont
+mysql_list_dbs_start
+mysql_list_fields_cont
+mysql_list_fields_start
+mysql_list_processes_cont
+mysql_list_processes_start
+mysql_list_tables_cont
+mysql_list_tables_start
+mysql_next_result_cont
+mysql_next_result_start
+mysql_ping_cont
+mysql_ping_start
+mysql_query_cont
+mysql_query_start
+mysql_read_query_result_cont
+mysql_read_query_result_start
+mysql_real_connect_cont
+mysql_real_connect_start
+mysql_real_query_cont
+mysql_real_query_start
+mysql_refresh_cont
+mysql_refresh_start
+mysql_rollback_cont
+mysql_rollback_start
+mysql_select_db_cont
+mysql_select_db_start
+mysql_send_query_cont
+mysql_send_query_start
+mysql_set_character_set_cont
+mysql_set_character_set_start
+mysql_set_server_option_cont
+mysql_set_server_option_start
+mysql_shutdown_cont
+mysql_shutdown_start
+mysql_stat_cont
+mysql_stat_start
+mysql_stmt_close_cont
+mysql_stmt_close_start
+mysql_stmt_execute_cont
+mysql_stmt_execute_start
+mysql_stmt_fetch_cont
+mysql_stmt_fetch_start
+mysql_stmt_free_result_cont
+mysql_stmt_free_result_start
+mysql_stmt_next_result_cont
+mysql_stmt_next_result_start
+mysql_stmt_prepare_cont
+mysql_stmt_prepare_start
+mysql_stmt_reset_cont
+mysql_stmt_reset_start
+mysql_stmt_send_long_data_cont
+mysql_stmt_send_long_data_start
+mysql_stmt_store_result_cont
+mysql_stmt_store_result_start
+mysql_store_result_cont
+mysql_store_result_start
+)
+SET(CLIENT_API_FUNCTIONS
+ ${CLIENT_API_FUNCTIONS_5_1}
+ ${CLIENT_API_FUNCTIONS_5_5}
+ CACHE INTERNAL
+ "Client functions"
)
+IF(CMAKE_SYSTEM_NAME MATCHES "Linux")
+ # When building RPM, or DEB package on Debian, use ELF symbol versioning
+ # for compatibility with distribution packages, so client shared library can
+ # painlessly replace the one supplied by the distribution.
+
+ # Also list of exported symbols in distributions may differ from what is considered
+ # official API. Define CLIENT_API_EXTRA for the set of symbols, that required to
+ # be exported on different platforms.
+
+ IF(RPM)
+ # Fedora & Co declared following functions as part of API
+ # These functions are alias of another function (given mysql_ prefix=. The
+ # renaming is handled in rpm_support.cc below
+ SET(CLIENT_API_EXTRA
+ mysql_default_charset_info
+ mysql_get_charset
+ mysql_get_charset_by_csname
+ mysql_net_realloc
+ mysql_client_errors
+ )
+ # Add special script to fix symbols renames by Fedora
+ SET(CLIENT_SOURCES_EXTRA ${CLIENT_SOURCES} rpm_support.cc)
+ SET(VERSION_SCRIPT_TEMPLATE
+ ${CMAKE_CURRENT_SOURCE_DIR}/libmysql_rpm_version.in)
+ ELSEIF(DEB)
+ # libmyodbc on Ubuntu is using functions below
+ # If we don't export them, linker would just remove
+ # them (they are not used inside libmysqlclient)
+ SET(CLIENT_API_EXTRA
+ strfill
+ init_dynamic_string
+ )
+ # MySQL supplied with Ubuntu does not have versioning, bug Debian does.
+ IF(DEB MATCHES "debian")
+ SET(VERSION_SCRIPT_TEMPLATE ${CMAKE_CURRENT_SOURCE_DIR}/libmysql.ver.in)
+ ENDIF()
+ ENDIF()
+
+ IF(VERSION_SCRIPT_TEMPLATE)
+ # Generate version script.
+ # Create semicolon separated lists of functions to export from
+ # Since RPM packages use separate versioning for 5.1 API
+ # and 5.5 API (libmysqlclient_16 vs libmysqlclient_18),
+ # we need 2 lists.
+ SET (CLIENT_API_5_1_LIST)
+ FOREACH (f ${CLIENT_API_FUNCTIONS_5_1})
+ SET(CLIENT_API_5_1_LIST "${CLIENT_API_5_1_LIST}\n${f};")
+ ENDFOREACH()
+
+ SET (CLIENT_API_5_5_LIST)
+ FOREACH (f ${CLIENT_API_FUNCTIONS_5_5})
+ SET(CLIENT_API_5_5_LIST "${CLIENT_API_5_5_LIST}\n${f};")
+ ENDFOREACH()
+
+ CONFIGURE_FILE(
+ ${VERSION_SCRIPT_TEMPLATE}
+ ${CMAKE_CURRENT_BINARY_DIR}/libmysql.version
+ @ONLY@
+ )
+ SET(VERSION_SCRIPT_LINK_FLAGS
+ "-Wl,--version-script=${CMAKE_CURRENT_BINARY_DIR}/libmysql.version")
+ ENDIF()
+
+ENDIF()
+
+
SET(CLIENT_SOURCES
get_password.c
libmysql.c
@@ -146,6 +299,7 @@ SET(CLIENT_SOURCES
../sql/net_serv.cc
../sql-common/pack.c
../sql/password.c
+ ${CLIENT_SOURCES_EXTRA}
)
ADD_CONVENIENCE_LIBRARY(clientlib ${CLIENT_SOURCES})
DTRACE_INSTRUMENT(clientlib)
@@ -193,13 +347,13 @@ IF(NOT DISABLE_SHARED)
OUTPUT_NAME mysqlclient
VERSION "${OS_SHARED_LIB_VERSION}"
SOVERSION "${SHARED_LIB_MAJOR_VERSION}")
- IF(LINK_FLAG_NO_UNDEFINED)
+ IF(LINK_FLAG_NO_UNDEFINED OR VERSION_SCRIPT_LINK_FLAGS)
GET_TARGET_PROPERTY(libmysql_link_flags libmysql LINK_FLAGS)
IF(NOT libmysql_link_flag)
SET(libmysql_link_flags)
ENDIF()
SET_TARGET_PROPERTIES(libmysql PROPERTIES LINK_FLAGS
- "${libmysql_link_flags} ${LINK_FLAG_NO_UNDEFINED}")
+ "${libmysql_link_flags} ${LINK_FLAG_NO_UNDEFINED} ${VERSION_SCRIPT_LINK_FLAGS}")
ENDIF()
# clean direct output needs to be set several targets have the same name
#(mysqlclient in this case)