1 # Copyright 1999-2015 Gentoo Foundation
2 # Distributed under the terms of the GNU General Public License v2
5 # @ECLASS: mysql-v2.eclass
8 # - MySQL Team <mysql-bugs@gentoo.org>
9 # - Robin H. Johnson <robbat2@gentoo.org>
10 # - Jorge Manuel B. S. Vicetto <jmbsvicetto@gentoo.org>
11 # - Brian Evans <grknight@gentoo.org>
12 # @BLURB: This eclass provides most of the functions for mysql ebuilds
14 # The mysql-v2.eclass is the base eclass to build the mysql and
15 # alternative projects (mariadb and percona) ebuilds.
16 # This eclass uses the mysql-autotools and mysql-cmake eclasses for the
17 # specific bits related to the build system.
18 # It provides the src_unpack, src_prepare, src_configure, src_compile,
19 # src_install, pkg_preinst, pkg_postinst, pkg_config and pkg_postrm
22 # @ECLASS-VARIABLE: BUILD
24 # Build type of the mysql version
29 BUILD_INHERIT="mysql-cmake"
32 BUILD_INHERIT="mysql-autotools"
34 WANT_AUTOCONF="latest"
35 WANT_AUTOMAKE="latest"
38 die "${BUILD} is not a valid build system for mysql"
44 # @ECLASS-VARIABLE: MYSQL_EXTRAS_VER
46 # The version of the MYSQL_EXTRAS repo to use to build mysql
47 # Use "none" to disable it's use
48 [[ ${MY_EXTRAS_VER} == "live" ]] && MYSQL_EXTRAS="git-r3"
50 inherit eutils flag-o-matic ${MYSQL_EXTRAS} ${BUILD_INHERIT} mysql_fx versionator toolchain-funcs user
53 # Supported EAPI versions and export functions
58 *) die "Unsupported EAPI: ${EAPI}" ;;
61 EXPORT_FUNCTIONS pkg_setup src_unpack src_prepare src_configure src_compile src_install pkg_preinst pkg_postinst pkg_config pkg_postrm
67 # Shorten the path because the socket path length must be shorter than 107 chars
68 # and we will run a mysql server during test phase
71 [[ ${MY_EXTRAS_VER} == "latest" ]] && MY_EXTRAS_VER="20090228-0714Z"
72 if [[ ${MY_EXTRAS_VER} == "live" ]]; then
73 EGIT_REPO_URI="git://anongit.gentoo.org/proj/mysql-extras.git"
74 EGIT_CHECKOUT_DIR=${WORKDIR}/mysql-extras
75 EGIT_CLONE_TYPE=shallow
78 # @ECLASS-VARIABLE: MYSQL_PV_MAJOR
80 # Upstream MySQL considers the first two parts of the version number to be the
81 # major version. Upgrades that change major version should always run
83 MYSQL_PV_MAJOR="$(get_version_component_range 1-2 ${PV})"
85 # Cluster is a special case...
86 if [[ ${PN} == "mysql-cluster" ]]; then
88 6.1*|7.0*|7.1*) MYSQL_PV_MAJOR=5.1 ;;
89 7.2*) MYSQL_PV_MAJOR=5.5 ;;
90 7.3*) MYSQL_PV_MAJOR=5.6 ;;
94 # MariaDB has left the numbering schema but keeping compatibility
95 if [[ ${PN} == "mariadb" || ${PN} == "mariadb-galera" ]]; then
97 10.0*|10.1*) MYSQL_PV_MAJOR="5.6" ;;
101 # @ECLASS-VARIABLE: MYSQL_VERSION_ID
103 # MYSQL_VERSION_ID will be:
104 # major * 10e6 + minor * 10e4 + micro * 10e2 + gentoo revision number, all [0..99]
105 # This is an important part, because many of the choices the MySQL ebuild will do
106 # depend on this variable.
107 # In particular, the code below transforms a $PVR like "5.0.18-r3" in "5001803"
108 # We also strip off upstream's trailing letter that they use to respin tarballs
111 tpv=( ${tpv//[-._]/ } ) ; tpv[3]="${PVR:${#PV}}" ; tpv[3]="${tpv[3]##*-r}"
112 for vatom in 0 1 2 3 ; do
114 tpv[${vatom}]="00${tpv[${vatom}]}"
115 MYSQL_VERSION_ID="${MYSQL_VERSION_ID}${tpv[${vatom}]:0-2}"
117 # strip leading "0" (otherwise it's considered an octal number by BASH)
118 MYSQL_VERSION_ID=${MYSQL_VERSION_ID##"0"}
120 # This eclass should only be used with at least mysql-5.1.50
121 mysql_version_is_at_least "5.1.50" || die "This eclass should only be used with >=mysql-5.1.50"
123 # @ECLASS-VARIABLE: XTRADB_VER
126 # Version of the XTRADB storage engine
128 # @ECLASS-VARIABLE: PERCONA_VER
131 # Designation by PERCONA for a MySQL version to apply an XTRADB release
133 # Work out the default SERVER_URI correctly
134 if [[ -z ${SERVER_URI} ]]; then
135 [[ -z ${MY_PV} ]] && MY_PV="${PV//_/-}"
136 if [[ ${PN} == "mariadb" || ${PN} == "mariadb-galera" ]]; then
137 # Beginning with 5.5, MariaDB stopped putting beta, alpha or rc on their tarball names
138 mysql_version_is_at_least "5.5" && MARIA_FULL_PV=$(get_version_component_range 1-3) || \
139 MARIA_FULL_PV=$(replace_version_separator 3 '-' ${MY_PV})
140 MARIA_FULL_P="${PN}-${MARIA_FULL_PV}"
142 http://ftp.osuosl.org/pub/mariadb/${MARIA_FULL_P}/kvm-tarbake-jaunty-x86/${MARIA_FULL_P}.tar.gz
143 http://ftp.osuosl.org/pub/mariadb/${MARIA_FULL_P}/source/${MARIA_FULL_P}.tar.gz
144 http://mirror.jmu.edu/pub/mariadb/${MARIA_FULL_P}/kvm-tarbake-jaunty-x86/${MARIA_FULL_P}.tar.gz
145 http://mirrors.coreix.net/mariadb/${MARIA_FULL_P}/kvm-tarbake-jaunty-x86/${MARIA_FULL_P}.tar.gz
146 http://mirrors.syringanetworks.net/mariadb/${MARIA_FULL_P}/kvm-tarbake-jaunty-x86/${MARIA_FULL_P}.tar.gz
147 http://mirrors.fe.up.pt/pub/mariadb/${MARIA_FULL_P}/kvm-tarbake-jaunty-x86/${MARIA_FULL_P}.tar.gz
148 http://mirror2.hs-esslingen.de/mariadb/${MARIA_FULL_P}/kvm-tarbake-jaunty-x86/${MARIA_FULL_P}.tar.gz
150 if [[ ${PN} == "mariadb-galera" ]]; then
151 MY_SOURCEDIR="${PN%%-galera}-${MARIA_FULL_PV}"
153 elif [[ ${PN} == "percona-server" ]]; then
154 PERCONA_PN="Percona-Server"
155 MIRROR_PV=$(get_version_component_range 1-2 ${PV})
156 MY_PV=$(get_version_component_range 1-3 ${PV})
157 PERCONA_RELEASE=$(get_version_component_range 4-5 ${PV})
158 PERCONA_RC=$(get_version_component_range 6 ${PV})
159 SERVER_URI="http://www.percona.com/redir/downloads/${PERCONA_PN}-${MIRROR_PV}/${PERCONA_PN}-${MY_PV}-${PERCONA_RC}${PERCONA_RELEASE}/source/tarball/${PN}-${MY_PV}-${PERCONA_RC}${PERCONA_RELEASE}.tar.gz"
160 # http://www.percona.com/redir/downloads/Percona-Server-5.5/LATEST/source/tarball/Percona-Server-5.5.30-30.2.tar.gz
161 # http://www.percona.com/redir/downloads/Percona-Server-5.6/Percona-Server-5.6.13-rc60.5/source/tarball/Percona-Server-5.6.13-rc60.5.tar.gz
163 if [[ "${PN}" == "mysql-cluster" ]] ; then
164 URI_DIR="MySQL-Cluster"
165 URI_FILE="mysql-cluster-gpl"
170 URI_A="${URI_FILE}-${MY_PV}.tar.gz"
171 MIRROR_PV=$(get_version_component_range 1-2 ${PV})
172 # Recently upstream switched to an archive site, and not on mirrors
173 SERVER_URI="http://downloads.mysql.com/archives/${URI_FILE}-${MIRROR_PV}/${URI_A}
174 https://downloads.skysql.com/files/${URI_FILE}-${MIRROR_PV}/${URI_A}
175 mirror://mysql/Downloads/${URI_DIR}-${PV%.*}/${URI_A}"
179 # Define correct SRC_URIs
180 SRC_URI="${SERVER_URI}"
182 # Gentoo patches to MySQL
183 if [[ ${MY_EXTRAS_VER} != "live" && ${MY_EXTRAS_VER} != "none" ]]; then
185 mirror://gentoo/mysql-extras-${MY_EXTRAS_VER}.tar.bz2
186 http://g3nt8.org/patches/mysql-extras-${MY_EXTRAS_VER}.tar.bz2
187 https://dev.gentoo.org/~robbat2/distfiles/mysql-extras-${MY_EXTRAS_VER}.tar.bz2
188 https://dev.gentoo.org/~jmbsvicetto/distfiles/mysql-extras-${MY_EXTRAS_VER}.tar.bz2
189 https://dev.gentoo.org/~grknight/distfiles/mysql-extras-${MY_EXTRAS_VER}.tar.bz2"
192 DESCRIPTION="A fast, multi-threaded, multi-user SQL database server"
193 HOMEPAGE="http://www.mysql.com/"
194 if [[ ${PN} == "mariadb" ]]; then
195 HOMEPAGE="http://mariadb.org/"
196 DESCRIPTION="An enhanced, drop-in replacement for MySQL"
198 if [[ ${PN} == "mariadb-galera" ]]; then
199 HOMEPAGE="http://mariadb.org/"
200 DESCRIPTION="An enhanced, drop-in replacement for MySQL with Galera Replication"
202 if [[ ${PN} == "percona-server" ]]; then
203 HOMEPAGE="http://www.percona.com/software/percona-server"
204 DESCRIPTION="An enhanced, drop-in replacement for MySQL from the Percona team"
211 IUSE="big-tables debug embedded minimal +perl selinux ssl static test"
214 IUSE="debug embedded minimal +perl selinux ssl static static-libs test"
219 IUSE="${IUSE} latin1 extraengine cluster max-idx-128 +community profiling"
221 # This probably could be simplified, but the syntax would have to be just right
222 if [[ ${PN} == "mariadb" || ${PN} == "mariadb-galera" ]] && \
223 mysql_version_is_at_least "5.5" ; then
224 IUSE="bindist ${IUSE}"
225 RESTRICT="${RESTRICT} !bindist? ( bindist )"
226 elif [[ ${PN} == "mysql" || ${PN} == "percona-server" ]] && \
227 mysql_check_version_range "5.5.37 to 5.6.11.99" ; then
228 IUSE="bindist ${IUSE}"
229 RESTRICT="${RESTRICT} !bindist? ( bindist )"
230 elif [[ ${PN} == "mysql-cluster" ]] && \
231 mysql_check_version_range "7.2 to 7.2.99.99" ; then
232 IUSE="bindist ${IUSE}"
233 RESTRICT="${RESTRICT} !bindist? ( bindist )"
236 if [[ ${PN} == "mariadb" || ${PN} == "mariadb-galera" ]]; then
237 mysql_check_version_range "5.1.38 to 5.3.99" && IUSE="${IUSE} libevent"
238 mysql_version_is_at_least "5.2" && IUSE="${IUSE} oqgraph" && \
239 REQUIRED_USE="${REQUIRED_USE} minimal? ( !oqgraph )"
240 mysql_version_is_at_least "5.2.5" && IUSE="${IUSE} sphinx" && \
241 REQUIRED_USE="${REQUIRED_USE} minimal? ( !sphinx )"
242 mysql_version_is_at_least "5.2.10" && IUSE="${IUSE} pam"
243 # 5.5.33 and 10.0.5 add TokuDB. Authors strongly recommend jemalloc or perfomance suffers
244 mysql_version_is_at_least "10.0.5" && IUSE="${IUSE} tokudb odbc xml" && \
245 REQUIRED_USE="${REQUIRED_USE} odbc? ( extraengine ) xml? ( extraengine ) tokudb? ( jemalloc )"
246 mysql_check_version_range "5.5.33 to 5.5.99" && IUSE="${IUSE} tokudb" && \
247 REQUIRED_USE="${REQUIRED_USE} tokudb? ( jemalloc )"
250 if mysql_version_is_at_least "5.5"; then
251 REQUIRED_USE="${REQUIRED_USE} tcmalloc? ( !jemalloc ) jemalloc? ( !tcmalloc )"
252 IUSE="${IUSE} jemalloc tcmalloc"
255 if mysql_version_is_at_least "5.5.7"; then
256 IUSE="${IUSE} systemtap"
259 if [[ ${PN} == "percona-server" ]]; then
260 mysql_version_is_at_least "5.5.10" && IUSE="${IUSE} pam"
263 REQUIRED_USE="${REQUIRED_USE} minimal? ( !cluster !extraengine !embedded ) static? ( !ssl )"
269 # Be warned, *DEPEND are version-dependant
270 # These are used for both runtime and compiletime
272 ssl? ( >=dev-libs/openssl-0.9.6d:0 )
273 kernel_linux? ( sys-process/procps )
275 >=sys-apps/texinfo-4.7-r1
276 >=sys-libs/zlib-1.2.3
278 # TODO: add this as a dep if it is moved from the overlay
279 # !dev-db/mariadb-native-client[mysqlcompat]
281 # dev-db/mysql-5.6.12+ only works with dev-libs/libedit
282 # This probably could be simplified
283 if [[ ${PN} == "mysql" || ${PN} == "percona-server" ]] && \
284 mysql_version_is_at_least "5.6.12" ; then
285 DEPEND="${DEPEND} dev-libs/libedit"
286 elif [[ ${PN} == "mysql-cluster" ]] && mysql_version_is_at_least "7.3"; then
287 DEPEND="${DEPEND} dev-libs/libedit"
289 if mysql_version_is_at_least "5.5" ; then
290 DEPEND="${DEPEND} !bindist? ( >=sys-libs/readline-4.1:0 )"
292 DEPEND="${DEPEND} >=sys-libs/readline-4.1:0"
296 if [[ ${PN} == "mariadb" || ${PN} == "mariadb-galera" ]] ; then
297 mysql_check_version_range "5.1.38 to 5.3.99" && DEPEND="${DEPEND} libevent? ( >=dev-libs/libevent-1.4 )"
298 mysql_version_is_at_least "5.2" && DEPEND="${DEPEND} oqgraph? ( >=dev-libs/boost-1.40.0 )"
299 mysql_version_is_at_least "5.2.10" && DEPEND="${DEPEND} !minimal? ( pam? ( virtual/pam ) )"
300 # Bug 441700 MariaDB >=5.3 include custom mytop
301 mysql_version_is_at_least "5.3" && DEPEND="${DEPEND} perl? ( !dev-db/mytop )"
302 if mysql_version_is_at_least "10.0.5" ; then
304 odbc? ( dev-db/unixODBC )
305 xml? ( dev-libs/libxml2 )
308 mysql_version_is_at_least "10.0.7" && DEPEND="${DEPEND} oqgraph? ( dev-libs/judy )"
309 if mysql_version_is_at_least "10.0.9" ; then
310 DEPEND="${DEPEND} >=dev-libs/libpcre-8.35"
314 # Having different flavours at the same time is not a good idea
315 for i in "mysql" "mariadb" "mariadb-galera" "percona-server" "mysql-cluster" ; do
316 [[ ${i} == ${PN} ]] ||
317 DEPEND="${DEPEND} !dev-db/${i}"
320 if mysql_version_is_at_least "5.5.7" ; then
322 jemalloc? ( dev-libs/jemalloc[static-libs?] )
323 tcmalloc? ( dev-util/google-perftools )
324 >=sys-libs/zlib-1.2.3[static-libs?]
325 ssl? ( >=dev-libs/openssl-0.9.6d[static-libs?] )
326 systemtap? ( >=dev-util/systemtap-1.3 )
327 kernel_linux? ( dev-libs/libaio )
331 if [[ ${PN} == "mysql-cluster" ]] ; then
332 # TODO: This really should include net-misc/memcached
333 # but the package does not install the files it seeks.
334 mysql_version_is_at_least "7.2.3" && \
335 DEPEND="${DEPEND} dev-libs/libevent"
338 # prefix: first need to implement something for #196294
340 !minimal? ( !prefix? ( dev-db/mysql-init-scripts ) )
341 selinux? ( sec-policy/selinux-mysql )
344 if [[ ${PN} == "mariadb" || ${PN} == "mariadb-galera" ]] ; then
345 # Bug 455016 Add dependencies of mytop
346 if mysql_version_is_at_least "5.3" ; then
349 virtual/perl-Getopt-Long
351 virtual/perl-Term-ANSIColor
352 virtual/perl-Time-HiRes
358 if [[ ${PN} == "mariadb-galera" ]] ; then
359 # The wsrep API version must match between the ebuild and sys-cluster/galera.
360 # This will be indicated by WSREP_REVISION in the ebuild and the first number
361 # in the version of sys-cluster/galera
363 =sys-cluster/galera-${WSREP_REVISION}*
367 if [[ ${PN} == "mysql-cluster" ]] ; then
368 mysql_version_is_at_least "7.2.9" && RDEPEND="${RDEPEND} java? ( >=virtual/jre-1.6 )" && \
369 DEPEND="${DEPEND} java? ( >=virtual/jdk-1.6 )"
376 DEPEND="${DEPEND} static? ( sys-libs/ncurses[static-libs] )"
379 DEPEND="${DEPEND} >=dev-util/cmake-2.4.3"
382 if mysql_version_is_at_least "5.5.8" ; then
383 DEPEND="${DEPEND} >=dev-util/cmake-2.6.3"
386 # dev-perl/DBD-mysql is needed by some scripts installed by MySQL
387 PDEPEND="perl? ( >=dev-perl/DBD-mysql-2.9004 )"
389 # For other stuff to bring us in
390 PDEPEND="${PDEPEND} ~virtual/mysql-${MYSQL_PV_MAJOR}"
396 # MariaDB has integrated PBXT until it was dropped in version 5.5.33
397 # PBXT_VERSION means that we have a PBXT patch for this PV
398 # PBXT was only introduced after 5.1.12
399 pbxt_patch_available() {
400 [[ ${PN} != "mariadb" && ${PN} != "mariadb-galera" && ( -n "${PBXT_VERSION}" ) ]]
405 pbxt_patch_available || [[ ${PN} == "mariadb" || ${PN} == "mariadb-galera" ]] && mysql_check_version_range "5.1 to 5.5.32"
409 # Get the percona tarball if XTRADB_VER and PERCONA_VER are both set
410 # MariaDB has integrated XtraDB
411 # XTRADB_VERS means that we have a XTRADB patch for this PV
412 # XTRADB was only introduced after 5.1.26
413 xtradb_patch_available() {
414 [[ ${PN} != "mariadb" && ${PN} != "mariadb-galera"
415 && ( -n "${XTRADB_VER}" ) && ( -n "${PERCONA_VER}" ) ]]
419 if pbxt_patch_available; then
421 PBXT_P="pbxt-${PBXT_VERSION}"
422 PBXT_SRC_URI="http://www.primebase.org/download/${PBXT_P}.tar.gz mirror://sourceforge/pbxt/${PBXT_P}.tar.gz"
423 SRC_URI="${SRC_URI} pbxt? ( ${PBXT_SRC_URI} )"
426 # PBXT_NEWSTYLE means pbxt is in storage/ and gets enabled as other plugins
427 # vs. built outside the dir
428 if pbxt_available; then
432 REQUIRED_USE="${REQUIRED_USE} pbxt? ( !embedded ) "
435 if xtradb_patch_available; then
436 XTRADB_P="percona-xtradb-${XTRADB_VER}"
437 XTRADB_SRC_URI_COMMON="${PERCONA_VER}/source/${XTRADB_P}.tar.gz"
438 XTRADB_SRC_B1="http://www.percona.com/"
439 XTRADB_SRC_B2="${XTRADB_SRC_B1}/percona-builds/"
440 XTRADB_SRC_URI1="${XTRADB_SRC_B2}/Percona-Server/Percona-Server-${XTRADB_SRC_URI_COMMON}"
441 XTRADB_SRC_URI2="${XTRADB_SRC_B2}/xtradb/${XTRADB_SRC_URI_COMMON}"
442 XTRADB_SRC_URI3="${XTRADB_SRC_B1}/${PN}/xtradb/${XTRADB_SRC_URI_COMMON}"
443 SRC_URI="${SRC_URI} xtradb? ( ${XTRADB_SRC_URI1} ${XTRADB_SRC_URI2} ${XTRADB_SRC_URI3} )"
444 IUSE="${IUSE} xtradb"
445 REQUIRED_USE="${REQUIRED_USE} xtradb? ( !embedded ) "
452 # @FUNCTION: mysql-v2_disable_test
454 # Helper function to disable specific tests.
455 mysql-v2_disable_test() {
456 ${BUILD_INHERIT}_disable_test "$@"
459 # @FUNCTION: mysql-v2_configure_minimal
461 # Helper function to configure minimal build
462 configure_minimal() {
463 ${BUILD_INHERIT}_configure_minimal "$@"
466 # @FUNCTION: mysql-v2_configure_common
468 # Helper function to configure common builds
470 ${BUILD_INHERIT}_configure_common "$@"
477 # @FUNCTION: mysql-v2_pkg_setup
479 # Perform some basic tests and tasks during pkg_setup phase:
480 # die if FEATURES="test", USE="-minimal" and not using FEATURES="userpriv"
481 # check for conflicting use flags
482 # create new user and group for mysql
483 # warn about deprecated features
484 mysql-v2_pkg_setup() {
486 if has test ${FEATURES} ; then
487 if ! use minimal ; then
488 if ! has userpriv ${FEATURES} ; then
489 eerror "Testing with FEATURES=-userpriv is no longer supported by upstream. Tests MUST be run as non-root."
494 # Check for USE flag problems in pkg_setup
495 if ! mysql_version_is_at_least "5.2" && use debug ; then
496 # Also in package.use.mask
497 die "Bug #344885: Upstream has broken USE=debug for 5.1 series >=5.1.51"
500 # This should come after all of the die statements
501 enewgroup mysql 60 || die "problem adding 'mysql' group"
502 enewuser mysql 60 -1 /dev/null mysql || die "problem adding 'mysql' user"
504 if use cluster && [[ "${PN}" != "mysql-cluster" ]]; then
505 ewarn "Upstream has noted that the NDB cluster support in the 5.0 and"
506 ewarn "5.1 series should NOT be put into production. In the near"
507 ewarn "future, it will be disabled from building."
510 if [[ ${PN} == "mysql-cluster" ]] ; then
511 mysql_version_is_at_least "7.2.9" && java-pkg-opt-2_pkg_setup
514 if use_if_iuse tokudb && [[ $(gcc-major-version) -lt 4 || $(gcc-major-version) -eq 4 && $(gcc-minor-version) -lt 7 ]] ; then
515 eerror "${PN} with tokudb needs to be built with gcc-4.7 or later."
516 eerror "Please use gcc-config to switch to gcc-4.7 or later version."
522 # @FUNCTION: mysql-v2_src_unpack
524 # Unpack the source code
525 mysql-v2_src_unpack() {
527 # Initialize the proper variables first
532 [[ "${MY_EXTRAS_VER}" == "live" ]] && S="${WORKDIR}/mysql-extras" git-r3_src_unpack
534 mv -f "${WORKDIR}/${MY_SOURCEDIR}" "${S}"
537 # @FUNCTION: mysql-v2_src_prepare
539 # Apply patches to the source code and remove unneeded bundled libs.
540 mysql-v2_src_prepare() {
541 ${BUILD_INHERIT}_src_prepare "$@"
542 if [[ ${PN} == "mysql-cluster" ]] ; then
543 mysql_version_is_at_least "7.2.9" && java-pkg-opt-2_src_prepare
547 # @FUNCTION: mysql-v2_src_configure
549 # Configure mysql to build the code for Gentoo respecting the use flags.
550 mysql-v2_src_configure() {
551 ${BUILD_INHERIT}_src_configure "$@"
554 # @FUNCTION: mysql-v2_src_compile
556 # Compile the mysql code.
557 mysql-v2_src_compile() {
558 ${BUILD_INHERIT}_src_compile "$@"
561 # @FUNCTION: mysql-v2_src_install
564 mysql-v2_src_install() {
565 ${BUILD_INHERIT}_src_install "$@"
568 # @FUNCTION: mysql-v2_pkg_preinst
570 # Create the user and groups for mysql - die if that fails.
571 mysql-v2_pkg_preinst() {
572 if [[ ${PN} == "mysql-cluster" ]] ; then
573 mysql_version_is_at_least "7.2.9" && java-pkg-opt-2_pkg_preinst
575 enewgroup mysql 60 || die "problem adding 'mysql' group"
576 enewuser mysql 60 -1 /dev/null mysql || die "problem adding 'mysql' user"
579 # @FUNCTION: mysql-v2_pkg_postinst
581 # Run post-installation tasks:
582 # create the dir for logfiles if non-existant
583 # touch the logfiles and secure them
585 # issue required steps for optional features
586 # issue deprecation warnings
587 mysql-v2_pkg_postinst() {
589 # Make sure the vars are correctly initialized
592 # Check FEATURES="collision-protect" before removing this
593 [[ -d "${ROOT}${MY_LOGDIR}" ]] || install -d -m0750 -o mysql -g mysql "${ROOT}${MY_LOGDIR}"
595 # Secure the logfiles
596 touch "${ROOT}${MY_LOGDIR}"/mysql.{log,err}
597 chown mysql:mysql "${ROOT}${MY_LOGDIR}"/mysql*
598 chmod 0660 "${ROOT}${MY_LOGDIR}"/mysql*
600 # Minimal builds don't have the MySQL server
601 if ! use minimal ; then
602 docinto "support-files"
604 support-files/my-*.cnf \
605 support-files/magic \
606 support-files/ndb-config-2-node.ini
608 [[ -f "${script}" ]] \
613 for script in scripts/mysql* ; do
614 if [[ -f "${script}" && "${script%.sh}" == "${script}" ]]; then
619 if [[ ${PN} == "mariadb" || ${PN} == "mariadb-galera" ]] ; then
620 if use_if_iuse pam ; then
622 elog "This install includes the PAM authentication plugin."
623 elog "To activate and configure the PAM plugin, please read:"
624 elog "https://kb.askmonty.org/en/pam-authentication-plugin/"
630 elog "You might want to run:"
631 elog "\"emerge --config =${CATEGORY}/${PF}\""
632 elog "if this is a new install."
636 elog "If you are upgrading major versions, you should run the"
637 elog "mysql_upgrade tool."
640 if [[ ${PN} == "mariadb-galera" ]] ; then
642 elog "Be sure to edit the my.cnf file to activate your cluster settings."
643 elog "This should be done after running \"emerge --config =${CATEGORY}/${PF}\""
644 elog "The first time the cluster is activated, you should add"
645 elog "--wsrep-new-cluster to the options in /etc/conf.d/mysql for one node."
646 elog "This option should then be removed for subsequent starts."
651 if use_if_iuse pbxt ; then
652 elog "Note: PBXT is now statically built when enabled."
654 elog "If, you previously installed as a plugin and "
655 elog "you cannot start the MySQL server,"
656 elog "remove the ${MY_DATADIR}/mysql/plugin.* files, then"
657 elog "use the MySQL upgrade script to restore the table"
658 elog "or execute the following SQL command:"
659 elog " CREATE TABLE IF NOT EXISTS plugin ("
660 elog " name char(64) binary DEFAULT '' NOT NULL,"
661 elog " dl char(128) DEFAULT '' NOT NULL,"
662 elog " PRIMARY KEY (name)"
663 elog " ) CHARACTER SET utf8 COLLATE utf8_bin;"
667 # @FUNCTION: mysql-v2_getopt
669 # Use my_print_defaults to extract specific config options
671 local mypd="${EROOT}"/usr/bin/my_print_defaults
674 "${mypd}" $section | sed -n "/^${flag}/p"
677 # @FUNCTION: mysql-v2_getoptval
679 # Use my_print_defaults to extract specific config options
680 mysql-v2_getoptval() {
681 local mypd="${EROOT}"/usr/bin/my_print_defaults
684 "${mypd}" $section | sed -n "/^${flag}/s,${flag},,gp"
687 # @FUNCTION: mysql-v2_pkg_config
689 # Configure mysql environment.
690 mysql-v2_pkg_config() {
692 local old_MY_DATADIR="${MY_DATADIR}"
693 local old_HOME="${HOME}"
694 # my_print_defaults needs to read stuff in $HOME/.my.cnf
695 export HOME=${EPREFIX}/root
697 # Make sure the vars are correctly initialized
700 [[ -z "${MY_DATADIR}" ]] && die "Sorry, unable to find MY_DATADIR"
702 if built_with_use ${CATEGORY}/${PN} minimal ; then
703 die "Minimal builds do NOT include the MySQL server"
706 if [[ ( -n "${MY_DATADIR}" ) && ( "${MY_DATADIR}" != "${old_MY_DATADIR}" ) ]]; then
707 local MY_DATADIR_s="${ROOT}/${MY_DATADIR}"
708 MY_DATADIR_s="${MY_DATADIR_s%%/}"
709 local old_MY_DATADIR_s="${ROOT}/${old_MY_DATADIR}"
710 old_MY_DATADIR_s="${old_MY_DATADIR_s%%/}"
712 if [[ ( -d "${old_MY_DATADIR_s}" ) && ( "${old_MY_DATADIR_s}" != / ) ]]; then
713 if [[ -d "${MY_DATADIR_s}" ]]; then
714 ewarn "Both ${old_MY_DATADIR_s} and ${MY_DATADIR_s} exist"
715 ewarn "Attempting to use ${MY_DATADIR_s} and preserving ${old_MY_DATADIR_s}"
717 elog "Moving MY_DATADIR from ${old_MY_DATADIR_s} to ${MY_DATADIR_s}"
718 mv --strip-trailing-slashes -T "${old_MY_DATADIR_s}" "${MY_DATADIR_s}" \
719 || die "Moving MY_DATADIR failed"
722 ewarn "Previous MY_DATADIR (${old_MY_DATADIR_s}) does not exist"
723 if [[ -d "${MY_DATADIR_s}" ]]; then
724 ewarn "Attempting to use ${MY_DATADIR_s}"
726 eerror "New MY_DATADIR (${MY_DATADIR_s}) does not exist"
727 die "Configuration Failed! Please reinstall ${CATEGORY}/${PN}"
736 if [ -z "${MYSQL_ROOT_PASSWORD}" ]; then
737 MYSQL_ROOT_PASSWORD="$(mysql-v2_getoptval 'client mysql' password)"
739 MYSQL_TMPDIR="$(mysql-v2_getoptval mysqld tmpdir)"
740 # These are dir+prefix
741 MYSQL_RELAY_LOG="$(mysql-v2_getoptval mysqld relay-log)"
742 MYSQL_RELAY_LOG=${MYSQL_RELAY_LOG%/*}
743 MYSQL_LOG_BIN="$(mysql-v2_getoptval mysqld log-bin)"
744 MYSQL_LOG_BIN=${MYSQL_LOG_BIN%/*}
746 if [[ ! -d "${ROOT}"/$MYSQL_TMPDIR ]]; then
747 einfo "Creating MySQL tmpdir $MYSQL_TMPDIR"
748 install -d -m 770 -o mysql -g mysql "${ROOT}"/$MYSQL_TMPDIR
750 if [[ ! -d "${ROOT}"/$MYSQL_LOG_BIN ]]; then
751 einfo "Creating MySQL log-bin directory $MYSQL_LOG_BIN"
752 install -d -m 770 -o mysql -g mysql "${ROOT}"/$MYSQL_LOG_BIN
754 if [[ ! -d "${EROOT}"/$MYSQL_RELAY_LOG ]]; then
755 einfo "Creating MySQL relay-log directory $MYSQL_RELAY_LOG"
756 install -d -m 770 -o mysql -g mysql "${EROOT}"/$MYSQL_RELAY_LOG
759 if [[ -d "${ROOT}/${MY_DATADIR}/mysql" ]] ; then
760 ewarn "You have already a MySQL database in place."
761 ewarn "(${ROOT}/${MY_DATADIR}/*)"
762 ewarn "Please rename or delete it if you wish to replace it."
763 die "MySQL database already exists!"
766 # Bug #213475 - MySQL _will_ object strenously if your machine is named
767 # localhost. Also causes weird failures.
768 [[ "${HOSTNAME}" == "localhost" ]] && die "Your machine must NOT be named localhost"
770 if [ -z "${MYSQL_ROOT_PASSWORD}" ]; then
772 einfo "Please provide a password for the mysql 'root' user now, in the"
773 einfo "MYSQL_ROOT_PASSWORD env var or through the ${HOME}/.my.cnf file."
774 ewarn "Avoid [\"'\\_%] characters in the password"
775 read -rsp " >" pwd1 ; echo
777 einfo "Retype the password"
778 read -rsp " >" pwd2 ; echo
780 if [[ "x$pwd1" != "x$pwd2" ]] ; then
781 die "Passwords are not the same"
783 MYSQL_ROOT_PASSWORD="${pwd1}"
788 local sqltmp="$(emktemp)"
790 # Fix bug 446200. Don't reference host my.cnf, needs to come first,
791 # see http://bugs.mysql.com/bug.php?id=31312
792 use prefix && options="${options} --defaults-file=${MY_SYSCONFDIR}/my.cnf"
794 local help_tables="${ROOT}${MY_SHAREDSTATEDIR}/fill_help_tables.sql"
795 [[ -r "${help_tables}" ]] \
796 && cp "${help_tables}" "${TMPDIR}/fill_help_tables.sql" \
797 || touch "${TMPDIR}/fill_help_tables.sql"
798 help_tables="${TMPDIR}/fill_help_tables.sql"
800 # Figure out which options we need to disable to do the setup
801 helpfile="${TMPDIR}/mysqld-help"
802 ${EROOT}/usr/sbin/mysqld --verbose --help >"${helpfile}" 2>/dev/null
803 for opt in grant-tables host-cache name-resolve networking slave-start \
804 federated ssl log-bin relay-log slow-query-log external-locking \
805 ndbcluster log-slave-updates \
807 optexp="--(skip-)?${opt}" optfull="--loose-skip-${opt}"
808 egrep -sq -- "${optexp}" "${helpfile}" && options="${options} ${optfull}"
810 # But some options changed names
811 egrep -sq external-locking "${helpfile}" && \
812 options="${options/skip-locking/skip-external-locking}"
814 use prefix || options="${options} --user=mysql"
816 # MySQL 5.6+ needs InnoDB
817 if [[ ${PN} == "mysql" || ${PN} == "percona-server" ]] ; then
818 mysql_version_is_at_least "5.6" || options="${options} --loose-skip-innodb"
821 einfo "Creating the mysql database and setting proper permissions on it ..."
823 # Now that /var/run is a tmpfs mount point, we need to ensure it exists before using it
824 PID_DIR="${EROOT}/var/run/mysqld"
825 if [[ ! -d "${PID_DIR}" ]]; then
826 mkdir -p "${PID_DIR}" || die "Could not create pid directory"
827 chown mysql:mysql "${PID_DIR}" || die "Could not set ownership on pid directory"
828 chmod 755 "${PID_DIR}" || die "Could not set permissions on pid directory"
831 pushd "${TMPDIR}" &>/dev/null
832 #cmd="'${EROOT}/usr/share/mysql/scripts/mysql_install_db' '--basedir=${EPREFIX}/usr' ${options}"
833 cmd=${EROOT}usr/share/mysql/scripts/mysql_install_db
834 [[ -f ${cmd} ]] || cmd=${EROOT}usr/bin/mysql_install_db
835 cmd="'$cmd' '--basedir=${EPREFIX}/usr' ${options} '--datadir=${ROOT}/${MY_DATADIR}' '--tmpdir=${ROOT}/${MYSQL_TMPDIR}'"
836 einfo "Command: $cmd"
838 >"${TMPDIR}"/mysql_install_db.log 2>&1
839 if [ $? -ne 0 ]; then
840 grep -B5 -A999 -i "ERROR" "${TMPDIR}"/mysql_install_db.log 1>&2
841 die "Failed to run mysql_install_db. Please review ${EPREFIX}/var/log/mysql/mysqld.err AND ${TMPDIR}/mysql_install_db.log"
844 [[ -f "${ROOT}/${MY_DATADIR}/mysql/user.frm" ]] \
845 || die "MySQL databases not installed"
846 chown -R mysql:mysql "${ROOT}/${MY_DATADIR}" 2>/dev/null
847 chmod 0750 "${ROOT}/${MY_DATADIR}" 2>/dev/null
849 # Filling timezones, see
850 # http://dev.mysql.com/doc/mysql/en/time-zone-support.html
851 "${EROOT}/usr/bin/mysql_tzinfo_to_sql" "${EROOT}/usr/share/zoneinfo" > "${sqltmp}" 2>/dev/null
853 if [[ -r "${help_tables}" ]] ; then
854 cat "${help_tables}" >> "${sqltmp}"
857 local socket="${EROOT}/var/run/mysqld/mysqld${RANDOM}.sock"
858 local pidfile="${EROOT}/var/run/mysqld/mysqld${RANDOM}.pid"
859 local mysqld="${EROOT}/usr/sbin/mysqld \
861 $(use prefix || echo --user=mysql) \
863 --basedir=${EROOT}/usr \
864 --datadir=${ROOT}/${MY_DATADIR} \
865 --max_allowed_packet=8M \
866 --net_buffer_length=16K \
867 --default-storage-engine=MyISAM \
869 --pid-file=${pidfile}
870 --tmpdir=${ROOT}/${MYSQL_TMPDIR}"
871 #einfo "About to start mysqld: ${mysqld}"
872 ebegin "Starting mysqld"
873 einfo "Command ${mysqld}"
876 while ! [[ -S "${socket}" || "${maxtry}" -lt 1 ]] ; do
877 maxtry=$((${maxtry}-1))
883 if ! [[ -S "${socket}" ]]; then
884 die "Completely failed to start up mysqld with: ${mysqld}"
887 ebegin "Setting root password"
888 # Do this from memory, as we don't want clear text passwords in temp files
889 local sql="UPDATE mysql.user SET Password = PASSWORD('${MYSQL_ROOT_PASSWORD}') WHERE USER='root'; FLUSH PRIVILEGES"
890 "${EROOT}/usr/bin/mysql" \
896 ebegin "Loading \"zoneinfo\", this step may require a few seconds"
897 "${EROOT}/usr/bin/mysql" \
901 --password="${MYSQL_ROOT_PASSWORD}" \
905 [[ $rc -ne 0 ]] && ewarn "Failed to load zoneinfo!"
907 # Stop the server and cleanup
908 einfo "Stopping the server ..."
909 kill $(< "${pidfile}" )
915 # @FUNCTION: mysql-v2_pkg_postrm
917 # Remove mysql symlinks.
918 mysql-v2_pkg_postrm() {
920 : # mysql_lib_symlinks "${ED}"