diff options
author | Robin H. Johnson <robbat2@gentoo.org> | 2011-07-13 07:07:15 +0000 |
---|---|---|
committer | Robin H. Johnson <robbat2@gentoo.org> | 2011-07-13 07:07:15 +0000 |
commit | 5669167dc14b409a41484f53e5217855d27cf6b6 (patch) | |
tree | f1e7304e0f8772061f6fcc9c22f7a5a9b36c8835 /eclass | |
parent | re-added interix prefix specific patch, as some things didnt make it into the... (diff) | |
download | gentoo-2-5669167dc14b409a41484f53e5217855d27cf6b6.tar.gz gentoo-2-5669167dc14b409a41484f53e5217855d27cf6b6.tar.bz2 gentoo-2-5669167dc14b409a41484f53e5217855d27cf6b6.zip |
Part 2 of MySQL eclass revamp: the split cmake/autotools support.
Diffstat (limited to 'eclass')
-rw-r--r-- | eclass/mysql-autotools.eclass | 629 | ||||
-rw-r--r-- | eclass/mysql-cmake.eclass | 347 | ||||
-rw-r--r-- | eclass/mysql_fx.eclass | 123 |
3 files changed, 1076 insertions, 23 deletions
diff --git a/eclass/mysql-autotools.eclass b/eclass/mysql-autotools.eclass new file mode 100644 index 000000000000..cdb854503977 --- /dev/null +++ b/eclass/mysql-autotools.eclass @@ -0,0 +1,629 @@ +# Copyright 1999-2011 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/eclass/mysql-autotools.eclass,v 1.1 2011/07/13 07:07:15 robbat2 Exp $ + +# @ECLASS: mysql-autotools.eclass +# @MAINTAINER: +# Author: Francesco Riosa (Retired) <vivo@gentoo.org> +# Maintainers: +# - MySQL Team <mysql-bugs@gentoo.org> +# - Robin H. Johnson <robbat2@gentoo.org> +# - Jorge Manuel B. S. Vicetto <jmbsvicetto@gentoo.org> +# - Luca Longinotti <chtekk@gentoo.org> +# @BLURB: This eclass provides support for autotools based mysql releases +# @DESCRIPTION: +# The mysql-autotools.eclass provides the support to build the mysql +# ebuilds using the autotools build system. This eclass provides +# the src_unpack, src_prepare, src_configure, src_compile, scr_install, +# pkg_preinst, pkg_postinst, pkg_config and pkg_postrm phase hooks. + +inherit autotools + +# +# HELPER FUNCTIONS: +# + +# @FUNCTION: mysql-autotools_disable_test +# @DESCRIPTION: +# Helper function to disable specific tests. +mysql-autotools_disable_test() { + + local rawtestname testname testsuite reason mysql_disable_file + rawtestname="${1}" ; shift + reason="${@}" + ewarn "test '${rawtestname}' disabled: '${reason}'" + + testsuite="${rawtestname/.*}" + testname="${rawtestname/*.}" + mysql_disable_file="${S}/mysql-test/t/disabled.def" + #einfo "rawtestname=${rawtestname} testname=${testname} testsuite=${testsuite}" + echo "${testname} : ${reason}" >> "${mysql_disable_file}" + + # ${S}/mysql-tests/t/disabled.def + # + # ${S}/mysql-tests/suite/federated/disabled.def + # + # ${S}/mysql-tests/suite/jp/t/disabled.def + # ${S}/mysql-tests/suite/ndb/t/disabled.def + # ${S}/mysql-tests/suite/rpl/t/disabled.def + # ${S}/mysql-tests/suite/parts/t/disabled.def + # ${S}/mysql-tests/suite/rpl_ndb/t/disabled.def + # ${S}/mysql-tests/suite/ndb_team/t/disabled.def + # ${S}/mysql-tests/suite/binlog/t/disabled.def + # ${S}/mysql-tests/suite/innodb/t/disabled.def + if [ -n "${testsuite}" ]; then + for mysql_disable_file in \ + ${S}/mysql-test/suite/${testsuite}/disabled.def \ + ${S}/mysql-test/suite/${testsuite}/t/disabled.def \ + FAILED ; do + [ -f "${mysql_disable_file}" ] && break + done + if [ "${mysql_disabled_file}" != "FAILED" ]; then + echo "${testname} : ${reason}" >> "${mysql_disable_file}" + else + ewarn "Could not find testsuite disabled.def location for ${rawtestname}" + fi + fi +} + +# @FUNCTION: mysql-autotools_configure_minimal +# @DESCRIPTION: +# Helper function to configure a minimal build +mysql-autotools_configure_minimal() { + + # These are things we exclude from a minimal build, please + # note that the server actually does get built and installed, + # but we then delete it before packaging. + local minimal_exclude_list="server embedded-server extra-tools innodb bench berkeley-db row-based-replication readline" + + for i in ${minimal_exclude_list} ; do + myconf="${myconf} --without-${i}" + done + myconf="${myconf} --with-extra-charsets=none" + myconf="${myconf} --enable-local-infile" + + if use static ; then + myconf="${myconf} --with-client-ldflags=-all-static" + myconf="${myconf} --disable-shared --with-pic" + else + myconf="${myconf} --enable-shared --enable-static" + fi + + if ! use latin1 ; then + myconf="${myconf} --with-charset=utf8" + myconf="${myconf} --with-collation=utf8_general_ci" + else + myconf="${myconf} --with-charset=latin1" + myconf="${myconf} --with-collation=latin1_swedish_ci" + fi +} + +# @FUNCTION: mysql-autotools_configure_common +# @DESCRIPTION: +# Helper function to configure the common builds +mysql-autotools_configure_common() { + + myconf="${myconf} $(use_with big-tables)" + myconf="${myconf} --enable-local-infile" + myconf="${myconf} --with-extra-charsets=all" + myconf="${myconf} --with-mysqld-user=mysql" + myconf="${myconf} --with-server" + myconf="${myconf} --with-unix-socket-path=/var/run/mysqld/mysqld.sock" + myconf="${myconf} --without-libwrap" + + if use static ; then + myconf="${myconf} --with-mysqld-ldflags=-all-static" + myconf="${myconf} --with-client-ldflags=-all-static" + myconf="${myconf} --disable-shared --with-pic" + else + myconf="${myconf} --enable-shared --enable-static" + fi + + if use debug ; then + myconf="${myconf} --with-debug=full" + else + myconf="${myconf} --without-debug" + if ( use cluster || [[ "${PN}" == "mysql-cluster" ]] ); then + myconf="${myconf} --without-ndb-debug" + fi + fi + + if [ -n "${MYSQL_DEFAULT_CHARSET}" -a -n "${MYSQL_DEFAULT_COLLATION}" ]; then + ewarn "You are using a custom charset of ${MYSQL_DEFAULT_CHARSET}" + ewarn "and a collation of ${MYSQL_DEFAULT_COLLATION}." + ewarn "You MUST file bugs without these variables set." + myconf="${myconf} --with-charset=${MYSQL_DEFAULT_CHARSET}" + myconf="${myconf} --with-collation=${MYSQL_DEFAULT_COLLATION}" + elif ! use latin1 ; then + myconf="${myconf} --with-charset=utf8" + myconf="${myconf} --with-collation=utf8_general_ci" + else + myconf="${myconf} --with-charset=latin1" + myconf="${myconf} --with-collation=latin1_swedish_ci" + fi + + if use embedded ; then + myconf="${myconf} --with-embedded-privilege-control" + myconf="${myconf} --with-embedded-server" + else + myconf="${myconf} --without-embedded-privilege-control" + myconf="${myconf} --without-embedded-server" + fi + +} + +# @FUNCTION: mysql-autotools_configure_51 +# @DESCRIPTION: +# Helper function to configure 5.1 and later builds +mysql-autotools_configure_51() { + + # TODO: !!!! readd --without-readline + # the failure depend upon config/ac-macros/readline.m4 checking into + # readline.h instead of history.h + myconf="${myconf} $(use_with ssl ssl /usr)" + myconf="${myconf} --enable-assembler" + myconf="${myconf} --with-geometry" + myconf="${myconf} --with-readline" + myconf="${myconf} --with-zlib-dir=/usr/" + myconf="${myconf} --without-pstack" + myconf="${myconf} --with-plugindir=/usr/$(get_libdir)/mysql/plugin" + + # This is an explict die here, because if we just forcibly disable it, then the + # user's data is not accessible. + use max-idx-128 && die "Bug #336027: upstream has a corruption issue with max-idx-128 presently" + #use max-idx-128 && myconf="${myconf} --with-max-indexes=128" + if [ "${MYSQL_COMMUNITY_FEATURES}" == "1" ]; then + myconf="${myconf} $(use_enable community community-features)" + if use community; then + myconf="${myconf} $(use_enable profiling)" + else + myconf="${myconf} --disable-profiling" + fi + fi + + # Scan for all available plugins + local plugins_avail="$( + LANG=C \ + find "${S}" \ + \( \ + -name 'plug.in' \ + -o -iname 'configure.in' \ + -o -iname 'configure.ac' \ + \) \ + -print0 \ + | xargs -0 sed -r -n \ + -e '/^MYSQL_STORAGE_ENGINE/{ + s~MYSQL_STORAGE_ENGINE\([[:space:]]*\[?([-_a-z0-9]+)\]?.*,~\1 ~g ; + s~^([^ ]+).*~\1~gp; + }' \ + | tr -s '\n' ' ' + )" + + # 5.1 introduces a new way to manage storage engines (plugins) + # like configuration=none + # This base set are required, and will always be statically built. + local plugins_sta="csv myisam myisammrg heap" + local plugins_dyn="" + local plugins_dis="example ibmdb2i" + + # These aren't actually required by the base set, but are really useful: + plugins_sta="${plugins_sta} archive blackhole" + + # Now the extras + if use extraengine ; then + # like configuration=max-no-ndb, archive and example removed in 5.1.11 + # not added yet: ibmdb2i + # Not supporting as examples: example,daemon_example,ftexample + plugins_sta="${plugins_sta} partition" + + if [[ "${PN}" != "mariadb" ]] ; then + elog "Before using the Federated storage engine, please be sure to read" + elog "http://dev.mysql.com/doc/refman/5.1/en/federated-limitations.html" + plugins_dyn="${plugins_sta} federatedx" + else + elog "MariaDB includes the FederatedX engine. Be sure to read" + elog "http://askmonty.org/wiki/index.php/Manual:FederatedX_storage_engine" + plugins_dyn="${plugins_sta} federated" + fi + else + plugins_dis="${plugins_dis} partition federated" + fi + + # Upstream specifically requests that InnoDB always be built: + # - innobase, innodb_plugin + # Build falcon if available for 6.x series. + for i in innobase falcon ; do + [ -e "${S}"/storage/${i} ] && plugins_sta="${plugins_sta} ${i}" + done + for i in innodb_plugin ; do + [ -e "${S}"/storage/${i} ] && plugins_dyn="${plugins_dyn} ${i}" + done + + # like configuration=max-no-ndb + if ( use cluster || [[ "${PN}" == "mysql-cluster" ]] ) ; then + plugins_sta="${plugins_sta} ndbcluster partition" + plugins_dis="${plugins_dis//partition}" + myconf="${myconf} --with-ndb-binlog" + else + plugins_dis="${plugins_dis} ndbcluster" + fi + + if [[ "${PN}" == "mariadb" ]] ; then + # In MariaDB, InnoDB is packaged in the xtradb directory, so it's not + # caught above. + # This is not optional, without it several upstream testcases fail. + # Also strongly recommended by upstream. + if [[ "${PV}" < "5.2.0" ]] ; then + myconf="${myconf} --with-maria-tmp-tables" + plugins_sta="${plugins_sta} maria" + else + myconf="${myconf} --with-aria-tmp-tables" + plugins_sta="${plugins_sta} aria" + fi + + [ -e "${S}"/storage/innobase ] || [ -e "${S}"/storage/xtradb ] || + die "The ${P} package doesn't provide innobase nor xtradb" + + for i in innobase xtradb ; do + [ -e "${S}"/storage/${i} ] && plugins_sta="${plugins_sta} ${i}" + done + + myconf="${myconf} $(use_with libevent)" + + if mysql_version_is_at_least "5.2" ; then + for i in oqgraph ; do + use ${i} \ + && plugins_dyn="${plugins_dyn} ${i}" \ + || plugins_dis="${plugins_dis} ${i}" + done + fi + + if mysql_version_is_at_least "5.2.5" ; then + for i in sphinx ; do + use ${i} \ + && plugins_dyn="${plugins_dyn} ${i}" \ + || plugins_dis="${plugins_dis} ${i}" + done + fi + fi + + if pbxt_available && [[ "${PBXT_NEWSTYLE}" == "1" ]]; then + use pbxt \ + && plugins_dyn="${plugins_dyn} pbxt" \ + || plugins_dis="${plugins_dis} pbxt" + fi + + use static && \ + plugins_sta="${plugins_sta} ${plugins_dyn}" && \ + plugins_dyn="" + + einfo "Available plugins: ${plugins_avail}" + einfo "Dynamic plugins: ${plugins_dyn}" + einfo "Static plugins: ${plugins_sta}" + einfo "Disabled plugins: ${plugins_dis}" + + # These are the static plugins + myconf="${myconf} --with-plugins=${plugins_sta// /,}" + # And the disabled ones + for i in ${plugins_dis} ; do + myconf="${myconf} --without-plugin-${i}" + done +} + +pbxt_src_configure() { + + mysql_init_vars + + pushd "${WORKDIR}/pbxt-${PBXT_VERSION}" &>/dev/null + + einfo "Reconfiguring dir '${PWD}'" + eautoreconf + + local myconf="" + myconf="${myconf} --with-mysql=${S} --libdir=/usr/$(get_libdir)" + use debug && myconf="${myconf} --with-debug=full" + econf ${myconf} || die "Problem configuring PBXT storage engine" +} + +pbxt_src_compile() { + + # TODO: is it safe/needed to use emake here ? + make || die "Problem making PBXT storage engine (${myconf})" + + popd + # TODO: modify test suite for PBXT +} + +pbxt_src_install() { + + pushd "${WORKDIR}/pbxt-${PBXT_VERSION}" &>/dev/null + emake install DESTDIR="${D}" || die "Failed to install PBXT" + popd +} + +# +# EBUILD FUNCTIONS +# + +# @FUNCTION: mysql-autotools_src_prepare +# @DESCRIPTION: +# Apply patches to the source code and remove unneeded bundled libs. +mysql-autotools_src_prepare() { + + cd "${S}" + + # Apply the patches for this MySQL version + EPATCH_SUFFIX="patch" + mkdir -p "${EPATCH_SOURCE}" || die "Unable to create epatch directory" + # Clean out old items + rm -f "${EPATCH_SOURCE}"/* + # Now link in right patches + mysql_mv_patches + # And apply + epatch + + # last -fPIC fixup, per bug #305873 + i="${S}"/storage/innodb_plugin/plug.in + [ -f "${i}" ] && sed -i -e '/CFLAGS/s,-prefer-non-pic,,g' "${i}" + + # Additional checks, remove bundled zlib (Cluster needs this, for static + # memory management in zlib, leave available for Cluster) + if [[ "${PN}" != "mysql-cluster" ]] ; then + rm -f "${S}/zlib/"*.[ch] + sed -i -e "s/zlib\/Makefile dnl/dnl zlib\/Makefile/" "${S}/configure.in" + fi + rm -f "scripts/mysqlbug" + + # Make charsets install in the right place + find . -name 'Makefile.am' \ + -exec sed --in-place -e 's!$(pkgdatadir)!'${MY_SHAREDSTATEDIR}'!g' {} \; + + # Remove what needs to be recreated, so we're sure it's actually done + einfo "Cleaning up old buildscript files" + find . -name Makefile \ + -o -name Makefile.in \ + -o -name configure \ + -exec rm -f {} \; + rm -f "ltmain.sh" + rm -f "scripts/mysqlbug" + + local rebuilddirlist d + + if xtradb_patch_available && use xtradb ; then + einfo "Adding storage engine: Percona XtraDB (replacing InnoDB)" + pushd "${S}"/storage >/dev/null + i="innobase" + o="${WORKDIR}/storage-${i}.mysql-upstream" + # Have we been here already? + [ -d "${o}" ] && rm -f "${i}" + # Or maybe we haven't + [ -d "${i}" -a ! -d "${o}" ] && mv "${i}" "${o}" + cp -ral "${WORKDIR}/${XTRADB_P}" "${i}" + popd >/dev/null + fi + + if pbxt_available && [[ "${PBXT_NEWSTYLE}" == "1" ]] && use pbxt ; then + einfo "Adding storage engine: PBXT" + pushd "${S}"/storage >/dev/null + i='pbxt' + [ -d "${i}" ] && rm -rf "${i}" + cp -ral "${WORKDIR}/${PBXT_P}" "${i}" + popd >/dev/null + fi + + rebuilddirlist="." + # This does not seem to be needed presently. robbat2 2010/02/23 + #einfo "Updating innobase cmake" + ## TODO: check this with a cmake expert + #cmake \ + # -DCMAKE_C_COMPILER=$(type -P $(tc-getCC)) \ + # -DCMAKE_CXX_COMPILER=$(type -P $(tc-getCXX)) \ + # "storage/innobase" + + for d in ${rebuilddirlist} ; do + einfo "Reconfiguring dir '${d}'" + pushd "${d}" &>/dev/null + eautoreconf + popd &>/dev/null + done +} + +# @FUNCTION: mysql-autotools_src_configure +# @DESCRIPTION: +# Configure mysql to build the code for Gentoo respecting the use flags. +mysql-autotools_src_configure() { + + # Make sure the vars are correctly initialized + mysql_init_vars + + # $myconf is modified by the configure_* functions + local myconf="" + + if use minimal ; then + mysql-autotools_configure_minimal + else + mysql-autotools_configure_common + mysql-autotools_configure_51 + fi + + # Bug #114895, bug #110149 + filter-flags "-O" "-O[01]" + + # glib-2.3.2_pre fix, bug #16496 + append-flags "-DHAVE_ERRNO_AS_DEFINE=1" + + # As discovered by bug #246652, doing a double-level of SSP causes NDB to + # fail badly during cluster startup. + if [[ $(gcc-major-version) -lt 4 ]]; then + filter-flags "-fstack-protector-all" + fi + + CXXFLAGS="${CXXFLAGS} -fno-exceptions -fno-strict-aliasing" + CXXFLAGS="${CXXFLAGS} -felide-constructors -fno-rtti" + mysql_version_is_at_least "5.0" \ + && CXXFLAGS="${CXXFLAGS} -fno-implicit-templates" + export CXXFLAGS + + # bug #283926, with GCC4.4, this is required to get correct behavior. + append-flags -fno-strict-aliasing + + # bug #335185, #335995, with >= GCC4.3.3 on x86 only, omit-frame-pointer + # causes a mis-compile. + # Upstream bugs: + # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38562 + # http://bugs.mysql.com/bug.php?id=45205 + use x86 && version_is_at_least "4.3.3" "$(gcc-fullversion)" && \ + append-flags -fno-omit-frame-pointer && \ + filter-flags -fomit-frame-pointer + + econf \ + --libexecdir="/usr/sbin" \ + --sysconfdir="${MY_SYSCONFDIR}" \ + --localstatedir="${MY_LOCALSTATEDIR}" \ + --sharedstatedir="${MY_SHAREDSTATEDIR}" \ + --libdir="${MY_LIBDIR}" \ + --includedir="${MY_INCLUDEDIR}" \ + --with-low-memory \ + --with-client-ldflags=-lstdc++ \ + --enable-thread-safe-client \ + --with-comment="Gentoo Linux ${PF}" \ + --without-docs \ + --with-LIBDIR="$(get_libdir)" \ + ${myconf} || die "econf failed" + + # TODO: Move this before autoreconf !!! + find . -type f -name Makefile -print0 \ + | xargs -0 -n100 sed -i \ + -e 's|^pkglibdir *= *$(libdir)/mysql|pkglibdir = $(libdir)|;s|^pkgincludedir *= *$(includedir)/mysql|pkgincludedir = $(includedir)|' + + if [[ $EAPI == 2 ]] && [[ "${PBXT_NEWSTYLE}" != "1" ]]; then + pbxt_patch_available && use pbxt && pbxt_src_configure + fi +} + +# @FUNCTION: mysql-autotools_src_compile +# @DESCRIPTION: +# Compile the mysql code. +mysql-autotools_src_compile() { + + emake || die "emake failed" + + if [[ "${PBXT_NEWSTYLE}" != "1" ]]; then + pbxt_patch_available && use pbxt && pbxt_src_compile + fi +} + +# @FUNCTION: mysql-autotools_src_install +# @DESCRIPTION: +# Install mysql. +mysql-autotools_src_install() { + + # Make sure the vars are correctly initialized + mysql_init_vars + + emake install \ + DESTDIR="${D}" \ + benchdir_root="${MY_SHAREDSTATEDIR}" \ + testroot="${MY_SHAREDSTATEDIR}" \ + || die "emake install failed" + + if [[ "${PBXT_NEWSTYLE}" != "1" ]]; then + pbxt_patch_available && use pbxt && pbxt_src_install + fi + + # Convenience links + einfo "Making Convenience links for mysqlcheck multi-call binary" + dosym "/usr/bin/mysqlcheck" "/usr/bin/mysqlanalyze" + dosym "/usr/bin/mysqlcheck" "/usr/bin/mysqlrepair" + dosym "/usr/bin/mysqlcheck" "/usr/bin/mysqloptimize" + + # Various junk (my-*.cnf moved elsewhere) + einfo "Removing duplicate /usr/share/mysql files" + rm -Rf "${D}/usr/share/info" + for removeme in "mysql-log-rotate" mysql.server* \ + binary-configure* my-*.cnf mi_test_all* + do + rm -f "${D}"/${MY_SHAREDSTATEDIR}/${removeme} + done + + # Clean up stuff for a minimal build + if use minimal ; then + einfo "Remove all extra content for minimal build" + rm -Rf "${D}${MY_SHAREDSTATEDIR}"/{mysql-test,sql-bench} + rm -f "${D}"/usr/bin/{mysql{_install_db,manager*,_secure_installation,_fix_privilege_tables,hotcopy,_convert_table_format,d_multi,_fix_extensions,_zap,_explain_log,_tableinfo,d_safe,_install,_waitpid,binlog,test},myisam*,isam*,pack_isam} + rm -f "${D}/usr/sbin/mysqld" + rm -f "${D}${MY_LIBDIR}"/lib{heap,merge,nisam,my{sys,strings,sqld,isammrg,isam},vio,dbug}.a + fi + + # Unless they explicitly specific USE=test, then do not install the + # testsuite. It DOES have a use to be installed, esp. when you want to do a + # validation of your database configuration after tuning it. + if use !test ; then + rm -rf "${D}"/${MY_SHAREDSTATEDIR}/mysql-test + fi + + # Configuration stuff + case ${MYSQL_PV_MAJOR} in + 5.[1-9]|6*|7*) mysql_mycnf_version="5.1" ;; + esac + einfo "Building default my.cnf (${mysql_mycnf_version})" + insinto "${MY_SYSCONFDIR}" + doins scripts/mysqlaccess.conf + mycnf_src="my.cnf-${mysql_mycnf_version}" + sed -e "s!@DATADIR@!${MY_DATADIR}!g" \ + "${FILESDIR}/${mycnf_src}" \ + > "${TMPDIR}/my.cnf.ok" + if use latin1 ; then + sed -i \ + -e "/character-set/s|utf8|latin1|g" \ + "${TMPDIR}/my.cnf.ok" + fi + newins "${TMPDIR}/my.cnf.ok" my.cnf + + # Minimal builds don't have the MySQL server + if ! use minimal ; then + einfo "Creating initial directories" + # Empty directories ... + diropts "-m0750" + if [[ "${PREVIOUS_DATADIR}" != "yes" ]] ; then + dodir "${MY_DATADIR}" + keepdir "${MY_DATADIR}" + chown -R mysql:mysql "${D}/${MY_DATADIR}" + fi + + diropts "-m0755" + for folder in "${MY_LOGDIR}" "/var/run/mysqld" ; do + dodir "${folder}" + keepdir "${folder}" + chown -R mysql:mysql "${D}/${folder}" + done + fi + + # Docs + einfo "Installing docs" + for i in README ChangeLog EXCEPTIONS-CLIENT INSTALL-SOURCE ; do + [[ -f "$i" ]] && dodoc "$i" + done + doinfo "${S}"/Docs/mysql.info + + # Minimal builds don't have the MySQL server + if ! use minimal ; then + einfo "Including support files and sample configurations" + docinto "support-files" + for script in \ + "${S}"/support-files/my-*.cnf \ + "${S}"/support-files/magic \ + "${S}"/support-files/ndb-config-2-node.ini + do + [[ -f "$script" ]] && dodoc "${script}" + done + + docinto "scripts" + for script in "${S}"/scripts/mysql* ; do + [[ -f "$script" ]] && [[ "${script%.sh}" == "${script}" ]] && dodoc "${script}" + done + + fi + + mysql_lib_symlinks "${D}" +} diff --git a/eclass/mysql-cmake.eclass b/eclass/mysql-cmake.eclass new file mode 100644 index 000000000000..c7e854114e40 --- /dev/null +++ b/eclass/mysql-cmake.eclass @@ -0,0 +1,347 @@ +# Copyright 1999-2011 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/eclass/mysql-cmake.eclass,v 1.1 2011/07/13 07:07:15 robbat2 Exp $ + +# @ECLASS: mysql-cmake.eclass +# @MAINTAINER: +# Maintainers: +# - MySQL Team <mysql-bugs@gentoo.org> +# - Robin H. Johnson <robbat2@gentoo.org> +# - Jorge Manuel B. S. Vicetto <jmbsvicetto@gentoo.org> +# @BLURB: This eclass provides the support for cmake based mysql releases +# @DESCRIPTION: +# The mysql-cmake.eclass provides the support to build the mysql +# ebuilds using the cmake build system. This eclass provides +# the src_unpack, src_prepare, src_configure, src_compile, scr_install, +# pkg_preinst, pkg_postinst, pkg_config and pkg_postrm phase hooks. + +inherit cmake-utils + +# +# HELPER FUNCTIONS: +# + +# @FUNCTION: mysql_cmake_disable_test +# @DESCRIPTION: +# Helper function to disable specific tests. +mysql-cmake_disable_test() { + + local rawtestname testname testsuite reason mysql_disable_file + rawtestname="${1}" ; shift + reason="${@}" + ewarn "test '${rawtestname}' disabled: '${reason}'" + + testsuite="${rawtestname/.*}" + testname="${rawtestname/*.}" + mysql_disable_file="${S}/mysql-test/t/disabled.def" + #einfo "rawtestname=${rawtestname} testname=${testname} testsuite=${testsuite}" + echo ${testname} : ${reason} >> "${mysql_disable_file}" + + if [ -n "${testsuite}" ]; then + for mysql_disable_file in \ + ${S}/mysql-test/suite/${testsuite}/disabled.def \ + ${S}/mysql-test/suite/${testsuite}/t/disabled.def \ + FAILED ; do + [ -f "${mysql_disable_file}" ] && break + done + if [ "${mysql_disabled_file}" != "FAILED" ]; then + echo "${testname} : ${reason}" >> "${mysql_disable_file}" + else + ewarn "Could not find testsuite disabled.def location for ${rawtestname}" + fi + fi +} + +# @FUNCTION: configure_cmake_locale +# @DESCRIPTION: +# Helper function to configure locale cmake options +configure_cmake_locale() { + + if ! use minimal && [ -n "${MYSQL_DEFAULT_CHARSET}" -a -n "${MYSQL_DEFAULT_COLLATION}" ]; then + ewarn "You are using a custom charset of ${MYSQL_DEFAULT_CHARSET}" + ewarn "and a collation of ${MYSQL_DEFAULT_COLLATION}." + ewarn "You MUST file bugs without these variables set." + + mycmakeargs+=( + -DDEFAULT_CHARSET=${MYSQL_DEFAULT_CHARSET} + -DDEFAULT_COLLATION=${MYSQL_DEFAULT_COLLATION} + ) + + elif ! use latin1 ; then + mycmakeargs+=( + -DDEFAULT_CHARSET=utf8 + -DDEFAULT_COLLATION=utf8_general_ci + ) + else + mycmakeargs+=( + -DDEFAULT_CHARSET=latin1 + -DDEFAULT_COLLATION=latin1_swedish_ci + ) + fi +} + +# @FUNCTION: configure_cmake_minimal +# @DESCRIPTION: +# Helper function to configure minimal build +configure_cmake_minimal() { + + mycmakeargs+=( + -DWITHOUT_SERVER=1 + -DWITHOUT_EMBEDDED_SERVER=1 + -DENABLED_LOCAL_INFILE=1 + -DEXTRA_CHARSETS=none + -DINSTALL_SQLBENCHDIR= + -DWITH_SSL=system + -DWITH_ZLIB=system + -DWITHOUT_LIBWRAP=1 + -DWITHOUT_READLINE=1 + -DWITHOUT_ARCHIVE_STORAGE_ENGINE=1 + -DWITHOUT_BLACKHOLE_STORAGE_ENGINE=1 + -DWITHOUT_CSV_STORAGE_ENGINE=1 + -DWITHOUT_FEDERATED_STORAGE_ENGINE=1 + -DWITHOUT_HEAP_STORAGE_ENGINE=1 + -DWITHOUT_INNOBASE_STORAGE_ENGINE=1 + -DWITHOUT_MYISAMMRG_STORAGE_ENGINE=1 + -DWITHOUT_MYISAM_STORAGE_ENGINE=1 + -DWITHOUT_PARTITION_STORAGE_ENGINE=1 + -DWITHOUT_INNOBASE_STORAGE_ENGINE=1 + ) +} + +# @FUNCTION: configure_cmake_standard +# @DESCRIPTION: +# Helper function to configure standard build +configure_cmake_standard() { + + mycmakeargs+=( + -DENABLED_LOCAL_INFILE=1 + -DEXTRA_CHARSETS=all + -DMYSQL_USER=mysql + -DMYSQL_UNIX_ADDR=/var/run/mysqld/mysqld.sock + -DWITHOUT_READLINE=1 + -DWITH_ZLIB=system + -DWITHOUT_LIBWRAP=1 + ) + + if use static ; then + mycmakeargs+=( -DDISABLE_SHARED=1 ) + else + mycmakeargs+=( -DDISABLED_SHARED=0 ) + fi + + mycmakeargs+=( + $(cmake-utils_use_with debug) + $(cmake-utils_use_with embedded EMBEDDED_SERVER) + $(cmake-utils_use_with profiling) + ) + + if use ssl; then + mycmakeargs+=( -DWITH_SSL=system ) + else + mycmakeargs+=( -DWITH_SSL=0 ) + fi + + # Storage engines + mycmakeargs+=( + -DWITH_ARCHIVE_STORAGE_ENGINE=1 + -DWITH_BLACKHOLE_STORAGE_ENGINE=1 + -DWITH_CSV_STORAGE_ENGINE=1 + -DWITH_HEAP_STORAGE_ENGINE=1 + -DWITH_INNOBASE_STORAGE_ENGINE=1 + -DWITH_MYISAMMRG_STORAGE_ENGINE=1 + -DWITH_MYISAM_STORAGE_ENGINE=1 + -DWITH_PARTITION_STORAGE_ENGINE=1 + $(cmake-utils_use_with extraengine FEDERATED_STORAGE_ENGINE) + ) +} + +# +# EBUILD FUNCTIONS +# + +# @FUNCTION: mysql-cmake_src_prepare +# @DESCRIPTION: +# Apply patches to the source code and remove unneeded bundled libs. +mysql-cmake_src_prepare() { + + debug-print-function ${FUNCNAME} "$@" + + cd "${S}" + + # Apply the patches for this MySQL version + EPATCH_SUFFIX="patch" + mkdir -p "${EPATCH_SOURCE}" || die "Unable to create epatch directory" + # Clean out old items + rm -f "${EPATCH_SOURCE}"/* + # Now link in right patches + mysql_mv_patches + # And apply + epatch + + # last -fPIC fixup, per bug #305873 + i="${S}"/storage/innodb_plugin/plug.in + [ -f "${i}" ] && sed -i -e '/CFLAGS/s,-prefer-non-pic,,g' "${i}" + + rm -f "scripts/mysqlbug" +} + +# @FUNCTION: mysql-cmake_src_configure +# @DESCRIPTION: +# Configure mysql to build the code for Gentoo respecting the use flags. +mysql-cmake_src_configure() { + + debug-print-function ${FUNCNAME} "$@" + + mycmakeargs=( + -DCMAKE_INSTALL_PREFIX=/usr + -DMYSQL_DATADIR=/var/lib/mysql + -DSYSCONFDIR=/etc/mysql + -DINSTALL_BINDIR=bin + -DINSTALL_DOCDIR=share/doc/${P} + -DINSTALL_DOCREADMEDIR=share/doc/${P} + -DINSTALL_INCLUDEDIR=include/mysql + -DINSTALL_INFODIR=share/info + -DINSTALL_LIBDIR=$(get_libdir)/mysql + -DINSTALL_MANDIR=share/man + -DINSTALL_MYSQLDATADIR=/var/lib/mysql + -DINSTALL_MYSQLSHAREDIR=share/mysql + -DINSTALL_MYSQLTESTDIR=share/mysql/mysql-test + -DINSTALL_PLUGINDIR=$(get_libdir)/mysql/plugin + -DINSTALL_SBINDIR=sbin + -DINSTALL_SCRIPTDIR=share/mysql/scripts + -DINSTALL_SQLBENCHDIR=share/mysql + -DINSTALL_SUPPORTFILESDIR=/usr/share/mysql + -DWITH_COMMENT="Gentoo Linux ${PF}" + -DWITHOUT_UNIT_TESTS=1 + ) + + configure_cmake_locale + + if use minimal ; then + configure_cmake_minimal + else + configure_cmake_standard + fi + + # Bug #114895, bug #110149 + filter-flags "-O" "-O[01]" + + CXXFLAGS="${CXXFLAGS} -fno-exceptions -fno-strict-aliasing" + CXXFLAGS="${CXXFLAGS} -felide-constructors -fno-rtti" + CXXFLAGS="${CXXFLAGS} -fno-implicit-templates" + export CXXFLAGS + + # bug #283926, with GCC4.4, this is required to get correct behavior. + append-flags -fno-strict-aliasing + + cmake-utils_src_configure +} + +# @FUNCTION: mysql-cmake_src_compile +# @DESCRIPTION: +# Compile the mysql code. +mysql-cmake_src_compile() { + + debug-print-function ${FUNCNAME} "$@" + + cmake-utils_src_compile +} + +# @FUNCTION: mysql-cmake_src_install +# @DESCRIPTION: +# Install mysql. +mysql-cmake_src_install() { + + debug-print-function ${FUNCNAME} "$@" + + # Make sure the vars are correctly initialized + mysql_init_vars + + cmake-utils_src_install + + # Convenience links + einfo "Making Convenience links for mysqlcheck multi-call binary" + dosym "/usr/bin/mysqlcheck" "/usr/bin/mysqlanalyze" + dosym "/usr/bin/mysqlcheck" "/usr/bin/mysqlrepair" + dosym "/usr/bin/mysqlcheck" "/usr/bin/mysqloptimize" + + # INSTALL_LAYOUT=STANDALONE causes cmake to create a /usr/data dir + rm -Rf "${D}/usr/data" + + # Various junk (my-*.cnf moved elsewhere) + einfo "Removing duplicate /usr/share/mysql files" + + # Clean up stuff for a minimal build +# if use minimal ; then +# einfo "Remove all extra content for minimal build" +# rm -Rf "${D}${MY_SHAREDSTATEDIR}"/{mysql-test,sql-bench} +# rm -f "${D}"/usr/bin/{mysql{_install_db,manager*,_secure_installation,_fix_privilege_tables,hotcopy,_convert_table_format,d_multi,_fix_extensions,_zap,_explain_log,_tableinfo,d_safe,_install,_waitpid,binlog,test},myisam*,isam*,pack_isam} +# rm -f "${D}/usr/sbin/mysqld" +# rm -f "${D}${MY_LIBDIR}"/lib{heap,merge,nisam,my{sys,strings,sqld,isammrg,isam},vio,dbug}.a +# fi + + # Unless they explicitly specific USE=test, then do not install the + # testsuite. It DOES have a use to be installed, esp. when you want to do a + # validation of your database configuration after tuning it. + if ! use test ; then + rm -rf "${D}"/${MY_SHAREDSTATEDIR}/mysql-test + fi + + # Configuration stuff + case ${MYSQL_PV_MAJOR} in + 5.[1-9]|6*|7*) mysql_mycnf_version="5.1" ;; + esac + einfo "Building default my.cnf (${mysql_mycnf_version})" + insinto "${MY_SYSCONFDIR}" + doins scripts/mysqlaccess.conf + mycnf_src="my.cnf-${mysql_mycnf_version}" + sed -e "s!@DATADIR@!${MY_DATADIR}!g" \ + "${FILESDIR}/${mycnf_src}" \ + > "${TMPDIR}/my.cnf.ok" + if use latin1 ; then + sed -i \ + -e "/character-set/s|utf8|latin1|g" \ + "${TMPDIR}/my.cnf.ok" + fi + newins "${TMPDIR}/my.cnf.ok" my.cnf + + # Minimal builds don't have the MySQL server + if ! use minimal ; then + einfo "Creating initial directories" + # Empty directories ... + diropts "-m0750" + if [[ "${PREVIOUS_DATADIR}" != "yes" ]] ; then + dodir "${MY_DATADIR}" + keepdir "${MY_DATADIR}" + chown -R mysql:mysql "${D}/${MY_DATADIR}" + fi + + diropts "-m0755" + for folder in "${MY_LOGDIR}" "/var/run/mysqld" ; do + dodir "${folder}" + keepdir "${folder}" + chown -R mysql:mysql "${D}/${folder}" + done + fi + + # Minimal builds don't have the MySQL server + if ! use minimal ; then + einfo "Including support files and sample configurations" + docinto "support-files" + for script in \ + "${S}"/support-files/my-*.cnf.sh \ + "${S}"/support-files/magic \ + "${S}"/support-files/ndb-config-2-node.ini.sh + do + [[ -f "$script" ]] && dodoc "${script}" + done + + docinto "scripts" + for script in "${S}"/scripts/mysql* ; do + [[ -f "$script" ]] && [[ "${script%.sh}" == "${script}" ]] && dodoc "${script}" + done + + fi + + mysql_lib_symlinks "${D}" +} diff --git a/eclass/mysql_fx.eclass b/eclass/mysql_fx.eclass index 2ee11002a20c..1d531c1dcc95 100644 --- a/eclass/mysql_fx.eclass +++ b/eclass/mysql_fx.eclass @@ -1,9 +1,11 @@ # Copyright 1999-2007 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo-x86/eclass/mysql_fx.eclass,v 1.22 2009/02/12 05:05:14 robbat2 Exp $ +# $Header: /var/cvsroot/gentoo-x86/eclass/mysql_fx.eclass,v 1.23 2011/07/13 07:07:15 robbat2 Exp $ # Author: Francesco Riosa (Retired) <vivo@gentoo.org> -# Maintainer: Luca Longinotti <chtekk@gentoo.org> +# Maintainer: +# - MySQL Team <mysql-bugs@gentoo.org> +# - Luca Longinotti <chtekk@gentoo.org> inherit multilib @@ -182,30 +184,105 @@ mysql_version_is_at_least() { # library to the best version available. # mysql_lib_symlinks() { - einfo "Updating MySQL .so symlinks" - local d dirlist maxdots soname sonameln reldir + + local d dirlist maxdots libname libnameln libsuffix reldir + libsuffix=$(get_libname) + + einfo "libsuffix = ${libsuffix}" + einfo "Updating MySQL libraries symlinks" + reldir="${1}" pushd "${reldir}/usr/$(get_libdir)" &> /dev/null - # dirlist must contain the less significative directory left - dirlist="mysql" - - # waste some time in removing and recreating symlinks - for d in $dirlist ; do - for soname in $( find "${d}" -name "*.so*" -and -not -type "l" 2>/dev/null ) ; do - # maxdot is a limit versus infinite loop - maxdots=0 - sonameln=${soname##*/} - # loop in version of the library to link it, similar to how - # libtool works - while [[ ${sonameln:0-3} != '.so' ]] && [[ ${maxdots} -lt 6 ]] ; do - rm -f "${sonameln}" - ln -s "${soname}" "${sonameln}" - (( ++maxdots )) - sonameln="${sonameln%.*}" - done - rm -f "${sonameln}" - ln -s "${soname}" "${sonameln}" + + # dirlist must contain the less significative directory left + dirlist="mysql" + + # waste some time in removing and recreating symlinks + for d in $dirlist ; do + for libname in $( find "${d}" -name "*${libsuffix}*" -and -not -type "l" 2>/dev/null ) ; do + # maxdot is a limit versus infinite loop + maxdots=0 + libnameln=${libname##*/} + # loop in version of the library to link it, similar to how + # libtool works + while [[ ${libnameln:0-3} != '${libsuffix}' ]] && [[ ${maxdots} -lt 6 ]] ; do + rm -f "${libnameln}" + ln -s "${libname}" "${libnameln}" + (( ++maxdots )) + libnameln="${libnameln%.*}" done + rm -f "${libnameln}" + ln -s "${libname}" "${libnameln}" done + done + popd &> /dev/null } + +# @FUNCTION: mysql_init_vars +# @DESCRIPTION: +# void mysql_init_vars() +# Initialize global variables +# 2005-11-19 <vivo@gentoo.org> +mysql_init_vars() { + MY_SHAREDSTATEDIR=${MY_SHAREDSTATEDIR="/usr/share/mysql"} + MY_SYSCONFDIR=${MY_SYSCONFDIR="/etc/mysql"} + MY_LIBDIR=${MY_LIBDIR="/usr/$(get_libdir)/mysql"} + MY_LOCALSTATEDIR=${MY_LOCALSTATEDIR="/var/lib/mysql"} + MY_LOGDIR=${MY_LOGDIR="/var/log/mysql"} + MY_INCLUDEDIR=${MY_INCLUDEDIR="/usr/include/mysql"} + + if [[ -z "${MY_DATADIR}" ]] ; then + MY_DATADIR="" + if [[ -f "${MY_SYSCONFDIR}/my.cnf" ]] ; then + MY_DATADIR=`"my_print_defaults" mysqld 2>/dev/null \ + | sed -ne '/datadir/s|^--datadir=||p' \ + | tail -n1` + if [[ -z "${MY_DATADIR}" ]] ; then + MY_DATADIR=`grep ^datadir "${MY_SYSCONFDIR}/my.cnf" \ + | sed -e 's/.*=\s*//' \ + | tail -n1` + fi + fi + if [[ -z "${MY_DATADIR}" ]] ; then + MY_DATADIR="${MY_LOCALSTATEDIR}" + einfo "Using default MY_DATADIR" + fi + elog "MySQL MY_DATADIR is ${MY_DATADIR}" + + if [[ -z "${PREVIOUS_DATADIR}" ]] ; then + if [[ -e "${MY_DATADIR}" ]] ; then + # If you get this and you're wondering about it, see bug #207636 + elog "MySQL datadir found in ${MY_DATADIR}" + elog "A new one will not be created." + PREVIOUS_DATADIR="yes" + else + PREVIOUS_DATADIR="no" + fi + export PREVIOUS_DATADIR + fi + else + if [[ ${EBUILD_PHASE} == "config" ]]; then + local new_MY_DATADIR + new_MY_DATADIR=`"my_print_defaults" mysqld 2>/dev/null \ + | sed -ne '/datadir/s|^--datadir=||p' \ + | tail -n1` + + if [[ ( -n "${new_MY_DATADIR}" ) && ( "${new_MY_DATADIR}" != "${MY_DATADIR}" ) ]]; then + ewarn "MySQL MY_DATADIR has changed" + ewarn "from ${MY_DATADIR}" + ewarn "to ${new_MY_DATADIR}" + MY_DATADIR="${new_MY_DATADIR}" + fi + fi + fi + + if [ "${MY_SOURCEDIR:-unset}" == "unset" ]; then + MY_SOURCEDIR=${SERVER_URI##*/} + MY_SOURCEDIR=${MY_SOURCEDIR%.tar*} + fi + + export MY_SHAREDSTATEDIR MY_SYSCONFDIR + export MY_LIBDIR MY_LOCALSTATEDIR MY_LOGDIR + export MY_INCLUDEDIR MY_DATADIR MY_SOURCEDIR +} |