# Copyright 1999-2010 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 EAPI=2 KEYWORDS="~amd64 ~x86" WANT_AUTOCONF="latest" WANT_AUTOMAKE="latest" inherit toolchain-funcs cmake-utils eutils flag-o-matic gnuconfig autotools versionator #MY_PKG="percona-server" #MY_VER="5.5.10" SRC_URI="http://www.percona.com/redir/downloads/Percona-Server-5.5/Percona-Server-5.5.10-rc20.1/source/Percona-Server-5.5.10-rc20.1.tar.gz" S=${WORKDIR}/Percona-Server-5.5.10-rc20.1 DESCRIPTION="A fast, multi-threaded, multi-user SQL database server." HOMEPAGE="http://www.percona.com/" LICENSE="GPL-2" SLOT="0" IUSE="ssl static debug latin1 no-configs archive blackhole" # Be warned, *DEPEND are version-dependant # These are used for both runtime and compiletime DEPEND="ssl? ( >=dev-libs/openssl-0.9.6d ) userland_GNU? ( sys-process/procps ) >=sys-apps/sed-4 >=sys-apps/texinfo-4.7-r1 >=sys-libs/readline-4.1 >=sys-libs/zlib-1.2.3" # Having different flavours at the same time is not a good idea for i in "mysql" "mysql-community" "mysql-cluster" "mariadb" ; do [[ "${i}" == ${PN} ]] || DEPEND="${DEPEND} !dev-db/${i}" done RDEPEND="${DEPEND} !no-configs? ( dev-db/mysql-init-scripts ) =virtual/mysql-5.5" percona_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 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 } mysql_lib_symlinks() { einfo "Updating MySQL .so symlinks" local d dirlist maxdots soname sonameln reldir 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}" done done popd &> /dev/null } pkg_setup () { enewgroup mysql 60 || die "problem adding 'mysql' group" enewuser mysql 60 -1 /dev/null mysql || die "problem adding 'mysql' user" } src_configure() { percona.cmake_src_configure } src_compile() { percona.cmake_src_compile } src_install() { percona.cmake_src_install } percona.cmake_src_configure() { mycmakeargs=( -DCMAKE_INSTALL_PREFIX=/usr -DINSTALL_SBINDIR=sbin -DINSTALL_BINDIR=bin -DSYSCONFDIR=/etc/mysql -DMYSQL_DATADIR=/var/lib/mysql -DCOMPILATION_COMMENT="Gentoo Linux ${PF}" -DINSTALL_MYSQLSHAREDIR=share/mysql -DINSTALL_LIBDIR=lib/mysql -DINSTALL_PLUGINDIR=lib/mysql/plugin -DINSTALL_MANDIR=share/man -DINSTALL_INFODIR=share/info -DINSTALL_INCLUDEDIR=include/mysql -DINSTALL_DOCREADMEDIR="share/doc/${PF}" -DINSTALL_DOCDIR="share/doc/${PF}" -DINSTALL_SCRIPTDIR="share/doc/${PF}/scripts" -DINSTALL_SQLBENCHDIR=share/mysql -DINSTALL_MYSQLTESTDIR=share/mysql-test -DINSTALL_SUPPORTFILESDIR=share/mysql) if use ssl ; then mycmakeargs+=( -DWITH_SSL=system) else mycmakeargs+=( -DWITH_SSL=no) fi mycmakeargs+=( -DWITH-ZLIB=system -DWITH-READLINE=1 ) configure_common_cmake 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 append-flags -fno-omit-frame-pointer filter-flags -fomit-frame-pointer export CFLAGS cmake-utils_src_configure } configure_common_cmake() { mycmakeargs+=( -DENABLED_LOCAL_INFILE=1 -DEXTRA_CHARSETS=all -DMYSQL_USER=mysql -DMYSQL_UNIX_ADDR=/var/run/mysqld/mysqld.sock -DWITH_LIBWRAP=0 -DWITHOUT_SERVER=0) if use static ; then mycmakeargs+=( -DDISABLE_SHARED=1 -DWITH_PIC=1) else mycmakeargs+=( -DDISABLED_SHARED=0) fi if use debug ; then mycmakeargs+=( -DCMAKE_BUILD_TYPE=Debug ) else mycmakeargs+=( -DCMAKE_BUILD_TYPE=RelWithDebInfo ) fi if use archive ; then mycmakeargs+=( -DWITH_ARCHIVE_STORAGE_ENGINE=1 ) else mycmakeargs+=( -DWITH_ARCHIVE_STORAGE_ENGINE=0 ) fi if use blackhole ; then mycmakeargs+=( -DWITH_BLACKHOLE_STORAGE_ENGINE=1 ) else mycmakeargs+=( -DWITH_BLACKHOLE_STORAGE_ENGINE=0 ) 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." 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 } percona.cmake_src_compile() { # Be backwards compatible for now case ${EAPI:-0} in 2) : ;; 0 | 1) percona.cmake_src_configure ;; esac cmake-utils_src_compile } percona.cmake_src_install() { # Make sure the vars are correctly initialized percona_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" # 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 # 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 einfo "Building default my.cnf" insinto "${MY_SYSCONFDIR}" doins scripts/mysqlaccess.conf #mycnf_src="scripts/my-${mysql_mycnf_version}" mycnf_src="${S}/support-files/my-huge.cnf.sh" sed -e "s!@MYSQL_UNIX_ADDR@!/var/run/mysqld/mysqld.sock!g" "${mycnf_src}" > "${TMPDIR}/my.cnf.ok" sed -e "s!@MYSQL_TCP_PORT@!3306!g" "${TMPDIR}/my.cnf.ok" > "${TMPDIR}/my.cnf-port.ok" sed '26i\user = mysql' "${TMPDIR}/my.cnf-port.ok" >"${TMPDIR}/my.cnf-user.ok" sed '27i\basedir = /usr' "${TMPDIR}/my.cnf-user.ok" >"${TMPDIR}/my.cnf-basedir.ok" sed '28i\datadir = /var/lib/mysql' "${TMPDIR}/my.cnf-basedir.ok" >"${TMPDIR}/my.cnf-datadir.ok" sed '29i\pid-file = /var/run/mysqld/mysqld.pid' "${TMPDIR}/my.cnf-datadir.ok" >"${TMPDIR}/my.cnf-pid.ok" sed '30i\log-error = /var/log/mysql/mysqld.err' "${TMPDIR}/my.cnf-pid.ok" >"${TMPDIR}/my.cnf.okay" if use latin1 ; then sed '26i\character-set-server = latin1' "${TMPDIR}/my.cnf.okay" >"${TMPDIR}/my.cnf-char.okay" mv "${TMPDIR}/my.cnf-char.okay" "${TMPDIR}/my.cnf.okay" fi newins "${TMPDIR}/my.cnf.okay" my.cnf || die 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 # Docs einfo "Installing docs" dodoc "${S}"/Docs/ChangeLog doinfo "${S}"/Docs/mysql.info if ! use no-configs ; 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}" } pkg_postinst () { einfo elog "mysql_install_db has been installed to" elog "/usr/share/doc/percona-server-5.5.10_rc1/scripts/" elog "" elog "You can cd there and then issue the command:" elog "./mysql_install_db --basedir=/usr/" einfo einfo elog "Please check my.cnf if this is a fresh install" einfo } percona_pkg_postrm() { : #mysql_lib_symlinks "${D}" }