| # Copyright 1999-2012 Gentoo Foundation |
| # Distributed under the terms of the GNU General Public License v2 |
| # $Header: /var/cvsroot/gentoo-x86/eclass/mysql_fx.eclass,v 1.30 2012/01/09 10:42:19 grobian Exp $ |
| |
| # Author: Francesco Riosa (Retired) <vivo@gentoo.org> |
| # Maintainer: |
| # - MySQL Team <mysql-bugs@gentoo.org> |
| # - Luca Longinotti <chtekk@gentoo.org> |
| |
| inherit multilib |
| |
| # |
| # Helper function, version (integer) may have sections separated by dots |
| # for readability. |
| # |
| stripdots() { |
| local dotver=${1:-"0"} |
| local v="" |
| local ret=0 |
| if [[ "${dotver/./}" != "${dotver}" ]] ; then |
| # dotted version number |
| for i in 1000000 10000 100 1 ; do |
| v=${dotver%%\.*} |
| # remove leading zeroes |
| while [[ ${#v} -gt 1 ]] && [[ ${v:0:1} == "0" ]] ; do v=${v#0} ; done |
| # increment integer version number |
| ret=$(( ${v} * ${i} + ${ret} )) |
| if [[ "${dotver}" == "${dotver/\.}" ]] ; then |
| dotver=0 |
| else |
| dotver=${dotver#*\.} |
| fi |
| done |
| echo "${ret}" |
| else |
| # already an integer |
| v=${dotver} |
| while [[ ${#v} -gt 1 ]] && [[ ${v:0:1} == "0" ]] ; do v=${v#0} ; done |
| echo "${v}" |
| fi |
| } |
| |
| # |
| # Check if a version number falls inside a given range. |
| # The range includes the extremes and must be specified as |
| # "low_version to high_version" i.e. "4.1.2 to 5.1.99.99". |
| # Returns true if inside the range. |
| # |
| mysql_check_version_range() { |
| local lbound="${1%% to *}" ; lbound=$(stripdots "${lbound}") |
| local rbound="${1#* to }" ; rbound=$(stripdots "${rbound}") |
| local my_ver="${2:-"${MYSQL_VERSION_ID}"}" |
| [[ ${lbound} -le ${my_ver} ]] && [[ ${my_ver} -le ${rbound} ]] && return 0 |
| return 1 |
| } |
| |
| # |
| # True if at least one applicable range is found for the patch. |
| # |
| _mysql_test_patch_ver_pn() { |
| local allelements=", version, package name" |
| # So that it fails the directory test if none of them exist |
| local filesdir="/dev/null" |
| for d in "${WORKDIR}/mysql-extras-${MY_EXTRAS_VER}" \ |
| "${WORKDIR}/mysql-extras" ; do |
| if [ -d "${d}" ]; then |
| filesdir="${d}" |
| break |
| fi |
| done |
| |
| [[ -d "${filesdir}" ]] || die "Source dir must be a directory" |
| local flags=$1 pname=$2 |
| if [[ $(( $flags & $(( 1 + 4 + 16 )) )) -eq 21 ]] ; then |
| einfo "using '${pname}'" |
| ln -sf "${filesdir}/${pname}" "${EPATCH_SOURCE}" || die "Couldn't move ${pname}" |
| return 0 |
| fi |
| |
| [[ $(( $flags & $(( 2 + 4 )) )) -gt 0 ]] \ |
| && allelements="${allelements//", version"}" |
| |
| [[ $(( $flags & $(( 8 + 16 )) )) -gt 0 ]] \ |
| && allelements="${allelements//", package name"}" |
| |
| [[ -n "${allelements}" ]] && [[ "${flags}" -gt 0 ]] \ |
| && ewarn "QA notice: ${allelements} missing in ${pname} patch" |
| |
| return 1 |
| } |
| |
| # |
| # Parse a "index_file" looking for patches to apply to the |
| # current MySQL version. |
| # If the patch applies, print its description. |
| # |
| mysql_mv_patches() { |
| # So that it fails the directory test if none of them exist |
| local filesdir="/dev/null" |
| if [[ -z "${1}" ]]; then |
| for d in "${WORKDIR}/mysql-extras-${MY_EXTRAS_VER}" \ |
| "${WORKDIR}/mysql-extras" ; do |
| if [ -d "${d}" ]; then |
| filesdir="${d}" |
| break |
| fi |
| done |
| [[ -d "${filesdir}" ]] || die "No patches directory found!" |
| fi |
| |
| for i in "$1" "${filesdir}/0000_index.txt" "${filesdir}/000_index.txt" ; do |
| if [ -n "$i" -a -f "$i" ]; then |
| local index_file="$i" |
| break |
| fi |
| done |
| |
| local my_ver="${2:-"${MYSQL_VERSION_ID}"}" |
| local my_test_fx=${3:-"_mysql_test_patch_ver_pn"} |
| _mysql_mv_patches "${index_file}" "${my_ver}" "${my_test_fx}" |
| } |
| |
| _mysql_mv_patches() { |
| local index_file="${1}" |
| local my_ver="${2}" |
| local my_test_fx="${3}" |
| local dsc ndsc=0 i |
| dsc=( ) |
| |
| # Values for flags are (2^x): |
| # 1 - one patch found |
| # 2 - at least one version range is wrong |
| # 4 - at least one version range is ok |
| # 8 - at least one ${PN} did not match |
| # 16 - at least one ${PN} has been matched |
| local flags=0 pname="" |
| while read row ; do |
| case "${row}" in |
| @patch\ *) |
| [[ -n "${pname}" ]] \ |
| && ${my_test_fx} ${flags} "${pname}" \ |
| && for (( i=0 ; $i < $ndsc ; i++ )) ; do einfo "> ${dsc[$i]}" ; done |
| flags=1 ; ndsc=0 ; dsc=( ) |
| pname=${row#"@patch "} |
| ;; |
| @ver\ *) |
| if mysql_check_version_range "${row#"@ver "}" "${my_ver}" ; then |
| flags=$(( ${flags} | 4 )) |
| else |
| flags=$(( ${flags} | 2 )) |
| fi |
| ;; |
| @pn\ *) |
| if [[ ${row#"@pn "} == "${PN}" ]] ; then |
| flags=$(( ${flags} | 16 )) |
| else |
| flags=$(( ${flags} | 8 )) |
| fi |
| ;; |
| # @use\ *) ;; |
| @@\ *) |
| dsc[$ndsc]="${row#"@@ "}" |
| (( ++ndsc )) |
| ;; |
| esac |
| done < "${index_file}" |
| |
| ${my_test_fx} ${flags} "${pname}" \ |
| && for (( i=0 ; $i < $ndsc ; i++ )) ; do einfo "> ${dsc[$i]}" ; done |
| } |
| |
| # |
| # Is $2 (defaults to $MYSQL_VERSION_ID) at least version $1? |
| # (nice) idea from versionator.eclass |
| # |
| mysql_version_is_at_least() { |
| local want_s=$(stripdots "$1") have_s=$(stripdots "${2:-${MYSQL_VERSION_ID}}") |
| [[ -z "${want_s}" ]] && die "mysql_version_is_at_least missing value to check" |
| [[ ${want_s} -le ${have_s} ]] && return 0 || return 1 |
| } |
| |
| # |
| # To be called on the live filesystem, reassigning symlinks of each MySQL |
| # library to the best version available. |
| # |
| mysql_lib_symlinks() { |
| |
| 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 libname in $( find "${d}" -mindepth 1 -maxdepth 1 -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 |
| if [[ ${CHOST} == *-darwin* ]] ; then |
| # macho: libname.x.y.z.dylib |
| local libbasename=${libnameln%%.*} # libname |
| local libver=${libnameln#${libbasename}} # .x.y.z.dylib |
| libver=${libver%${libsuffix}} # .x.y.z |
| while [[ -n ${libver} ]] && [[ ${maxdots} -lt 6 ]] ; do |
| libnameln="${libbasename}${libver}${libsuffix}" |
| rm -f "${libnameln}" |
| ln -s "${libname}" "${libnameln}" |
| (( ++maxdots )) |
| libver=${libver%.*} |
| done |
| libnameln="${libbasename}${libsuffix}" |
| rm -f "${libnameln}" |
| ln -s "${libname}" "${libnameln}" |
| else |
| # elf: libname.so.x.y.z |
| 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}" |
| fi |
| 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="${EPREFIX}/usr/share/mysql"} |
| MY_SYSCONFDIR=${MY_SYSCONFDIR="${EPREFIX}/etc/mysql"} |
| MY_LOCALSTATEDIR=${MY_LOCALSTATEDIR="${EPREFIX}/var/lib/mysql"} |
| MY_LOGDIR=${MY_LOGDIR="${EPREFIX}/var/log/mysql"} |
| MY_INCLUDEDIR=${MY_INCLUDEDIR="${EPREFIX}/usr/include/mysql"} |
| MY_LIBDIR=${MY_LIBDIR="${EPREFIX}/usr/$(get_libdir)/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}" |
| 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 |
| } |