| 1 |
# Copyright 1999-2012 Gentoo Foundation
|
| 2 |
# Distributed under the terms of the GNU General Public License v2
|
| 3 |
# $Header: /var/cvsroot/gentoo-x86/eclass/Attic/mysql_fx.eclass,v 1.28 2012/01/06 21:32:48 jmbsvicetto Exp $
|
| 4 |
|
| 5 |
# Author: Francesco Riosa (Retired) <vivo@gentoo.org>
|
| 6 |
# Maintainer:
|
| 7 |
# - MySQL Team <mysql-bugs@gentoo.org>
|
| 8 |
# - Luca Longinotti <chtekk@gentoo.org>
|
| 9 |
|
| 10 |
inherit multilib
|
| 11 |
|
| 12 |
#
|
| 13 |
# Helper function, version (integer) may have sections separated by dots
|
| 14 |
# for readability.
|
| 15 |
#
|
| 16 |
stripdots() {
|
| 17 |
local dotver=${1:-"0"}
|
| 18 |
local v=""
|
| 19 |
local ret=0
|
| 20 |
if [[ "${dotver/./}" != "${dotver}" ]] ; then
|
| 21 |
# dotted version number
|
| 22 |
for i in 1000000 10000 100 1 ; do
|
| 23 |
v=${dotver%%\.*}
|
| 24 |
# remove leading zeroes
|
| 25 |
while [[ ${#v} -gt 1 ]] && [[ ${v:0:1} == "0" ]] ; do v=${v#0} ; done
|
| 26 |
# increment integer version number
|
| 27 |
ret=$(( ${v} * ${i} + ${ret} ))
|
| 28 |
if [[ "${dotver}" == "${dotver/\.}" ]] ; then
|
| 29 |
dotver=0
|
| 30 |
else
|
| 31 |
dotver=${dotver#*\.}
|
| 32 |
fi
|
| 33 |
done
|
| 34 |
echo "${ret}"
|
| 35 |
else
|
| 36 |
# already an integer
|
| 37 |
v=${dotver}
|
| 38 |
while [[ ${#v} -gt 1 ]] && [[ ${v:0:1} == "0" ]] ; do v=${v#0} ; done
|
| 39 |
echo "${v}"
|
| 40 |
fi
|
| 41 |
}
|
| 42 |
|
| 43 |
#
|
| 44 |
# Check if a version number falls inside a given range.
|
| 45 |
# The range includes the extremes and must be specified as
|
| 46 |
# "low_version to high_version" i.e. "4.1.2 to 5.1.99.99".
|
| 47 |
# Returns true if inside the range.
|
| 48 |
#
|
| 49 |
mysql_check_version_range() {
|
| 50 |
local lbound="${1%% to *}" ; lbound=$(stripdots "${lbound}")
|
| 51 |
local rbound="${1#* to }" ; rbound=$(stripdots "${rbound}")
|
| 52 |
local my_ver="${2:-"${MYSQL_VERSION_ID}"}"
|
| 53 |
[[ ${lbound} -le ${my_ver} ]] && [[ ${my_ver} -le ${rbound} ]] && return 0
|
| 54 |
return 1
|
| 55 |
}
|
| 56 |
|
| 57 |
#
|
| 58 |
# True if at least one applicable range is found for the patch.
|
| 59 |
#
|
| 60 |
_mysql_test_patch_ver_pn() {
|
| 61 |
local allelements=", version, package name"
|
| 62 |
# So that it fails the directory test if none of them exist
|
| 63 |
local filesdir="/dev/null"
|
| 64 |
for d in "${WORKDIR}/mysql-extras-${MY_EXTRAS_VER}" \
|
| 65 |
"${WORKDIR}/mysql-extras" ; do
|
| 66 |
if [ -d "${d}" ]; then
|
| 67 |
filesdir="${d}"
|
| 68 |
break
|
| 69 |
fi
|
| 70 |
done
|
| 71 |
|
| 72 |
[[ -d "${filesdir}" ]] || die "Source dir must be a directory"
|
| 73 |
local flags=$1 pname=$2
|
| 74 |
if [[ $(( $flags & $(( 1 + 4 + 16 )) )) -eq 21 ]] ; then
|
| 75 |
einfo "using '${pname}'"
|
| 76 |
ln -sf "${filesdir}/${pname}" "${EPATCH_SOURCE}" || die "Couldn't move ${pname}"
|
| 77 |
return 0
|
| 78 |
fi
|
| 79 |
|
| 80 |
[[ $(( $flags & $(( 2 + 4 )) )) -gt 0 ]] \
|
| 81 |
&& allelements="${allelements//", version"}"
|
| 82 |
|
| 83 |
[[ $(( $flags & $(( 8 + 16 )) )) -gt 0 ]] \
|
| 84 |
&& allelements="${allelements//", package name"}"
|
| 85 |
|
| 86 |
[[ -n "${allelements}" ]] && [[ "${flags}" -gt 0 ]] \
|
| 87 |
&& ewarn "QA notice: ${allelements} missing in ${pname} patch"
|
| 88 |
|
| 89 |
return 1
|
| 90 |
}
|
| 91 |
|
| 92 |
#
|
| 93 |
# Parse a "index_file" looking for patches to apply to the
|
| 94 |
# current MySQL version.
|
| 95 |
# If the patch applies, print its description.
|
| 96 |
#
|
| 97 |
mysql_mv_patches() {
|
| 98 |
# So that it fails the directory test if none of them exist
|
| 99 |
local filesdir="/dev/null"
|
| 100 |
if [[ -z "${1}" ]]; then
|
| 101 |
for d in "${WORKDIR}/mysql-extras-${MY_EXTRAS_VER}" \
|
| 102 |
"${WORKDIR}/mysql-extras" ; do
|
| 103 |
if [ -d "${d}" ]; then
|
| 104 |
filesdir="${d}"
|
| 105 |
break
|
| 106 |
fi
|
| 107 |
done
|
| 108 |
[[ -d "${filesdir}" ]] || die "No patches directory found!"
|
| 109 |
fi
|
| 110 |
|
| 111 |
for i in "$1" "${filesdir}/0000_index.txt" "${filesdir}/000_index.txt" ; do
|
| 112 |
if [ -n "$i" -a -f "$i" ]; then
|
| 113 |
local index_file="$i"
|
| 114 |
break
|
| 115 |
fi
|
| 116 |
done
|
| 117 |
|
| 118 |
local my_ver="${2:-"${MYSQL_VERSION_ID}"}"
|
| 119 |
local my_test_fx=${3:-"_mysql_test_patch_ver_pn"}
|
| 120 |
_mysql_mv_patches "${index_file}" "${my_ver}" "${my_test_fx}"
|
| 121 |
}
|
| 122 |
|
| 123 |
_mysql_mv_patches() {
|
| 124 |
local index_file="${1}"
|
| 125 |
local my_ver="${2}"
|
| 126 |
local my_test_fx="${3}"
|
| 127 |
local dsc ndsc=0 i
|
| 128 |
dsc=( )
|
| 129 |
|
| 130 |
# Values for flags are (2^x):
|
| 131 |
# 1 - one patch found
|
| 132 |
# 2 - at least one version range is wrong
|
| 133 |
# 4 - at least one version range is ok
|
| 134 |
# 8 - at least one ${PN} did not match
|
| 135 |
# 16 - at least one ${PN} has been matched
|
| 136 |
local flags=0 pname=""
|
| 137 |
while read row ; do
|
| 138 |
case "${row}" in
|
| 139 |
@patch\ *)
|
| 140 |
[[ -n "${pname}" ]] \
|
| 141 |
&& ${my_test_fx} ${flags} "${pname}" \
|
| 142 |
&& for (( i=0 ; $i < $ndsc ; i++ )) ; do einfo "> ${dsc[$i]}" ; done
|
| 143 |
flags=1 ; ndsc=0 ; dsc=( )
|
| 144 |
pname=${row#"@patch "}
|
| 145 |
;;
|
| 146 |
@ver\ *)
|
| 147 |
if mysql_check_version_range "${row#"@ver "}" "${my_ver}" ; then
|
| 148 |
flags=$(( ${flags} | 4 ))
|
| 149 |
else
|
| 150 |
flags=$(( ${flags} | 2 ))
|
| 151 |
fi
|
| 152 |
;;
|
| 153 |
@pn\ *)
|
| 154 |
if [[ ${row#"@pn "} == "${PN}" ]] ; then
|
| 155 |
flags=$(( ${flags} | 16 ))
|
| 156 |
else
|
| 157 |
flags=$(( ${flags} | 8 ))
|
| 158 |
fi
|
| 159 |
;;
|
| 160 |
# @use\ *) ;;
|
| 161 |
@@\ *)
|
| 162 |
dsc[$ndsc]="${row#"@@ "}"
|
| 163 |
(( ++ndsc ))
|
| 164 |
;;
|
| 165 |
esac
|
| 166 |
done < "${index_file}"
|
| 167 |
|
| 168 |
${my_test_fx} ${flags} "${pname}" \
|
| 169 |
&& for (( i=0 ; $i < $ndsc ; i++ )) ; do einfo "> ${dsc[$i]}" ; done
|
| 170 |
}
|
| 171 |
|
| 172 |
#
|
| 173 |
# Is $2 (defaults to $MYSQL_VERSION_ID) at least version $1?
|
| 174 |
# (nice) idea from versionator.eclass
|
| 175 |
#
|
| 176 |
mysql_version_is_at_least() {
|
| 177 |
local want_s=$(stripdots "$1") have_s=$(stripdots "${2:-${MYSQL_VERSION_ID}}")
|
| 178 |
[[ -z "${want_s}" ]] && die "mysql_version_is_at_least missing value to check"
|
| 179 |
[[ ${want_s} -le ${have_s} ]] && return 0 || return 1
|
| 180 |
}
|
| 181 |
|
| 182 |
#
|
| 183 |
# To be called on the live filesystem, reassigning symlinks of each MySQL
|
| 184 |
# library to the best version available.
|
| 185 |
#
|
| 186 |
mysql_lib_symlinks() {
|
| 187 |
|
| 188 |
local d dirlist maxdots libname libnameln libsuffix reldir
|
| 189 |
libsuffix=$(get_libname)
|
| 190 |
|
| 191 |
einfo "libsuffix = ${libsuffix}"
|
| 192 |
einfo "Updating MySQL libraries symlinks"
|
| 193 |
|
| 194 |
reldir="${1}"
|
| 195 |
pushd "${reldir}/usr/$(get_libdir)" &> /dev/null
|
| 196 |
|
| 197 |
# dirlist must contain the less significative directory left
|
| 198 |
dirlist="mysql"
|
| 199 |
|
| 200 |
# waste some time in removing and recreating symlinks
|
| 201 |
for d in $dirlist ; do
|
| 202 |
for libname in $( find "${d}" -mindepth 1 -maxdepth 1 -name "*${libsuffix}*" -and -not -type "l" 2>/dev/null ) ; do
|
| 203 |
# maxdot is a limit versus infinite loop
|
| 204 |
maxdots=0
|
| 205 |
libnameln=${libname##*/}
|
| 206 |
# loop in version of the library to link it, similar to how
|
| 207 |
# libtool works
|
| 208 |
if [[ ${CHOST} == *-darwin* ]] ; then
|
| 209 |
# macho: libname.x.y.z.dylib
|
| 210 |
local libbasename=${libnameln%%.*} # libname
|
| 211 |
local libver=${libnameln#${libbasename}} # .x.y.z.dylib
|
| 212 |
libver=${libver%${libsuffix}} # .x.y.z
|
| 213 |
while [[ -n ${libver} ]] && [[ ${maxdots} -lt 6 ]] ; do
|
| 214 |
libnameln="${libbasename}${libver}${libsuffix}"
|
| 215 |
rm -f "${libnameln}"
|
| 216 |
ln -s "${libname}" "${libnameln}"
|
| 217 |
(( ++maxdots ))
|
| 218 |
libver=${libver%.*}
|
| 219 |
done
|
| 220 |
libnameln="${libbasename}${libsuffix}"
|
| 221 |
rm -f "${libnameln}"
|
| 222 |
ln -s "${libname}" "${libnameln}"
|
| 223 |
else
|
| 224 |
# elf: libname.so.x.y.z
|
| 225 |
while [[ ${libnameln:0-3} != '${libsuffix}' ]] && [[ ${maxdots} -lt 6 ]] ; do
|
| 226 |
rm -f "${libnameln}"
|
| 227 |
ln -s "${libname}" "${libnameln}"
|
| 228 |
(( ++maxdots ))
|
| 229 |
libnameln="${libnameln%.*}"
|
| 230 |
done
|
| 231 |
rm -f "${libnameln}"
|
| 232 |
ln -s "${libname}" "${libnameln}"
|
| 233 |
fi
|
| 234 |
done
|
| 235 |
done
|
| 236 |
|
| 237 |
popd &> /dev/null
|
| 238 |
}
|
| 239 |
|
| 240 |
# @FUNCTION: mysql_init_vars
|
| 241 |
# @DESCRIPTION:
|
| 242 |
# void mysql_init_vars()
|
| 243 |
# Initialize global variables
|
| 244 |
# 2005-11-19 <vivo@gentoo.org>
|
| 245 |
mysql_init_vars() {
|
| 246 |
MY_SHAREDSTATEDIR=${MY_SHAREDSTATEDIR="${EPREFIX}/usr/share/mysql"}
|
| 247 |
MY_SYSCONFDIR=${MY_SYSCONFDIR="${EPREFIX}/etc/mysql"}
|
| 248 |
MY_LOCALSTATEDIR=${MY_LOCALSTATEDIR="${EPREFIX}/var/lib/mysql"}
|
| 249 |
MY_LOGDIR=${MY_LOGDIR="${EPREFIX}/var/log/mysql"}
|
| 250 |
MY_INCLUDEDIR=${MY_INCLUDEDIR="${EPREFIX}/usr/include/mysql"}
|
| 251 |
MY_LIBDIR=${MY_LIBDIR="${EPREFIX}/usr/$(get_libdir)/mysql"}
|
| 252 |
|
| 253 |
if [[ -z "${MY_DATADIR}" ]] ; then
|
| 254 |
MY_DATADIR=""
|
| 255 |
if [[ -f "${MY_SYSCONFDIR}/my.cnf" ]] ; then
|
| 256 |
MY_DATADIR=`"my_print_defaults" mysqld 2>/dev/null \
|
| 257 |
| sed -ne '/datadir/s|^--datadir=||p' \
|
| 258 |
| tail -n1`
|
| 259 |
if [[ -z "${MY_DATADIR}" ]] ; then
|
| 260 |
MY_DATADIR=`grep ^datadir "${MY_SYSCONFDIR}/my.cnf" \
|
| 261 |
| sed -e 's/.*=\s*//' \
|
| 262 |
| tail -n1`
|
| 263 |
fi
|
| 264 |
fi
|
| 265 |
if [[ -z "${MY_DATADIR}" ]] ; then
|
| 266 |
MY_DATADIR="${MY_LOCALSTATEDIR}"
|
| 267 |
einfo "Using default MY_DATADIR"
|
| 268 |
fi
|
| 269 |
elog "MySQL MY_DATADIR is ${MY_DATADIR}"
|
| 270 |
|
| 271 |
if [[ -z "${PREVIOUS_DATADIR}" ]] ; then
|
| 272 |
if [[ -e "${MY_DATADIR}" ]] ; then
|
| 273 |
# If you get this and you're wondering about it, see bug #207636
|
| 274 |
elog "MySQL datadir found in ${MY_DATADIR}"
|
| 275 |
elog "A new one will not be created."
|
| 276 |
PREVIOUS_DATADIR="yes"
|
| 277 |
else
|
| 278 |
PREVIOUS_DATADIR="no"
|
| 279 |
fi
|
| 280 |
export PREVIOUS_DATADIR
|
| 281 |
fi
|
| 282 |
else
|
| 283 |
if [[ ${EBUILD_PHASE} == "config" ]]; then
|
| 284 |
local new_MY_DATADIR
|
| 285 |
new_MY_DATADIR=`"my_print_defaults" mysqld 2>/dev/null \
|
| 286 |
| sed -ne '/datadir/s|^--datadir=||p' \
|
| 287 |
| tail -n1`
|
| 288 |
|
| 289 |
if [[ ( -n "${new_MY_DATADIR}" ) && ( "${new_MY_DATADIR}" != "${MY_DATADIR}" ) ]]; then
|
| 290 |
ewarn "MySQL MY_DATADIR has changed"
|
| 291 |
ewarn "from ${MY_DATADIR}"
|
| 292 |
ewarn "to ${new_MY_DATADIR}"
|
| 293 |
fi
|
| 294 |
fi
|
| 295 |
fi
|
| 296 |
|
| 297 |
if [ "${MY_SOURCEDIR:-unset}" == "unset" ]; then
|
| 298 |
MY_SOURCEDIR=${SERVER_URI##*/}
|
| 299 |
MY_SOURCEDIR=${MY_SOURCEDIR%.tar*}
|
| 300 |
fi
|
| 301 |
|
| 302 |
export MY_SHAREDSTATEDIR MY_SYSCONFDIR
|
| 303 |
export MY_LIBDIR MY_LOCALSTATEDIR MY_LOGDIR
|
| 304 |
export MY_INCLUDEDIR MY_DATADIR MY_SOURCEDIR
|
| 305 |
}
|