ASR_BASE

Change-Id: Icf3719cc0afe3eeb3edc7fa80a2eb5199ca9dda1
diff --git a/external/subpack/libs/libmariadb/Makefile b/external/subpack/libs/libmariadb/Makefile
new file mode 100644
index 0000000..32a7bef
--- /dev/null
+++ b/external/subpack/libs/libmariadb/Makefile
@@ -0,0 +1,176 @@
+#
+# Copyright (C) 2019 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:=libmariadb
+PKG_VERSION:=3.4.1
+PKG_RELEASE:=1
+
+PKG_SOURCE:=mariadb-connector-c-$(PKG_VERSION)-src.tar.gz
+PKG_SOURCE_URL:=\
+	https://mirror.netcologne.de/mariadb/connector-c-$(PKG_VERSION) \
+	https://ftp.yz.yamagata-u.ac.jp/pub/dbms/mariadb/connector-c-$(PKG_VERSION) \
+	https://dlm.mariadb.com/3907132/Connectors/c/connector-c-$(PKG_VERSION)
+PKG_HASH:=0a7f2522a44a7369c1dda89676e43485037596a7b1534898448175178aedeb4d
+PKG_BUILD_DIR:=$(BUILD_DIR)/mariadb-connector-c-$(PKG_VERSION)-src
+
+PKG_MAINTAINER:=Michal Hrusecky <Michal@Hrusecky.net>
+PKG_LICENSE:=LGPL-2.1-or-later
+PKG_LICENSE_FILES:=COPYING.LIB
+PKG_CPE_ID:=cpe:/a:mariadb:mariadb
+
+MARIADB_CONF_DIR:=/etc/mysql
+MARIADB_PLUGIN_DIR:=/usr/lib/mariadb/plugin
+
+MARIADB_PORT=3306
+MARIADB_SOCKET=/var/run/mysql/mysql.sock
+
+MARIADB_CLIENT_PLUGINS := \
+	auth_gssapi_client \
+	remote_io
+
+PKG_BUILD_DEPENDS:=curl USE_MUSL:libucontext
+
+PKG_CONFIG_DEPENDS := \
+	$(patsubst %,CONFIG_PACKAGE_$(PKG_NAME)-plugin-%,$(subst _,-,$(MARIADB_CLIENT_PLUGINS)))
+
+plugin-auth_gssapi_client       := CLIENT_PLUGIN_AUTH_GSSAPI_CLIENT
+plugin-remote_io                := CLIENT_PLUGIN_REMOTE_IO
+
+include $(INCLUDE_DIR)/package.mk
+include $(INCLUDE_DIR)/nls.mk
+include $(INCLUDE_DIR)/cmake.mk
+
+# Pass CPPFLAGS in the CFLAGS as otherwise the build system will ignore them.
+TARGET_CFLAGS+=$(TARGET_CPPFLAGS)
+
+define Package/$(PKG_NAME)/install/plugin
+	$(INSTALL_BIN) $(PKG_INSTALL_DIR)$(MARIADB_PLUGIN_DIR)/$(2).so $(1)$(MARIADB_PLUGIN_DIR)
+endef
+
+define Package/$(PKG_NAME)/Default
+  SECTION:=libs
+  CATEGORY:=Libraries
+  URL:=https://mariadb.org/
+  SUBMENU:=Database
+endef
+
+define Package/$(PKG_NAME)/description/Default
+MariaDB is a very fast and robust SQL database server.
+endef
+
+define Package/$(PKG_NAME)
+  $(call Package/$(PKG_NAME)/Default)
+  DEPENDS:= \
+	  $(ICONV_DEPENDS) \
+	  +libopenssl \
+	  +zlib
+  TITLE:=MariaDB database client library
+  MENU:=1
+  PROVIDES:=libmariadbclient libmysqlclient libmysqlclient-r
+  ABI_VERSION:=3
+endef
+
+define Package/$(PKG_NAME)/description
+$(call Package/$(PKG_NAME)/description/Default)
+
+This package includes the client library.
+
+endef
+
+# We won't need unit tests
+CMAKE_OPTIONS += -DWITH_UNIT_TESTS=0
+
+CMAKE_OPTIONS += \
+	-DDEFAULT_CHARSET=utf8 \
+	-DDEFAULT_COLLATION=utf8_general_ci \
+	-DINSTALL_INCLUDEDIR=include/mysql \
+	-DINSTALL_LIBDIR=lib \
+	-DINSTALL_PLUGINDIR=lib/mariadb/plugin \
+	-DMARIADB_UNIX_ADDR=$(MARIADB_SOCKET) \
+	-DWITH_EXTERNAL_ZLIB=YES \
+	-DWITH_MYSQLCOMPAT=ON \
+	-DWITH_SSL=OPENSSL
+
+# Help MariaDB find the correct libiconv.
+# nls.mk sets it up so that with CONFIG_BUILD_NLS libiconv-full would be used,
+# otherwise libiconv-stub (independent of the selected libc). MariaDB needs a
+# leg up to find/pick the right lib.
+CMAKE_OPTIONS += \
+	-DICONV_INCLUDE_DIR=$(ICONV_PREFIX)/include \
+	-DICONV_LIBRARIES=$(ICONV_PREFIX)/lib/libiconv.$(if $(CONFIG_BUILD_NLS),so,a)
+
+CMAKE_OPTIONS += \
+	$(foreach p,$(MARIADB_CLIENT_PLUGINS),-D$(plugin-$(p))=$(if $(CONFIG_PACKAGE_$(PKG_NAME)-plugin-$(subst _,-,$(p))),DYNAMIC,OFF))
+
+# LIBICONV_PLUG is used in GNU's libiconv for redefinition of exports [e.g.
+# from libiconv_open() to iconv_open()]. But in OpenWrt this variable is not set
+# when building libiconv-full. So when MariaDB sets LIBICONV_PLUG it expects
+# iconv_open() to be available for example, which is not the case - only
+# libiconv_open() is. To address this prevent the variable from being set.
+# libiconv-stub does not use this variable, so there is no harm in always doing
+# this.
+
+define Build/Prepare
+	$(call Build/Prepare/Default)
+	$(SED) '/ADD_DEFINITIONS(-DLIBICONV_PLUG)/d' $(PKG_BUILD_DIR)/CMakeLists.txt
+endef
+
+define Build/InstallDev
+	$(INSTALL_DIR) $(1)/usr/bin $(1)/usr/include $(1)/usr/lib/mysql $(1)/usr/lib/pkgconfig $(2)/bin
+	$(CP) $(PKG_INSTALL_DIR)/usr/include/mysql $(1)/usr/include
+	cd $(1)/usr/include/mysql; $(LN) mariadb_version.h mysql_version.h
+	$(CP) $(PKG_INSTALL_DIR)/usr/lib/lib{mariadb,mysqlclient}*.so* $(1)/usr/lib
+	cd $(1)/usr/lib/mysql; $(LN) ../lib{mariadb,mysqlclient}*.so* .
+	$(INSTALL_BIN) files/mysql_config $(1)/usr/bin
+	$(LN) $(STAGING_DIR)/usr/bin/mysql_config $(2)/bin
+	$(SED) 's/PORT/$(MARIADB_PORT)/' $(1)/usr/bin/mysql_config
+	$(SED) 's|PLUGIN_DIR|$(MARIADB_PLUGIN_DIR)|' $(1)/usr/bin/mysql_config
+	$(SED) 's|SOCKET|$(MARIADB_SOCKET)|' $(1)/usr/bin/mysql_config
+	cd "$(PKG_BUILD_DIR)/mariadb_config"; \
+		CLIENT_VERSION=`sed -n 's|^#define[[:blank:]]*VERSION[[:blank:]]*"\([0-9.]*\)"|\1|p' mariadb_config.c`; \
+		$(SED) "s/VERSION/$$$${CLIENT_VERSION}/" $(1)/usr/bin/mysql_config
+	$(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libmariadb.pc $(1)/usr/lib/pkgconfig
+endef
+
+define Package/$(PKG_NAME)/install
+	$(INSTALL_DIR) $(1)$(MARIADB_CONF_DIR)/conf.d
+	$(INSTALL_DIR) $(1)$(MARIADB_PLUGIN_DIR)
+	$(INSTALL_BIN) \
+		$(PKG_INSTALL_DIR)$(MARIADB_PLUGIN_DIR)/caching_sha2_password.so \
+		$(PKG_INSTALL_DIR)$(MARIADB_PLUGIN_DIR)/client_ed25519.so \
+		$(PKG_INSTALL_DIR)$(MARIADB_PLUGIN_DIR)/dialog.so \
+		$(PKG_INSTALL_DIR)$(MARIADB_PLUGIN_DIR)/mysql_clear_password.so \
+		$(PKG_INSTALL_DIR)$(MARIADB_PLUGIN_DIR)/sha256_password.so \
+		$(1)$(MARIADB_PLUGIN_DIR)
+	$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/libmariadb.so.$(ABI_VERSION) $(1)/usr/lib
+endef
+
+define BuildPlugin
+  define Package/$(PKG_NAME)-plugin-$(subst _,-,$(1))
+    $(call Package/$(PKG_NAME)/Default)
+    TITLE:=$(PKG_NAME) plugin
+    DEPENDS:=$(PKG_NAME) $(patsubst +%,+PACKAGE_$(PKG_NAME)-plugin-$(subst _,-,$(1)):%,$(2))
+  endef
+  define Package/$(PKG_NAME)-plugin-$(subst _,-,$(1))/description
+    $(call Package/$(PKG_NAME)/description/Default)
+
+This package provides the $(1) plugin.
+
+  endef
+  define Package/$(PKG_NAME)-plugin-$(subst _,-,$(1))/install
+	  $(INSTALL_DIR) $$(1)$(MARIADB_PLUGIN_DIR)
+	  $(call Package/$(PKG_NAME)/install/plugin,$$(1),$(1))
+  endef
+  $$(eval $$(call BuildPackage,$(PKG_NAME)-plugin-$(subst _,-,$(1))))
+endef
+
+$(eval $(call BuildPackage,$(PKG_NAME)))
+
+$(eval $(call BuildPlugin,auth_gssapi_client,+krb5-libs))
+$(eval $(call BuildPlugin,remote_io,+libcurl))
diff --git a/external/subpack/libs/libmariadb/files/mysql_config b/external/subpack/libs/libmariadb/files/mysql_config
new file mode 100755
index 0000000..5c4dfbd
--- /dev/null
+++ b/external/subpack/libs/libmariadb/files/mysql_config
@@ -0,0 +1,61 @@
+#!/bin/sh
+
+PCFILE=libmariadb
+
+command -v pkg-config > /dev/null 2>&1
+ret="$?"
+if [ "$ret" -ne 0 ]; then
+        echo pkg-config not found >&2
+        exit 1
+fi
+
+pkg-config $PCFILE > /dev/null 2>&1
+ret="$?"
+if [ "$ret" -ne 0 ]; then
+        echo $PCFILE pkg-config file missing >&2
+        exit 1
+fi
+
+cflags=$(pkg-config $PCFILE --cflags)
+include=$(pkg-config $PCFILE --cflags)
+libs=$(pkg-config $PCFILE --libs)
+plugindir=PLUGIN_DIR
+socket=SOCKET
+port=PORT
+version=VERSION
+
+usage () {
+        cat <<EOF
+Usage: $0 [OPTIONS]
+Options:
+        --cflags         [$cflags]
+        --include        [$include]
+        --libs           [$libs]
+        --libs_r         [$libs]
+        --plugindir      [$plugindir]
+        --socket         [$socket]
+        --port           [$port]
+        --version        [$version]
+EOF
+  exit "$1"
+}
+
+if test $# -le 0; then usage 0 ; fi
+
+while test $# -gt 0; do
+        case $1 in
+        --cflags)  echo "$cflags" ;;
+        --include) echo "$include" ;;
+        --libs)    echo "$libs" ;;
+        --libs_r)  echo "$libs" ;;
+        --plugindir) echo "$plugindir" ;;
+        --socket)  echo "$socket" ;;
+        --port)    echo "$port" ;;
+        --version) echo "$version" ;;
+        *) usage 1 >&2 ;;
+        esac
+
+        shift
+done
+
+exit 0
diff --git a/external/subpack/libs/libmariadb/patches/010-link-to-libucontext.patch b/external/subpack/libs/libmariadb/patches/010-link-to-libucontext.patch
new file mode 100644
index 0000000..ebde0c1
--- /dev/null
+++ b/external/subpack/libs/libmariadb/patches/010-link-to-libucontext.patch
@@ -0,0 +1,61 @@
+libmariadb: Fix async api by linking to libucontext
+The asynchronous API of libmariadb uses cooperative multi threading
+by using the system calls
+  * makecontext
+  * swapcontext
+  * getcontext
+  * setcontext
+of the ucontext.h C-API.
+
+Thus additionally link libmariadb to libucontext which is a library
+providing these system calls on platforms not supporting them out of
+the box - like musl based platforms.
+--- a/libmariadb/CMakeLists.txt
++++ b/libmariadb/CMakeLists.txt
+@@ -458,7 +458,7 @@ ELSE()
+   SET_TARGET_PROPERTIES(libmariadb PROPERTIES LINKER_LANGUAGE C)
+ ENDIF()
+ 
+-TARGET_LINK_LIBRARIES(libmariadb LINK_PRIVATE ${SYSTEM_LIBS} ${CRYPTO_LIBS})
++TARGET_LINK_LIBRARIES(libmariadb LINK_PRIVATE ${SYSTEM_LIBS} ${CRYPTO_LIBS} ${LIBUCONTEXT_POSIX} ${LIBUCONTEXT})
+ 
+ SIGN_TARGET(libmariadb)
+ 
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -251,6 +251,14 @@ IF(UNIX)
+   SEARCH_LIBRARY(LIBPTHREAD pthread_getspecific "pthread;pthreads")
+   SEARCH_LIBRARY(LIBNSL gethostbyname_r "nsl_r;nsl")
+   SEARCH_LIBRARY(LIBSOCKET setsockopt socket)
++  SEARCH_LIBRARY(LIBUCONTEXT libucontext_swapcontext libucontext.a)
++  SEARCH_LIBRARY(LIBUCONTEXT_POSIX swapcontext libucontext_posix.a)
++  IF (NOT HAVE_LIBUCONTEXT_POSIX OR NOT HAVE_LIBUCONTEXT)
++    UNSET(HAVE_LIBUCONTEXT)
++    UNSET(LIBUCONTEXT)
++    UNSET(HAVE_LIBUCONTEXT_POSIX)
++    UNSET(LIBUCONTEXT_POSIX)
++  ENDIF()
+   FIND_PACKAGE(Threads)
+   SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${LIBNSL} ${LIBBIND} ${LIBICONV} ${ZLIB_LIBRARY} 
+       ${LIBSOCKET} ${CMAKE_DL_LIBS} ${LIBM} ${LIBPTHREAD})
+--- a/include/ma_config.h.in
++++ b/include/ma_config.h.in
+@@ -28,6 +28,7 @@
+ #cmakedefine HAVE_SYS_UN_H 1
+ #cmakedefine HAVE_UNISTD_H 1
+ #cmakedefine HAVE_UCONTEXT_H 1
++#cmakedefine HAVE_LIBUCONTEXT_POSIX 1
+ 
+ /*
+  * function definitions - processed in LibmysqlFunctions.txt 
+--- a/include/ma_context.h
++++ b/include/ma_context.h
+@@ -32,7 +32,7 @@
+ #define MY_CONTEXT_USE_X86_64_GCC_ASM
+ #elif defined(__GNUC__) && __GNUC__ >= 3 && defined(__i386__)
+ #define MY_CONTEXT_USE_I386_GCC_ASM
+-#elif defined(HAVE_UCONTEXT_H)
++#elif defined(HAVE_UCONTEXT_H) || defined(HAVE_LIBUCONTEXT_POSIX)
+ #define MY_CONTEXT_USE_UCONTEXT
+ #else
+ #define MY_CONTEXT_DISABLE
diff --git a/external/subpack/libs/libmariadb/patches/020-fix-ucontext-maybe-uninitialized.patch b/external/subpack/libs/libmariadb/patches/020-fix-ucontext-maybe-uninitialized.patch
new file mode 100644
index 0000000..d350e7a
--- /dev/null
+++ b/external/subpack/libs/libmariadb/patches/020-fix-ucontext-maybe-uninitialized.patch
@@ -0,0 +1,12 @@
+--- a/libmariadb/ma_context.c
++++ b/libmariadb/ma_context.c
+@@ -92,6 +92,9 @@ my_context_spawn(struct my_context *c, v
+ {
+   int err;
+   union pass_void_ptr_as_2_int u;
++  // Avoid 'may be used uninitialized' error on 32-bit systems
++  // upstream issue: https://jira.mariadb.org/browse/CONC-725
++  u.a[1] = 0;
+ 
+   err= getcontext(&c->spawned_context);
+   if (err)