aboutsummaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
authorSebastian Kemper <sebastian_ml@gmx.net>2018-04-09 20:35:47 +0200
committerSebastian Kemper <sebastian_ml@gmx.net>2018-04-28 14:41:30 +0200
commit1b73f267eae2dedc18969b70ed7c5d9b02288bac (patch)
tree2ede35dce8081fd991b1aa5bc6f6c1d40b0e2bbe /utils
parentaacb04dc3fe46241cd584db6dfb5dd0070a8da29 (diff)
mariadb: new package
MariaDB is a drop-in replacement for MySQL. This commit adds a current and stable version of MariaDB to the tree. Quite a few ideas/patches were copied from Alpine Linux, Busybox Buildroot and Debian. Signed-off-by: Sebastian Kemper <sebastian_ml@gmx.net>
Diffstat (limited to 'utils')
-rw-r--r--utils/mariadb/Makefile542
-rw-r--r--utils/mariadb/conf/my.cnf54
-rw-r--r--utils/mariadb/files/mysqld.init32
-rw-r--r--utils/mariadb/patches/100-fix_hostname.patch11
-rw-r--r--utils/mariadb/patches/110-pcre.cmake.patch11
-rw-r--r--utils/mariadb/patches/120-fix-ucontext-check.patch18
-rw-r--r--utils/mariadb/patches/130-c11_atomics.patch121
-rw-r--r--utils/mariadb/patches/140-mips-connect-unaligned.patch262
-rw-r--r--utils/mariadb/patches/150-mips-innobase-atomic.patch14
-rw-r--r--utils/mariadb/patches/160-mips-machine.patch25
-rw-r--r--utils/mariadb/patches/170-ppc-remove-glibc-dep.patch75
11 files changed, 1165 insertions, 0 deletions
diff --git a/utils/mariadb/Makefile b/utils/mariadb/Makefile
new file mode 100644
index 000000000..a42f61f9e
--- /dev/null
+++ b/utils/mariadb/Makefile
@@ -0,0 +1,542 @@
+#
+# Copyright (C) 2018 Sebastian Kemper <sebastian_ml@gmx.net>
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=mariadb
+PKG_VERSION:=10.1.32
+PKG_RELEASE:=1
+
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
+PKG_SOURCE_URL:=https://downloads.mariadb.org/interstitial/$(PKG_NAME)-$(PKG_VERSION)/source
+
+PKG_HASH:=0e2aae6a6a190d07c8e36e87dd43377057fa82651ca3c583462563f3e9369096
+PKG_MAINTAINER:=Sebastian Kemper <sebastian_ml@gmx.net>
+PKG_LICENSE:=GPL-2.0
+PKG_LICENSE_FILES:=COPYING
+
+HOST_BUILD_PARALLEL:=1
+PKG_BUILD_PARALLEL:=1
+PKG_USE_MIPS16:=0
+
+HOST_BUILD_DEPENDS:=libxml2/host
+PKG_BUILD_DEPENDS:=mariadb/host
+
+CMAKE_INSTALL:=1
+
+PLUGIN_DIR:=/usr/lib/mysql/plugin
+
+MARIADB_COMMON_DEPENDS := \
+ +libatomic \
+ +libopenssl \
+ +libstdcpp \
+ +zlib
+
+MARIADB_SERVER_PLUGINS := \
+ adt_null \
+ auth_0x0100 \
+ auth_ed25519 \
+ auth_socket \
+ auth_test_plugin \
+ client_ed25519 \
+ debug_key_management \
+ dialog_examples \
+ disks \
+ example_key_management \
+ feedback \
+ file_key_management \
+ ha_archive \
+ ha_blackhole \
+ ha_connect \
+ ha_example \
+ ha_federated \
+ ha_federatedx \
+ ha_innodb \
+ ha_spider \
+ ha_test_sql_discovery \
+ handlersocket \
+ libdaemon_example \
+ locales \
+ metadata_lock_info \
+ mypluglib \
+ qa_auth_client \
+ qa_auth_interface \
+ qa_auth_server \
+ query_cache_info \
+ query_response_time \
+ semisync_master \
+ semisync_slave \
+ server_audit \
+ simple_password_check \
+ sql_errlog \
+ wsrep_info
+
+PKG_CONFIG_DEPENDS := \
+ $(patsubst %,CONFIG_PACKAGE_$(PKG_NAME)-server-plugin-%,$(subst _,-,$(MARIADB_SERVER_PLUGINS))) \
+ CONFIG_PACKAGE_mariadb-server
+
+plugin-adt_null := PLUGIN_AUDIT_NULL
+plugin-auth_0x0100 := PLUGIN_AUTH_0X0100
+plugin-auth_ed25519 := PLUGIN_AUTH_ED25519
+plugin-auth_socket := PLUGIN_AUTH_SOCKET
+plugin-auth_test_plugin := PLUGIN_AUTH_TEST_PLUGIN
+plugin-client_ed25519 := PLUGIN_CLIENT_ED25519
+plugin-debug_key_management := PLUGIN_DEBUG_KEY_MANAGEMENT
+plugin-dialog_examples := PLUGIN_DIALOG_EXAMPLES
+plugin-disks := PLUGIN_DISKS
+plugin-example_key_management := PLUGIN_EXAMPLE_KEY_MANAGEMENT
+plugin-feedback := PLUGIN_FEEDBACK
+plugin-file_key_management := PLUGIN_FILE_KEY_MANAGEMENT
+plugin-ha_archive := PLUGIN_ARCHIVE
+plugin-ha_blackhole := PLUGIN_BLACKHOLE
+plugin-ha_connect := PLUGIN_CONNECT
+plugin-ha_example := PLUGIN_EXAMPLE
+plugin-ha_federated := PLUGIN_FEDERATED
+plugin-ha_federatedx := PLUGIN_FEDERATEDX
+plugin-ha_innodb := PLUGIN_INNOBASE
+plugin-ha_spider := PLUGIN_SPIDER
+plugin-ha_test_sql_discovery := PLUGIN_TEST_SQL_DISCOVERY
+plugin-handlersocket := PLUGIN_HANDLERSOCKET
+plugin-libdaemon_example := PLUGIN_DAEMON_EXAMPLE
+plugin-locales := PLUGIN_LOCALES
+plugin-metadata_lock_info := PLUGIN_METADATA_LOCK_INFO
+plugin-mypluglib := PLUGIN_FTEXAMPLE
+plugin-qa_auth_client := PLUGIN_QA_AUTH_CLIENT
+plugin-qa_auth_interface := PLUGIN_QA_AUTH_INTERFACE
+plugin-qa_auth_server := PLUGIN_QA_AUTH_SERVER
+plugin-query_cache_info := PLUGIN_QUERY_CACHE_INFO
+plugin-query_response_time := PLUGIN_QUERY_RESPONSE_TIME
+plugin-semisync_master := PLUGIN_SEMISYNC_MASTER
+plugin-semisync_slave := PLUGIN_SEMISYNC_SLAVE
+plugin-server_audit := PLUGIN_SERVER_AUDIT
+plugin-simple_password_check := PLUGIN_SIMPLE_PASSWORD_CHECK
+plugin-sql_errlog := PLUGIN_SQL_ERRLOG
+plugin-wsrep_info := PLUGIN_WSREP_INFO
+
+MARIADB_CLIENT := \
+ mysql \
+ mysqlcheck
+
+MARIADB_CLIENT_EXTRA := \
+ mysql_find_rows \
+ mysql_waitpid \
+ mysqlaccess \
+ mysqladmin \
+ mysqldump \
+ mysqlimport \
+ mysqlshow \
+ mysqlslap \
+ mytop
+
+MARIADB_SERVER := \
+ innochecksum \
+ my_print_defaults \
+ mysql_install_db \
+ mysql_upgrade \
+ mysqld
+
+MARIADB_SERVER_EXTRA := \
+ aria* \
+ mariabackup \
+ msql2mysql \
+ myisam_ftdump \
+ myisamchk \
+ myisamlog \
+ myisampack \
+ mysql_convert_table_format \
+ mysql_fix_extensions \
+ mysql_plugin \
+ mysql_secure_installation \
+ mysql_setpermission \
+ mysql_tzinfo_to_sql \
+ mysqlbinlog \
+ mysqld_multi \
+ mysqld_safe \
+ mysqld_safe_helper \
+ mysqldumpslow \
+ mysqlhotcopy \
+ perror \
+ replace \
+ resolve_stack_dump
+
+include $(INCLUDE_DIR)/package.mk
+include $(INCLUDE_DIR)/host-build.mk
+include $(INCLUDE_DIR)/cmake.mk
+
+define Package/mariadb/install/bin
+ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/$(2) $(1)/usr/bin
+endef
+
+define Package/mariadb/description/Default
+MariaDB is a fast, stable and true multi-user, multi-threaded SQL
+database server. SQL (Structured Query Language) is the most popular
+database query language in the world. The main goals of MariaDB are
+speed, robustness and ease of use.
+endef
+
+define Package/libmariadbclient
+ SECTION:=libs
+ CATEGORY:=Libraries
+ DEPENDS:=$(MARIADB_COMMON_DEPENDS)
+ TITLE:=MariaDB database client library
+ URL:=https://mariadb.org/
+ PROVIDES:=libmysqlclient libmysqlclient-r
+endef
+
+define Package/libmariadbclient/description
+$(call Package/mariadb/description/Default)
+
+This package includes the client library.
+
+endef
+
+define Package/mariadb/Default
+ SECTION:=utils
+ CATEGORY:=Utilities
+ URL:=https://mariadb.org/
+ SUBMENU:=database
+endef
+
+define Package/mariadb-client
+ $(call Package/mariadb/Default)
+ TITLE:=MariaDB database core client binaries
+ DEPENDS:= \
+ $(MARIADB_COMMON_DEPENDS) \
+ +libncursesw
+endef
+
+define Package/mariadb-client/description
+$(call Package/mariadb/description/Default)
+
+This package includes the following core client binaries:
+
+$(subst $(space),$(newline),$(MARIADB_CLIENT))
+
+endef
+
+define Package/mariadb-client-extra
+ $(call Package/mariadb/Default)
+ TITLE:=MariaDB database extra client binaries
+ DEPENDS:=mariadb-client
+endef
+
+define Package/mariadb-client-extra/description
+$(call Package/mariadb/description/Default)
+
+This package includes the following extra client binaries:
+
+$(subst $(space),$(newline),$(MARIADB_CLIENT_EXTRA))
+
+endef
+
+define Package/mariadb-extra-charsets
+ $(call Package/mariadb/Default)
+ TITLE:=MariaDB database extra character sets
+ DEPENDS:=mariadb-server
+endef
+
+define Package/mariadb-extra-charsets/description
+$(call Package/mariadb/description/Default)
+
+The MariaDB server packaged by OpenWrt only provides support for UTF-8.
+This package contains single Byte character sets and collations that can
+be added at run time.
+
+endef
+
+define Package/mariadb-server
+ $(call Package/mariadb/Default)
+ DEPENDS:= \
+ $(MARIADB_COMMON_DEPENDS) \
+ +!arc:libaio \
+ +liblzma \
+ +libpcre \
+ +resolveip
+ TITLE:=MariaDB database core server binaries
+ MENU:=1
+ PROVIDES:=mysql-server
+endef
+
+define Package/mariadb-server/description
+$(call Package/mariadb/description/Default)
+
+This package includes the following core server binaries:
+
+$(subst $(space),$(newline),$(MARIADB_SERVER))
+
+endef
+
+define Package/mariadb-server-extra
+ $(call Package/mariadb/Default)
+ TITLE:=MariaDB database extra server binaries
+ DEPENDS:=mariadb-server
+endef
+
+define Package/mariadb-server-extra/description
+$(call Package/mariadb/description/Default)
+
+This package includes the following extra server binaries:
+
+$(subst $(space),$(newline),$(MARIADB_SERVER_EXTRA))
+
+endef
+
+# We won't need unit tests
+CMAKE_OPTIONS += -DWITH_UNIT_TESTS=0
+
+# This value is determined automatically during straight compile by compiling
+# and running a test code. You cannot do that during cross-compile. However the
+# stack grows downward in most if not all modern systems. The only exception
+# according to buildroot is PA-RISC which is not supported by OpenWrt as far as
+# I know. Therefore it makes sense to hardcode the value. If an arch is added
+# the stack of which grows up one should expect unpredictable behavior at run
+# time.
+CMAKE_OPTIONS += -DSTACK_DIRECTION=-1
+
+# Jemalloc was added for TokuDB. Since its configure script seems somewhat broken
+# when it comes to cross-compilation we shall disable it and also disable TokuDB.
+CMAKE_OPTIONS += -DWITH_JEMALLOC=no -DWITHOUT_TOKUDB=1
+
+# Make it explicit that we are cross-compiling
+CMAKE_OPTIONS += -DCMAKE_CROSSCOMPILING=1
+
+# Explicitly disable dtrace to avoid detection of a host version
+CMAKE_OPTIONS += -DENABLE_DTRACE=0
+
+# Prevent mariadb from messing with OpenWrt's C(XX)FLAGS
+CMAKE_OPTIONS += -DSECURITY_HARDENED=OFF
+
+ifeq ($(CONFIG_PACKAGE_mariadb-server),)
+CMAKE_OPTIONS += -DWITHOUT_SERVER=ON
+else
+CMAKE_OPTIONS += -DWITHOUT_SERVER=OFF
+endif
+
+CMAKE_OPTIONS += \
+ -DCONNECT_WITH_JDBC=NO \
+ -DCONNECT_WITH_LIBXML2=system \
+ -DCONNECT_WITH_ODBC=NO \
+ -DDEFAULT_CHARSET=utf8 \
+ -DDEFAULT_COLLATION=utf8_general_ci \
+ -DDISABLE_SHARED=NO \
+ -DENABLED_PROFILING=OFF \
+ -DENABLE_STATIC_LIBS=OFF \
+ -DINSTALL_DOCDIR=share/doc/mariadb \
+ -DINSTALL_DOCREADMEDIR=share/doc/mariadb \
+ -DINSTALL_MANDIR=share/man \
+ -DINSTALL_MYSQLSHAREDIR=share/mysql \
+ -DINSTALL_MYSQLTESTDIR="" \
+ -DINSTALL_PLUGINDIR=lib/mysql/plugin \
+ -DINSTALL_SBINDIR=bin \
+ -DINSTALL_SCRIPTDIR=bin \
+ -DINSTALL_SQLBENCHDIR="" \
+ -DINSTALL_SUPPORTFILESDIR=share/mysql \
+ -DMYSQLD_USER=root \
+ -DMYSQL_DATADIR=/var/lib/mysql \
+ -DMYSQL_UNIX_ADDR=/var/run/mysqld.sock \
+ -DSKIP_TESTS=ON \
+ -DWITH_ASAN=OFF \
+ -DWITH_EMBEDDED_SERVER=OFF \
+ -DWITH_EXTRA_CHARSETS=none \
+ -DWITH_INNODB_BZIP2=OFF \
+ -DWITH_INNODB_LZ4=OFF \
+ -DWITH_INNODB_LZMA=ON \
+ -DWITH_INNODB_LZO=OFF \
+ -DWITH_INNODB_SNAPPY=OFF \
+ -DWITH_LIBEDIT=OFF \
+ -DWITH_LIBNUMA=NO \
+ -DWITH_LIBWRAP=OFF \
+ -DWITH_LIBWSEP=OFF \
+ -DWITH_MARIABACKUP=ON \
+ -DWITH_PCRE=system \
+ -DWITH_READLINE=OFF \
+ -DWITH_SAFEMALLOC=OFF \
+ -DWITH_SSL=system \
+ -DWITH_SYSTEMD=no \
+ -DWITH_VALGRIND=OFF \
+ -DWITH_ZLIB=system
+
+# Default-disable some modules
+CMAKE_OPTIONS += \
+ -DPLUGIN_CASSANDRA=NO \
+ -DPLUGIN_MROONGA=NO \
+ -DPLUGIN_OQGRAPH=NO \
+ -DPLUGIN_ROCKSDB=NO \
+ -DPLUGIN_SPHINX=NO \
+ -DPLUGIN_TOKUDB=NO \
+ -DPLUGIN_AUTH_PAM=NO \
+ -DPLUGIN_AUTH_GSSAPI=NO \
+ -DPLUGIN_AUTH_GSSAPI_CLIENT=NO \
+ -DPLUGIN_CRACKLIB_PASSWORD_CHECK=NO
+
+CMAKE_OPTIONS += \
+ $(foreach p,$(MARIADB_SERVER_PLUGINS),-D$(plugin-$(p))=$(if $(CONFIG_PACKAGE_$(PKG_NAME)-server-plugin-$(subst _,-,$(p))),DYNAMIC,NO))
+
+# Set CMAKE_FIND_ROOT_PATH_MODE_INCLUDE and CMAKE_FIND_ROOT_PATH_MODE_LIBRARY
+# to BOTH as otherwise the host build will not find some required dependencies
+# installed on the host machine, like ncurses.
+#
+# Add "$(STAGING_DIR_HOSTPKG)/lib" to the RPATH of the host helpers,
+# otherwise they might not find the location of a library at run time.
+CMAKE_HOST_OPTIONS += \
+ -DCMAKE_BUILD_WITH_INSTALL_RPATH=TRUE \
+ -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=BOTH \
+ -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=BOTH \
+ -DCMAKE_INSTALL_RPATH="$(STAGING_DIR_HOSTPKG)/lib" \
+ -DCMAKE_SKIP_RPATH=FALSE \
+ -DWITHOUT_SERVER=OFF \
+ -DWITHOUT_TOKUDB=1
+
+# Some helpers must be compiled for host in order to crosscompile mariadb for
+# the target. They are then included by import_executables.cmake which is
+# generated during the build of the host helpers. It is not necessary to build
+# the whole host package, only the "import_executables" target.
+# -DIMPORT_EXECUTABLES=$(HOST_BUILD_DIR)/import_executables.cmake
+# must then be passed to cmake during target build.
+# see also https://mariadb.com/kb/en/mariadb/cross-compiling-mariadb/
+
+CMAKE_OPTIONS += -DIMPORT_EXECUTABLES=$(STAGING_DIR_HOSTPKG)/share/mariadb/import_executables.cmake
+
+define Host/Compile
+ $(call Host/Compile/Default,import_executables)
+endef
+
+define Host/Install
+ $(SED) 's|$(HOST_BUILD_DIR)|$(STAGING_DIR_HOSTPKG)/share/mariadb|' $(HOST_BUILD_DIR)/import_executables.cmake
+ $(INSTALL_DIR) $(1)/share/mariadb/{dbug,extra,scripts,sql}
+ $(INSTALL_BIN) $(HOST_BUILD_DIR)/dbug/factorial $(1)/share/mariadb/dbug
+ $(INSTALL_BIN) $(HOST_BUILD_DIR)/extra/comp_err $(1)/share/mariadb/extra
+ $(INSTALL_BIN) $(HOST_BUILD_DIR)/scripts/comp_sql $(1)/share/mariadb/scripts
+ $(INSTALL_BIN) $(HOST_BUILD_DIR)/sql/{gen_lex_hash,gen_lex_token} $(1)/share/mariadb/sql
+ $(INSTALL_DATA) $(HOST_BUILD_DIR)/import_executables.cmake $(1)/share/mariadb
+endef
+
+define Build/InstallDev
+ $(INSTALL_DIR) $(2)/bin $(1)/usr/bin $(1)/usr/include $(1)/usr/lib/pkgconfig $(1)/usr/share/aclocal
+ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/mysql_config $(1)/usr/bin/
+ $(LN) $(STAGING_DIR)/usr/bin/mysql_config $(2)/bin/
+ $(CP) $(PKG_INSTALL_DIR)/usr/include/mysql $(1)/usr/include/
+ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libmysqlclient*.so* $(1)/usr/lib/
+ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/share/pkgconfig/mariadb.pc $(1)/usr/lib/pkgconfig
+ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/share/aclocal/mysql.m4 $(1)/usr/share/aclocal
+endef
+
+define Package/libmariadbclient/install
+ $(INSTALL_DIR) $(1)$(PLUGIN_DIR)
+ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libmysqlclient*.so* $(1)/usr/lib/
+ $(INSTALL_BIN) $(PKG_INSTALL_DIR)$(PLUGIN_DIR)/dialog.so $(1)$(PLUGIN_DIR)
+ $(INSTALL_BIN) $(PKG_INSTALL_DIR)$(PLUGIN_DIR)/mysql_clear_password.so $(1)$(PLUGIN_DIR)
+endef
+
+define Package/mariadb-client/install
+ $(INSTALL_DIR) $(1)/usr/bin
+ $(foreach b,$(MARIADB_CLIENT),$(call Package/mariadb/install/bin,$(1),$(b));)
+endef
+
+define Package/mariadb-client-extra/install
+ $(INSTALL_DIR) $(1)/usr/bin
+ $(foreach b,$(MARIADB_CLIENT_EXTRA),$(call Package/mariadb/install/bin,$(1),$(b));)
+endef
+
+define Package/mariadb-extra-charsets/install
+ $(INSTALL_DIR) $(1)/usr/share/mysql/charsets
+ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/share/mysql/charsets/* $(1)/usr/share/mysql/charsets
+endef
+
+define Package/mariadb-server/install
+ $(INSTALL_DIR) $(1)/usr/bin
+ $(foreach b,$(MARIADB_SERVER),$(call Package/mariadb/install/bin,$(1),$(b));)
+ $(INSTALL_DIR) $(1)/etc/init.d/
+ $(INSTALL_DIR) $(1)/etc/mysql
+ $(INSTALL_BIN) files/mysqld.init $(1)/etc/init.d/mysqld
+ $(INSTALL_CONF) conf/my.cnf $(1)/etc/mysql
+ $(INSTALL_DIR) $(1)$(PLUGIN_DIR)
+ $(INSTALL_CONF) $(PKG_INSTALL_DIR)$(PLUGIN_DIR)/daemon_example.ini $(1)$(PLUGIN_DIR)
+ $(INSTALL_DIR) $(1)/usr/share/mysql/english
+ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/share/mysql/english/errmsg.sys $(1)/usr/share/mysql/english
+ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/share/mysql/fill_help_tables.sql $(1)/usr/share/mysql/
+ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/share/mysql/maria_add_gis_sp_bootstrap.sql $(1)/usr/share/mysql/
+ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/share/mysql/mysql_performance_tables.sql $(1)/usr/share/mysql/
+ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/share/mysql/mysql_system_tables.sql $(1)/usr/share/mysql/
+ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/share/mysql/mysql_system_tables_data.sql $(1)/usr/share/mysql/
+endef
+
+define Package/mariadb-server-extra/install
+ $(INSTALL_DIR) $(1)/usr/bin
+ $(foreach b,$(MARIADB_SERVER_EXTRA),$(call Package/mariadb/install/bin,$(1),$(b));)
+endef
+
+define Package/mariadb-server/conffiles
+/etc/mysql/my.cnf
+/usr/lib/mysql/plugin/daemon_example.ini
+endef
+
+define BuildPlugin
+ define Package/$(PKG_NAME)-server-plugin-$(subst _,-,$(1))
+ $$(call Package/mariadb/Default)
+ TITLE:=MariaDB database plugin
+ DEPENDS:=mariadb-server $(patsubst +%,+PACKAGE_$(PKG_NAME)-server-plugin-$(subst _,-,$(1)):%,$(2))
+ endef
+ define Package/$(PKG_NAME)-server-plugin-$(subst _,-,$(1))/description
+ $$(call Package/mariadb/description/Default)
+
+This package provides the $(1) plugin.
+
+ endef
+ define Package/$(PKG_NAME)-server-plugin-$(subst _,-,$(1))/install
+ $(INSTALL_DIR) $$(1)$(PLUGIN_DIR)
+ $(INSTALL_BIN) \
+ $(PKG_INSTALL_DIR)$(PLUGIN_DIR)/$(1).so \
+ $$(1)$(PLUGIN_DIR)
+ endef
+ $$(eval $$(call BuildPackage,$(PKG_NAME)-server-plugin-$(subst _,-,$(1))))
+endef
+
+$(eval $(call HostBuild))
+$(eval $(call BuildPackage,libmariadbclient))
+$(eval $(call BuildPackage,mariadb-client))
+$(eval $(call BuildPackage,mariadb-client-extra))
+$(eval $(call BuildPackage,mariadb-extra-charsets))
+$(eval $(call BuildPackage,mariadb-server))
+$(eval $(call BuildPackage,mariadb-server-extra))
+
+$(eval $(call BuildPlugin,adt_null,))
+$(eval $(call BuildPlugin,auth_0x0100,))
+$(eval $(call BuildPlugin,auth_ed25519,))
+$(eval $(call BuildPlugin,auth_socket,))
+$(eval $(call BuildPlugin,auth_test_plugin,))
+$(eval $(call BuildPlugin,client_ed25519,))
+$(eval $(call BuildPlugin,debug_key_management,))
+$(eval $(call BuildPlugin,dialog_examples,))
+$(eval $(call BuildPlugin,disks,))
+$(eval $(call BuildPlugin,example_key_management,))
+$(eval $(call BuildPlugin,feedback,))
+$(eval $(call BuildPlugin,file_key_management,))
+$(eval $(call BuildPlugin,ha_archive,))
+$(eval $(call BuildPlugin,ha_blackhole,))
+$(eval $(call BuildPlugin,ha_connect,+libxml2))
+$(eval $(call BuildPlugin,ha_federated,))
+$(eval $(call BuildPlugin,ha_federatedx,))
+$(eval $(call BuildPlugin,ha_innodb,))
+$(eval $(call BuildPlugin,ha_spider,))
+$(eval $(call BuildPlugin,ha_test_sql_discovery,))
+$(eval $(call BuildPlugin,handlersocket,))
+$(eval $(call BuildPlugin,libdaemon_example,))
+$(eval $(call BuildPlugin,locales,))
+$(eval $(call BuildPlugin,metadata_lock_info,))
+$(eval $(call BuildPlugin,mypluglib,))
+$(eval $(call BuildPlugin,qa_auth_client,))
+$(eval $(call BuildPlugin,qa_auth_interface,))
+$(eval $(call BuildPlugin,qa_auth_server,))
+$(eval $(call BuildPlugin,query_cache_info,))
+$(eval $(call BuildPlugin,query_response_time,))
+$(eval $(call BuildPlugin,semisync_master,))
+$(eval $(call BuildPlugin,semisync_slave,))
+$(eval $(call BuildPlugin,server_audit,))
+$(eval $(call BuildPlugin,simple_password_check,))
+$(eval $(call BuildPlugin,sql_errlog,))
+$(eval $(call BuildPlugin,wsrep_info,))
diff --git a/utils/mariadb/conf/my.cnf b/utils/mariadb/conf/my.cnf
new file mode 100644
index 000000000..ec2ade2c8
--- /dev/null
+++ b/utils/mariadb/conf/my.cnf
@@ -0,0 +1,54 @@
+[client]
+port = 3306
+socket = /var/run/mysqld.sock
+
+[mysqld]
+user = root
+socket = /var/run/mysqld.sock
+port = 3306
+basedir = /usr
+
+############ Don't put this on the NAND #############
+# Figure out where you are going to put the databases
+# And run mysql_install_db --force
+datadir = /mnt/data/mysql/
+
+######### This should also not go on the NAND #######
+tmpdir = /mnt/data/tmp/
+
+skip-external-locking
+
+bind-address = 127.0.0.1
+
+# Fine Tuning
+key_buffer = 16M
+max_allowed_packet = 16M
+thread_stack = 192K
+thread_cache_size = 8
+
+# Here you can see queries with especially long duration
+#log_slow_queries = /var/log/mysql/mysql-slow.log
+#long_query_time = 2
+#log-queries-not-using-indexes
+
+# The following can be used as easy to replay backup logs or for replication.
+#server-id = 1
+#log_bin = /var/log/mysql/mysql-bin.log
+#expire_logs_days = 10
+#max_binlog_size = 100M
+#binlog_do_db = include_database_name
+#binlog_ignore_db = include_database_name
+
+
+[mysqldump]
+quick
+quote-names
+max_allowed_packet = 16M
+
+[mysql]
+#no-auto-rehash # faster start of mysql but no tab completition
+
+[isamchk]
+key_buffer = 16M
+
+
diff --git a/utils/mariadb/files/mysqld.init b/utils/mariadb/files/mysqld.init
new file mode 100644
index 000000000..98c8c65c4
--- /dev/null
+++ b/utils/mariadb/files/mysqld.init
@@ -0,0 +1,32 @@
+#!/bin/sh /etc/rc.common
+# Copyright (C) 2010-2011 OpenWrt.org
+
+START=95
+STOP=10
+
+SERVICE_DAEMONIZE=1
+SERVICE_WRITE_PID=1
+SERVICE_STOP_TIME=9
+PROG='/usr/bin/mysqld'
+
+start() {
+ local conf='/etc/my.cnf'
+ local datadir="$( sed -nE "s/^\s*datadir\s*=\s*('([^']*)'|\x22([^\x22]*)\x22|(.*\S))\s*$/\2\3\4/p" "$conf" )"
+
+ [ -d "$datadir" ] || {
+ logger -s "[ERROR] datadir '$datadir' in '$conf' does not exist"
+ return 1
+ }
+
+ [ -f "$datadir/mysql/tables_priv.MYD" ] || {
+ logger -s "[ERROR] can not detect privileges table, you might need to"
+ logger -s "run 'mysql_install_db --force' to initialize the system tables"
+ return 1
+ }
+
+ service_start "$PROG"
+}
+
+stop() {
+ service_stop "$PROG"
+}
diff --git a/utils/mariadb/patches/100-fix_hostname.patch b/utils/mariadb/patches/100-fix_hostname.patch
new file mode 100644
index 000000000..05a0fc6db
--- /dev/null
+++ b/utils/mariadb/patches/100-fix_hostname.patch
@@ -0,0 +1,11 @@
+--- a/scripts/mysql_install_db.sh
++++ b/scripts/mysql_install_db.sh
+@@ -379,7 +379,7 @@ fi
+
+
+ # Try to determine the hostname
+-hostname=`@HOSTNAME@`
++hostname=`cat /proc/sys/kernel/hostname`
+
+ # Check if hostname is valid
+ if test "$cross_bootstrap" -eq 0 -a "$in_rpm" -eq 0 -a "$force" -eq 0
diff --git a/utils/mariadb/patches/110-pcre.cmake.patch b/utils/mariadb/patches/110-pcre.cmake.patch
new file mode 100644
index 000000000..6e1d0b259
--- /dev/null
+++ b/utils/mariadb/patches/110-pcre.cmake.patch
@@ -0,0 +1,11 @@
+--- a/cmake/pcre.cmake
++++ b/cmake/pcre.cmake
+@@ -14,6 +14,8 @@ MACRO (CHECK_PCRE)
+ return -pcre_exec(NULL, NULL, NULL, -999, -999, 0, NULL, 0) < 256;
+ }" PCRE_STACK_SIZE_OK)
+ SET(CMAKE_REQUIRED_LIBRARIES)
++ ELSE()
++ SET(PCRE_STACK_SIZE_OK TRUE)
+ ENDIF()
+ ENDIF()
+ IF(NOT HAVE_PCRE_STACK_GUARD OR NOT PCRE_STACK_SIZE_OK OR
diff --git a/utils/mariadb/patches/120-fix-ucontext-check.patch b/utils/mariadb/patches/120-fix-ucontext-check.patch
new file mode 100644
index 000000000..8baec2893
--- /dev/null
+++ b/utils/mariadb/patches/120-fix-ucontext-check.patch
@@ -0,0 +1,18 @@
+--- a/configure.cmake
++++ b/configure.cmake
+@@ -1107,9 +1107,12 @@ SET(CMAKE_EXTRA_INCLUDE_FILES)
+ CHECK_STRUCT_HAS_MEMBER("struct dirent" d_ino "dirent.h" STRUCT_DIRENT_HAS_D_INO)
+ CHECK_STRUCT_HAS_MEMBER("struct dirent" d_namlen "dirent.h" STRUCT_DIRENT_HAS_D_NAMLEN)
+ SET(SPRINTF_RETURNS_INT 1)
+-CHECK_INCLUDE_FILE(ucontext.h HAVE_UCONTEXT_H)
+-IF(NOT HAVE_UCONTEXT_H)
+- CHECK_INCLUDE_FILE(sys/ucontext.h HAVE_UCONTEXT_H)
++CHECK_INCLUDE_FILE(ucontext.h HAVE_UCONTEXT_HEADER)
++IF(NOT HAVE_UCONTEXT_HEADER)
++ CHECK_INCLUDE_FILE(sys/ucontext.h HAVE_UCONTEXT_HEADER)
++ENDIF()
++IF(HAVE_UCONTEXT_HEADER)
++ CHECK_FUNCTION_EXISTS(makecontext HAVE_UCONTEXT_H)
+ ENDIF()
+ IF(HAVE_UCONTEXT_H)
+ CHECK_FUNCTION_EXISTS(makecontext HAVE_UCONTEXT_H)
diff --git a/utils/mariadb/patches/130-c11_atomics.patch b/utils/mariadb/patches/130-c11_atomics.patch
new file mode 100644
index 000000000..f223da1a1
--- /dev/null
+++ b/utils/mariadb/patches/130-c11_atomics.patch
@@ -0,0 +1,121 @@
+Description: Fix mips missing atomics primitives
+ On mips we don't have native support for 64bit atomic operations. Make use
+ of libatomic to emulate them.
+Author: Vicențiu Ciorbaru <vicentiu@mariadb.org>
+
+--- a/configure.cmake
++++ b/configure.cmake
+@@ -128,7 +128,7 @@ IF(UNIX)
+ ENDIF()
+ FIND_PACKAGE(Threads)
+
+- SET(CMAKE_REQUIRED_LIBRARIES
++ LIST(APPEND CMAKE_REQUIRED_LIBRARIES
+ ${LIBM} ${LIBNSL} ${LIBBIND} ${LIBCRYPT} ${LIBSOCKET} ${LIBDL} ${CMAKE_THREAD_LIBS_INIT} ${LIBRT} ${LIBEXECINFO})
+ # Need explicit pthread for gcc -fsanitize=address
+ IF(CMAKE_USE_PTHREADS_INIT AND CMAKE_C_FLAGS MATCHES "-fsanitize=")
+@@ -1038,7 +1038,26 @@ ELSEIF(NOT WITH_ATOMIC_OPS)
+ long long int *ptr= &var;
+ return (int)__atomic_load_n(ptr, __ATOMIC_SEQ_CST);
+ }"
+- HAVE_GCC_C11_ATOMICS)
++ HAVE_GCC_C11_ATOMICS_WITHOUT_LIBATOMIC)
++ IF(HAVE_GCC_C11_ATOMICS_WITHOUT_LIBATOMIC)
++ SET(HAVE_GCC_C11_ATOMICS True)
++ ELSE()
++ SET(OLD_CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
++ LIST(APPEND CMAKE_REQUIRED_LIBRARIES "atomic")
++ CHECK_CXX_SOURCE_COMPILES("
++ int main()
++ {
++ long long int var= 1;
++ long long int *ptr= &var;
++ return (int)__atomic_load_n(ptr, __ATOMIC_SEQ_CST);
++ }"
++ HAVE_GCC_C11_ATOMICS_WITH_LIBATOMIC)
++ IF(HAVE_GCC_C11_ATOMICS_WITH_LIBATOMIC)
++ SET(HAVE_GCC_C11_ATOMICS True)
++ ELSE()
++ SET(CMAKE_REQUIRED_LIBRARIES ${OLD_CMAKE_REQUIRED_LIBRARIES})
++ ENDIF()
++ ENDIF()
+ ELSE()
+ MESSAGE(FATAL_ERROR "${WITH_ATOMIC_OPS} is not a valid value for WITH_ATOMIC_OPS!")
+ ENDIF()
+--- a/include/atomic/gcc_builtins.h
++++ b/include/atomic/gcc_builtins.h
+@@ -16,6 +16,7 @@
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
+
++#if defined (HAVE_GCC_ATOMIC_BUILTINS)
+ #define make_atomic_add_body(S) \
+ v= __sync_fetch_and_add(a, v);
+ #define make_atomic_fas_body(S) \
+@@ -26,6 +27,20 @@
+ sav= __sync_val_compare_and_swap(a, cmp_val, set);\
+ if (!(ret= (sav == cmp_val))) *cmp= sav
+
++#elif defined(HAVE_GCC_C11_ATOMICS)
++
++#define make_atomic_add_body(S) \
++ v= __atomic_fetch_add(a, v, __ATOMIC_SEQ_CST)
++#define make_atomic_fas_body(S) \
++ v= __atomic_exchange_n(a, v, __ATOMIC_SEQ_CST)
++#define make_atomic_cas_body(S) \
++ int ## S sav; \
++ ret= __atomic_compare_exchange_n(a, cmp, set, \
++ 0, \
++ __ATOMIC_SEQ_CST,\
++ __ATOMIC_SEQ_CST);
++#endif
++
+ #ifdef MY_ATOMIC_MODE_DUMMY
+ #define make_atomic_load_body(S) ret= *a
+ #define make_atomic_store_body(S) *a= v
+--- a/include/atomic/nolock.h
++++ b/include/atomic/nolock.h
+@@ -17,7 +17,7 @@
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
+
+ #if defined(__i386__) || defined(_MSC_VER) || defined(__x86_64__) \
+- || defined(HAVE_GCC_ATOMIC_BUILTINS) \
++ || defined(HAVE_GCC_ATOMIC_BUILTINS) || defined(HAVE_GCC_C11_ATOMICS) \
+ || defined(HAVE_SOLARIS_ATOMIC)
+
+ # ifdef MY_ATOMIC_MODE_DUMMY
+@@ -41,7 +41,7 @@
+ # elif __GNUC__
+ # if defined(HAVE_SOLARIS_ATOMIC)
+ # include "solaris.h"
+-# elif defined(HAVE_GCC_ATOMIC_BUILTINS)
++# elif defined(HAVE_GCC_ATOMIC_BUILTINS) || defined(HAVE_GCC_C11_ATOMICS)
+ # include "gcc_builtins.h"
+ # elif defined(__i386__) || defined(__x86_64__)
+ # include "x86-gcc.h"
+--- a/mysys/CMakeLists.txt
++++ b/mysys/CMakeLists.txt
+@@ -78,6 +78,10 @@ IF(HAVE_BFD_H)
+ TARGET_LINK_LIBRARIES(mysys bfd)
+ ENDIF(HAVE_BFD_H)
+
++IF(HAVE_GCC_C11_ATOMICS_WITH_LIBATOMIC)
++ TARGET_LINK_LIBRARIES(mysys atomic)
++ENDIF()
++
+ IF (WIN32)
+ TARGET_LINK_LIBRARIES(mysys IPHLPAPI)
+ ENDIF(WIN32)
+--- a/sql/CMakeLists.txt
++++ b/sql/CMakeLists.txt
+@@ -165,6 +165,10 @@ TARGET_LINK_LIBRARIES(sql ${MYSQLD_STATI
+ ${SSL_LIBRARIES}
+ ${LIBSYSTEMD})
+
++IF(HAVE_GCC_C11_ATOMICS_WITH_LIBATOMIC)
++ TARGET_LINK_LIBRARIES(sql atomic)
++ENDIF()
++
+ IF(WIN32)
+ SET(MYSQLD_SOURCE main.cc nt_servc.cc message.rc)
+ TARGET_LINK_LIBRARIES(sql psapi)
diff --git a/utils/mariadb/patches/140-mips-connect-unaligned.patch b/utils/mariadb/patches/140-mips-connect-unaligned.patch
new file mode 100644
index 000000000..c2b58778d
--- /dev/null
+++ b/utils/mariadb/patches/140-mips-connect-unaligned.patch
@@ -0,0 +1,262 @@
+Description: Handle unaligned buffers in connect's TYPBLK class
+ On MIPS platforms (and probably others) unaligned memory access results in a
+ bus error. In the connect storage engine, block data for some data formats is
+ stored packed in memory and the TYPBLK class is used to read values from it.
+ Since TYPBLK does not have special handling for this packed memory, it can
+ quite easily result in unaligned memory accesses.
+ .
+ The simple way to fix this is to perform all accesses to the main buffer
+ through memcpy. With GCC and optimizations turned on, this call to memcpy is
+ completely optimized away on architectures where unaligned accesses are ok
+ (like x86).
+Author: James Cowgill <jcowgill@debian.org>
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+--- a/storage/connect/valblk.h
++++ b/storage/connect/valblk.h
+@@ -139,6 +139,7 @@ class VALBLK : public BLOCK {
+ int Prec; // Precision of float values
+ }; // end of class VALBLK
+
++
+ /***********************************************************************/
+ /* Class TYPBLK: represents a block of typed values. */
+ /***********************************************************************/
+@@ -151,40 +152,41 @@ class TYPBLK : public VALBLK {
+ // Implementation
+ virtual bool Init(PGLOBAL g, bool check);
+ virtual int GetVlen(void) {return sizeof(TYPE);}
+- virtual char GetTinyValue(int n) {return (char)Typp[n];}
+- virtual uchar GetUTinyValue(int n) {return (uchar)Typp[n];}
+- virtual short GetShortValue(int n) {return (short)Typp[n];}
+- virtual ushort GetUShortValue(int n) {return (ushort)Typp[n];}
+- virtual int GetIntValue(int n) {return (int)Typp[n];}
+- virtual uint GetUIntValue(int n) {return (uint)Typp[n];}
+- virtual longlong GetBigintValue(int n) {return (longlong)Typp[n];}
+- virtual ulonglong GetUBigintValue(int n) {return (ulonglong)Typp[n];}
+- virtual double GetFloatValue(int n) {return (double)Typp[n];}
++
++ virtual char GetTinyValue(int n) {return (char)UnalignedRead(n);}
++ virtual uchar GetUTinyValue(int n) {return (uchar)UnalignedRead(n);}
++ virtual short GetShortValue(int n) {return (short)UnalignedRead(n);}
++ virtual ushort GetUShortValue(int n) {return (ushort)UnalignedRead(n);}
++ virtual int GetIntValue(int n) {return (int)UnalignedRead(n);}
++ virtual uint GetUIntValue(int n) {return (uint)UnalignedRead(n);}
++ virtual longlong GetBigintValue(int n) {return (longlong)UnalignedRead(n);}
++ virtual ulonglong GetUBigintValue(int n) {return (ulonglong)UnalignedRead(n);}
++ virtual double GetFloatValue(int n) {return (double)UnalignedRead(n);}
+ virtual char *GetCharString(char *p, int n);
+- virtual void Reset(int n) {Typp[n] = 0;}
++ virtual void Reset(int n) {UnalignedWrite(n, 0);}
+
+ // Methods
+ using VALBLK::SetValue;
+ virtual void SetValue(PCSZ sp, int n);
+ virtual void SetValue(const char *sp, uint len, int n);
+ virtual void SetValue(short sval, int n)
+- {Typp[n] = (TYPE)sval; SetNull(n, false);}
++ {UnalignedWrite(n, (TYPE)sval); SetNull(n, false);}
+ virtual void SetValue(ushort sval, int n)
+- {Typp[n] = (TYPE)sval; SetNull(n, false);}
++ {UnalignedWrite(n, (TYPE)sval); SetNull(n, false);}
+ virtual void SetValue(int lval, int n)
+- {Typp[n] = (TYPE)lval; SetNull(n, false);}
++ {UnalignedWrite(n, (TYPE)lval); SetNull(n, false);}
+ virtual void SetValue(uint lval, int n)
+- {Typp[n] = (TYPE)lval; SetNull(n, false);}
++ {UnalignedWrite(n, (TYPE)lval); SetNull(n, false);}
+ virtual void SetValue(longlong lval, int n)
+- {Typp[n] = (TYPE)lval; SetNull(n, false);}
++ {UnalignedWrite(n, (TYPE)lval); SetNull(n, false);}
+ virtual void SetValue(ulonglong lval, int n)
+- {Typp[n] = (TYPE)lval; SetNull(n, false);}
++ {UnalignedWrite(n, (TYPE)lval); SetNull(n, false);}
+ virtual void SetValue(double fval, int n)
+- {Typp[n] = (TYPE)fval; SetNull(n, false);}
++ {UnalignedWrite(n, (TYPE)fval); SetNull(n, false);}
+ virtual void SetValue(char cval, int n)
+- {Typp[n] = (TYPE)cval; SetNull(n, false);}
++ {UnalignedWrite(n, (TYPE)cval); SetNull(n, false);}
+ virtual void SetValue(uchar cval, int n)
+- {Typp[n] = (TYPE)cval; SetNull(n, false);}
++ {UnalignedWrite(n, (TYPE)cval); SetNull(n, false);}
+ virtual void SetValue(PVAL valp, int n);
+ virtual void SetValue(PVBLK pv, int n1, int n2);
+ virtual void SetMin(PVAL valp, int n);
+@@ -206,6 +208,17 @@ class TYPBLK : public VALBLK {
+ // Members
+ TYPE* const &Typp;
+ const char *Fmt;
++
++ // Unaligned access
++ TYPE UnalignedRead(int n) const {
++ TYPE result;
++ memcpy(&result, Typp + n, sizeof(TYPE));
++ return result;
++ }
++
++ void UnalignedWrite(int n, TYPE value) {
++ memcpy(Typp + n, &value, sizeof(TYPE));
++ }
+ }; // end of class TYPBLK
+
+ /***********************************************************************/
+--- a/storage/connect/valblk.cpp
++++ b/storage/connect/valblk.cpp
+@@ -266,14 +266,14 @@ bool TYPBLK<TYPE>::Init(PGLOBAL g, bool
+ template <class TYPE>
+ char *TYPBLK<TYPE>::GetCharString(char *p, int n)
+ {
+- sprintf(p, Fmt, Typp[n]);
++ sprintf(p, Fmt, UnalignedRead(n));
+ return p;
+ } // end of GetCharString
+
+ template <>
+ char *TYPBLK<double>::GetCharString(char *p, int n)
+ {
+- sprintf(p, Fmt, Prec, Typp[n]);
++ sprintf(p, Fmt, Prec, UnalignedRead(n));
+ return p;
+ } // end of GetCharString
+
+@@ -289,7 +289,7 @@ void TYPBLK<TYPE>::SetValue(PVAL valp, i
+ ChkTyp(valp);
+
+ if (!(b = valp->IsNull()))
+- Typp[n] = GetTypedValue(valp);
++ UnalignedWrite(n, GetTypedValue(valp));
+ else
+ Reset(n);
+
+@@ -351,9 +351,9 @@ void TYPBLK<TYPE>::SetValue(PCSZ p, int
+ ulonglong val = CharToNumber(p, strlen(p), maxval, Unsigned, &minus);
+
+ if (minus && val < maxval)
+- Typp[n] = (TYPE)(-(signed)val);
++ UnalignedWrite(n, (TYPE)(-(signed)val));
+ else
+- Typp[n] = (TYPE)val;
++ UnalignedWrite(n, (TYPE)val);
+
+ SetNull(n, false);
+ } // end of SetValue
+@@ -396,7 +396,7 @@ void TYPBLK<double>::SetValue(PCSZ p, in
+ throw Type;
+ } // endif Check
+
+- Typp[n] = atof(p);
++ UnalignedWrite(n, atof(p));
+ SetNull(n, false);
+ } // end of SetValue
+
+@@ -428,7 +428,7 @@ void TYPBLK<TYPE>::SetValue(PVBLK pv, in
+ ChkTyp(pv);
+
+ if (!(b = pv->IsNull(n2) && Nullable))
+- Typp[n1] = GetTypedValue(pv, n2);
++ UnalignedWrite(n1, GetTypedValue(pv, n2));
+ else
+ Reset(n1);
+
+@@ -479,10 +479,10 @@ void TYPBLK<TYPE>::SetMin(PVAL valp, int
+ {
+ CheckParms(valp, n)
+ TYPE tval = GetTypedValue(valp);
+- TYPE& tmin = Typp[n];
++ TYPE tmin = UnalignedRead(n);
+
+ if (tval < tmin)
+- tmin = tval;
++ UnalignedWrite(n, tval);
+
+ } // end of SetMin
+
+@@ -494,10 +494,10 @@ void TYPBLK<TYPE>::SetMax(PVAL valp, int
+ {
+ CheckParms(valp, n)
+ TYPE tval = GetTypedValue(valp);
+- TYPE& tmin = Typp[n];
++ TYPE tmin = UnalignedRead(n);
+
+ if (tval > tmin)
+- tmin = tval;
++ UnalignedWrite(n, tval);
+
+ } // end of SetMax
+
+@@ -511,8 +511,7 @@ void TYPBLK<TYPE>::SetValues(PVBLK pv, i
+ CheckType(pv)
+ TYPE *lp = ((TYPBLK*)pv)->Typp;
+
+- for (register int i = k; i < n; i++) // TODO
+- Typp[i] = lp[i];
++ memcpy(Typp + k, lp + k, sizeof(TYPE) * n);
+
+ } // end of SetValues
+ #endif // 0
+@@ -523,7 +522,7 @@ void TYPBLK<TYPE>::SetValues(PVBLK pv, i
+ template <class TYPE>
+ void TYPBLK<TYPE>::Move(int i, int j)
+ {
+- Typp[j] = Typp[i];
++ UnalignedWrite(j, UnalignedRead(i));
+ MoveNull(i, j);
+ } // end of Move
+
+@@ -537,7 +536,7 @@ int TYPBLK<TYPE>::CompVal(PVAL vp, int n
+ ChkIndx(n);
+ ChkTyp(vp);
+ #endif // _DEBUG
+- TYPE mlv = Typp[n];
++ TYPE mlv = UnalignedRead(n);
+ TYPE vlv = GetTypedValue(vp);
+
+ return (vlv > mlv) ? 1 : (vlv < mlv) ? (-1) : 0;
+@@ -549,8 +548,8 @@ int TYPBLK<TYPE>::CompVal(PVAL vp, int n
+ template <class TYPE>
+ int TYPBLK<TYPE>::CompVal(int i1, int i2)
+ {
+- TYPE lv1 = Typp[i1];
+- TYPE lv2 = Typp[i2];
++ TYPE lv1 = UnalignedRead(i1);
++ TYPE lv2 = UnalignedRead(i2);
+
+ return (lv1 > lv2) ? 1 : (lv1 < lv2) ? (-1) : 0;
+ } // end of CompVal
+@@ -587,7 +586,7 @@ int TYPBLK<TYPE>::Find(PVAL vp)
+ TYPE n = GetTypedValue(vp);
+
+ for (i = 0; i < Nval; i++)
+- if (n == Typp[i])
++ if (n == UnalignedRead(i))
+ break;
+
+ return (i < Nval) ? i : (-1);
+@@ -603,7 +602,7 @@ int TYPBLK<TYPE>::GetMaxLength(void)
+ int i, n, m;
+
+ for (i = n = 0; i < Nval; i++) {
+- m = sprintf(buf, Fmt, Typp[i]);
++ m = sprintf(buf, Fmt, UnalignedRead(i));
+ n = MY_MAX(n, m);
+ } // endfor i
+
+@@ -1333,7 +1332,7 @@ char *DATBLK::GetCharString(char *p, int
+ char *vp;
+
+ if (Dvalp) {
+- Dvalp->SetValue(Typp[n]);
++ Dvalp->SetValue(UnalignedRead(n));
+ vp = Dvalp->GetCharString(p);
+ } else
+ vp = TYPBLK<int>::GetCharString(p, n);
+@@ -1349,7 +1348,7 @@ void DATBLK::SetValue(PCSZ p, int n)
+ if (Dvalp) {
+ // Decode the string according to format
+ Dvalp->SetValue_psz(p);
+- Typp[n] = Dvalp->GetIntValue();
++ UnalignedWrite(n, Dvalp->GetIntValue());
+ } else
+ TYPBLK<int>::SetValue(p, n);
+
diff --git a/utils/mariadb/patches/150-mips-innobase-atomic.patch b/utils/mariadb/patches/150-mips-innobase-atomic.patch
new file mode 100644
index 000000000..dd7db7cbe
--- /dev/null
+++ b/utils/mariadb/patches/150-mips-innobase-atomic.patch
@@ -0,0 +1,14 @@
+Author: James Cowgill <jcowgill@debian.org>
+Description: fix FTBFS on 32-bit mips*
+Bug-Debian: #864298
+
+--- a/storage/innobase/include/os0sync.h
++++ b/storage/innobase/include/os0sync.h
+@@ -37,6 +37,7 @@ Created 9/6/1995 Heikki Tuuri
+
+ #include "univ.i"
+ #include "ut0lst.h"
++#include "sync0types.h"
+
+ /** CPU cache line size */
+ #ifdef __powerpc__
diff --git a/utils/mariadb/patches/160-mips-machine.patch b/utils/mariadb/patches/160-mips-machine.patch
new file mode 100644
index 000000000..f7d083243
--- /dev/null
+++ b/utils/mariadb/patches/160-mips-machine.patch
@@ -0,0 +1,25 @@
+Description: Fix DEFAULT_MACHINE on mips
+ The DEFAULT_MACHINE constant is calculated from the CMAKE_SYSTEM_PROCESSOR
+ variable which contains the processor which built mariadb. Since most Debian
+ buildds run on 64-bit hardware even though they build 32-bit binaries,
+ DEFAULT_MACHINE previously contained "mips64" on 32-bit builds. This confuses
+ some mroonga tests which rely on DEFAULT_MACHINE to detect 64-bitness.
+ .
+ This patch fixes the value of DEFAULT_MACHINE so it always contains just "mips"
+ on 32-bit mips builds.
+Author: James Cowgill <jcowgill@debian.org>
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+--- mariadb-10.1.orig/cmake/package_name.cmake
++++ mariadb-10.1/cmake/package_name.cmake
+@@ -34,6 +34,10 @@ IF(NOT VERSION)
+ SET(DEFAULT_MACHINE "mips")
+ ENDIF()
+
++ IF(NOT 64BIT AND CMAKE_SYSTEM_PROCESSOR MATCHES "^mips64")
++ SET(DEFAULT_MACHINE "mips")
++ ENDIF()
++
+ IF(CMAKE_SYSTEM_NAME MATCHES "Windows")
+ SET(NEED_DASH_BETWEEN_PLATFORM_AND_MACHINE 0)
+ SET(DEFAULT_PLATFORM "win")
diff --git a/utils/mariadb/patches/170-ppc-remove-glibc-dep.patch b/utils/mariadb/patches/170-ppc-remove-glibc-dep.patch
new file mode 100644
index 000000000..e4b5a4a82
--- /dev/null
+++ b/utils/mariadb/patches/170-ppc-remove-glibc-dep.patch
@@ -0,0 +1,75 @@
+From f5cf70d9d1dc7f4cbeffb7fb75cbbe08720e3873 Mon Sep 17 00:00:00 2001
+From: Gustavo Romero <gromero@br.ibm.com>
+Date: Sun, 26 Mar 2017 15:08:15 +0000
+Subject: [PATCH] Remove dependency on glibc on PPC
+
+Remove dependency on glibc by using gcc builtin function and no glibc
+wrappers.
+
+Currently there are no surrogates in musl for:
+
+ __ppc_get_timebase()
+ __ppc_set_ppr_low()
+ __ppc_set_ppr_med()
+
+however glibc __ppc_get_timebase() is just a wrapper for GCC builtin
+__builtin_get_timebase() available since GCC 4.8 [1], so assuming that
+aports on ppc64le will never be built using GCC < 4.8 we can just
+switch directly to the GCC builtin function.
+
+Also __ppc_set_ppr_{low,med}() are not available on musl but both
+are simple glibc wrappers on a single asm instruction, hence there
+is no harm in using asm directly instead. Actually, using asm
+directly was the first solution adopted in MariaDB [2].
+
+[1] https://goo.gl/jxLV6O
+[2] https://goo.gl/9bjuVC
+
+--- a/storage/xtradb/include/ut0ut.h
++++ b/storage/xtradb/include/ut0ut.h
+@@ -86,8 +86,7 @@ private:
+ independent way by using YieldProcessor. */
+ # define UT_RELAX_CPU() YieldProcessor()
+ # elif defined(__powerpc__)
+-#include <sys/platform/ppc.h>
+-# define UT_RELAX_CPU() __ppc_get_timebase()
++# define UT_RELAX_CPU() __builtin_ppc_get_timebase()
+ # else
+ # define UT_RELAX_CPU() ((void)0) /* avoid warning for an empty statement */
+ # endif
+@@ -101,9 +100,8 @@ private:
+ #endif
+
+ # if defined(HAVE_HMT_PRIORITY_INSTRUCTION)
+-#include <sys/platform/ppc.h>
+-# define UT_LOW_PRIORITY_CPU() __ppc_set_ppr_low()
+-# define UT_RESUME_PRIORITY_CPU() __ppc_set_ppr_med()
++# define UT_LOW_PRIORITY_CPU() __asm__ __volatile__ ("or 1,1,1")
++# define UT_RESUME_PRIORITY_CPU() __asm__ __volatile__ ("or 2,2,2")
+ # else
+ # define UT_LOW_PRIORITY_CPU() ((void)0)
+ # define UT_RESUME_PRIORITY_CPU() ((void)0)
+--- a/storage/innobase/include/ut0ut.h
++++ b/storage/innobase/include/ut0ut.h
+@@ -89,8 +89,7 @@ private:
+ independent way by using YieldProcessor. */
+ # define UT_RELAX_CPU() YieldProcessor()
+ # elif defined(__powerpc__)
+-#include <sys/platform/ppc.h>
+-# define UT_RELAX_CPU() __ppc_get_timebase()
++# define UT_RELAX_CPU() __builtin_ppc_get_timebase()
+ # else
+ # define UT_RELAX_CPU() ((void)0) /* avoid warning for an empty statement */
+ # endif
+@@ -104,9 +103,8 @@ private:
+ #endif
+
+ # if defined(HAVE_HMT_PRIORITY_INSTRUCTION)
+-#include <sys/platform/ppc.h>
+-# define UT_LOW_PRIORITY_CPU() __ppc_set_ppr_low()
+-# define UT_RESUME_PRIORITY_CPU() __ppc_set_ppr_med()
++# define UT_LOW_PRIORITY_CPU() __asm__ __volatile__ ("or 1,1,1")
++# define UT_RESUME_PRIORITY_CPU() __asm__ __volatile__ ("or 2,2,2")
+ # else
+ # define UT_LOW_PRIORITY_CPU() ((void)0)
+ # define UT_RESUME_PRIORITY_CPU() ((void)0)