aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOleksii Samorukov <samm@FreeBSD.org>2024-09-04 16:08:39 +0000
committerOleksii Samorukov <samm@FreeBSD.org>2024-09-04 16:10:40 +0000
commit1f28cb4002a8698562b90c773b3c02d8d321ef9c (patch)
tree6940d557d51f930b3cff1c3be2b738f66c309c24
parent1d0a9a71924672708232a1f81a6c8951e78f0ab1 (diff)
downloadports-1f28cb4002a8698562b90c773b3c02d8d321ef9c.tar.gz
ports-1f28cb4002a8698562b90c773b3c02d8d321ef9c.zip
databases/xtrabackup84: new port to backup MySQL 8.4 database
Based on xtrabackup83 port, with corresponding changes, including: - usage of bundled boost - disable build on 32bit platforms (unsupported by vendor) - new patches from mysql-server84.
-rw-r--r--databases/Makefile1
-rw-r--r--databases/xtrabackup84/Makefile74
-rw-r--r--databases/xtrabackup84/distinfo3
-rw-r--r--databases/xtrabackup84/files/patch-CMakeLists.txt22
-rw-r--r--databases/xtrabackup84/files/patch-cmake-install_layout.cmake11
-rw-r--r--databases/xtrabackup84/files/patch-file_utils20
-rw-r--r--databases/xtrabackup84/files/patch-include_my__stacktrace.h11
-rw-r--r--databases/xtrabackup84/files/patch-libs_mysql_serialization_archive.h19
-rw-r--r--databases/xtrabackup84/files/patch-libs_mysql_serialization_serializer__default__impl.hpp42
-rw-r--r--databases/xtrabackup84/files/patch-libs_mysql_serialization_serializer__impl.hpp22
-rw-r--r--databases/xtrabackup84/files/patch-llvm-1528
-rw-r--r--databases/xtrabackup84/files/patch-procps34
-rw-r--r--databases/xtrabackup84/files/patch-protobuf10
-rw-r--r--databases/xtrabackup84/files/patch-sql_auth_sql__authorization.cc13
-rw-r--r--databases/xtrabackup84/files/patch-storage_innobase_include_srv0mon.h13
-rw-r--r--databases/xtrabackup84/files/patch-storage_innobase_include_ut0crc32.h12
-rw-r--r--databases/xtrabackup84/files/patch-storage_innobase_ut_crc32.cc104
-rw-r--r--databases/xtrabackup84/files/patch-storage_innobase_xtrabackup_src_utils.cc59
-rw-r--r--databases/xtrabackup84/files/patch-storage_innobase_xtrabackup_xbcloud__osenv.sh15
-rw-r--r--databases/xtrabackup84/pkg-descr4
-rw-r--r--databases/xtrabackup84/pkg-plist9
21 files changed, 526 insertions, 0 deletions
diff --git a/databases/Makefile b/databases/Makefile
index 1107c8d731fa..fc6dff3e7ddc 100644
--- a/databases/Makefile
+++ b/databases/Makefile
@@ -1108,6 +1108,7 @@
SUBDIR += xrootd
SUBDIR += xtrabackup80
SUBDIR += xtrabackup81
+ SUBDIR += xtrabackup84
SUBDIR += zodb
.include <bsd.port.subdir.mk>
diff --git a/databases/xtrabackup84/Makefile b/databases/xtrabackup84/Makefile
new file mode 100644
index 000000000000..36fd38ac1f15
--- /dev/null
+++ b/databases/xtrabackup84/Makefile
@@ -0,0 +1,74 @@
+PORTNAME= xtrabackup84
+PORTVERSION= 8.4.0
+DISTVERSIONSUFFIX= -1
+CATEGORIES= databases
+MASTER_SITES= https://downloads.percona.com/downloads/Percona-XtraBackup-innovative-release/Percona-XtraBackup-8.4.0-1/source/tarball/:percona
+DISTFILES= ${PPORTNAME}-${DVERSION}${EXTRACT_SUFX}:percona
+
+MAINTAINER= samm@FreeBSD.org
+COMMENT= Open-source backup tool for InnoDB and XtraDB
+WWW= https://www.percona.com/doc/percona-xtrabackup/
+
+LICENSE= GPLv2
+LICENSE_FILE= ${WRKSRC}/LICENSE
+
+# MySQL8.2+ supports only 64-bit platforms
+NOT_FOR_ARCHS= armv6 armv7 i386 powerpc
+
+BUILD_DEPENDS= protobuf>=3.0:devel/protobuf \
+ rapidjson>=1.1.0:devel/rapidjson \
+ libevent>=2.1:devel/libevent
+LIB_DEPENDS= libcurl.so:ftp/curl \
+ libev.so:devel/libev \
+ libgcrypt.so:security/libgcrypt \
+ libgpg-error.so:security/libgpg-error \
+ libicudata.so:devel/icu \
+ libprotobuf-lite.so:devel/protobuf \
+ libunwind.so:devel/libunwind \
+ libzstd.so:archivers/zstd
+RUN_DEPENDS= qpress:archivers/qpress
+
+USES= bison cmake compiler:c++14-lang cpe pkgconfig ssl
+CPE_VENDOR= percona
+CMAKE_ARGS= -DBUILD_CONFIG:STRING=xtrabackup_release \
+ -DWITHOUT_COMPONENT_KEYRING_KMIP:STRING=yes \
+ -DWITH_VERSION_CHECK=false
+
+.for component in EDITLINE ICU LIBEVENT PROTOBUF RAPIDJSON ZSTD
+CMAKE_ARGS+= -DWITH_${component}:STRING=system
+.endfor
+
+CONFLICTS_INSTALL= ${PORTNAME:C/.$//}*
+
+# Build fails without NDEBUG, so force it
+CFLAGS+= -DNDEBUG -fPIC
+CXXFLAGS+= -DNDEBUG -fPIC
+CFLAGS_aarch64?= -march=armv8-a+crc+crypto
+
+DVERSION= ${PORTVERSION}${DISTVERSIONSUFFIX}
+PPORTNAME= percona-xtrabackup
+WRKSRC= ${WRKDIR}/${PPORTNAME}-${DVERSION}
+
+.include <bsd.port.pre.mk>
+
+KEEP_EXTRA= lz4 zlib libbacktrace libcno boost unordered_dense
+
+post-patch:
+.for d in storage/innobase/xtrabackup/src sql/protobuf
+ ${REINPLACE_CMD} 's,%%PREFIX%%,${PREFIX},' ${WRKSRC}/${d}/CMakeLists.txt
+.endfor
+
+pre-configure:
+.for dir in ${KEEP_EXTRA}
+ @${MV} ${WRKSRC}/extra/${dir} ${WRKDIR}
+.endfor
+ @${RM} -r ${WRKSRC}/extra/*
+.for dir in ${KEEP_EXTRA}
+ @${MV} ${WRKDIR}/${dir} ${WRKSRC}/extra
+.endfor
+
+post-stage:
+ @${RM} -r ${STAGEDIR}${PREFIX}/docs ${STAGEDIR}${PREFIX}/man
+ @${RMDIR} ${STAGEDIR}${PREFIX}/lib/plugin/debug
+
+.include <bsd.port.post.mk>
diff --git a/databases/xtrabackup84/distinfo b/databases/xtrabackup84/distinfo
new file mode 100644
index 000000000000..6c72ea924b11
--- /dev/null
+++ b/databases/xtrabackup84/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1725152102
+SHA256 (percona-xtrabackup-8.4.0-1.tar.gz) = d55caa8f8bfcc33ec299c22a16311fd9595b00c04543e0f7abde553e38e96e0b
+SIZE (percona-xtrabackup-8.4.0-1.tar.gz) = 432545459
diff --git a/databases/xtrabackup84/files/patch-CMakeLists.txt b/databases/xtrabackup84/files/patch-CMakeLists.txt
new file mode 100644
index 000000000000..8152347c2ee0
--- /dev/null
+++ b/databases/xtrabackup84/files/patch-CMakeLists.txt
@@ -0,0 +1,22 @@
+--- CMakeLists.txt.orig 2023-10-19 12:05:28 UTC
++++ CMakeLists.txt
+@@ -2094,8 +2094,6 @@ IF(WITH_PROTOBUF STREQUAL "bundled" OR WITH_FIDO STREQ
+ ENDIF()
+ ENDIF()
+
+-ADD_SUBDIRECTORY(extra/libkmip)
+-
+ #
+ # Setup maintainer mode options by the end. Platform checks are
+ # not run with the warning options as to not perturb fragile checks
+@@ -2345,10 +2343,6 @@ ENDIF()
+
+ IF(ENABLE_GCOV)
+ INCLUDE(fastcov)
+-ENDIF()
+-
+-IF(UNIX)
+- ADD_SUBDIRECTORY(man)
+ ENDIF()
+
+ IF(LINUX AND NOT WITHOUT_SERVER)
diff --git a/databases/xtrabackup84/files/patch-cmake-install_layout.cmake b/databases/xtrabackup84/files/patch-cmake-install_layout.cmake
new file mode 100644
index 000000000000..f5916ece2f0b
--- /dev/null
+++ b/databases/xtrabackup84/files/patch-cmake-install_layout.cmake
@@ -0,0 +1,11 @@
+--- cmake/install_layout.cmake.orig 2023-10-19 12:05:28 UTC
++++ cmake/install_layout.cmake
+@@ -159,7 +159,7 @@ SET(INSTALL_INFODIR_STANDALONE "docs")
+ #
+ SET(INSTALL_SHAREDIR_STANDALONE "share")
+ SET(INSTALL_MYSQLSHAREDIR_STANDALONE "share")
+-SET(INSTALL_MYSQLTESTDIR_STANDALONE "xtrabackup-test")
++# SET(INSTALL_MYSQLTESTDIR_STANDALONE "xtrabackup-test")
+ SET(INSTALL_SUPPORTFILESDIR_STANDALONE "support-files")
+ #
+ SET(INSTALL_MYSQLDATADIR_STANDALONE "data")
diff --git a/databases/xtrabackup84/files/patch-file_utils b/databases/xtrabackup84/files/patch-file_utils
new file mode 100644
index 000000000000..a23aa72136d4
--- /dev/null
+++ b/databases/xtrabackup84/files/patch-file_utils
@@ -0,0 +1,20 @@
+--- storage/innobase/xtrabackup/src/file_utils.cc.orig 2023-11-24 17:33:10.000000000 +0700
++++ storage/innobase/xtrabackup/src/file_utils.cc 2024-02-17 00:40:45.193255000 +0700
+@@ -20,7 +20,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Bos
+
+ #include "file_utils.h"
+ #include <mysql/service_mysql_alloc.h>
+-#ifdef __APPLE__
++#if defined(__APPLE__) || defined (__FreeBSD__)
+ #include <sys/event.h>
+ #else
+ #include <sys/epoll.h>
+@@ -391,7 +391,7 @@ File open_fifo_for_read_with_timeout(const char *path,
+ }
+
+ /* File was open, lets check its open on the other side */
+-#ifdef __APPLE__
++#if defined(__APPLE__) || defined(__FreeBSD__)
+ struct timespec tm = {timeout, 0};
+ int kqueue_fd = kqueue();
+ if (kqueue_fd < 0) {
diff --git a/databases/xtrabackup84/files/patch-include_my__stacktrace.h b/databases/xtrabackup84/files/patch-include_my__stacktrace.h
new file mode 100644
index 000000000000..c9435e093fd5
--- /dev/null
+++ b/databases/xtrabackup84/files/patch-include_my__stacktrace.h
@@ -0,0 +1,11 @@
+--- include/my_stacktrace.h.orig 2024-04-10 06:26:28 UTC
++++ include/my_stacktrace.h
+@@ -45,7 +45,7 @@
+ _WIN32 - Windows
+ HAVE_EXT_BACKTRACE - Unixes without backtrace(3)
+ */
+-#if defined(HAVE_BACKTRACE) || defined(_WIN32) || defined(HAVE_EXT_BACKTRACE)
++#if (defined(HAVE_BACKTRACE) && (defined(__aarch64__) || defined(__amd64__))) || defined(_WIN32) || defined(HAVE_EXT_BACKTRACE)
+ #define HAVE_STACKTRACE 1
+ void my_init_stacktrace();
+ void my_print_stacktrace(const uchar *stack_bottom, ulong thread_stack);
diff --git a/databases/xtrabackup84/files/patch-libs_mysql_serialization_archive.h b/databases/xtrabackup84/files/patch-libs_mysql_serialization_archive.h
new file mode 100644
index 000000000000..9c5c096c2b6b
--- /dev/null
+++ b/databases/xtrabackup84/files/patch-libs_mysql_serialization_archive.h
@@ -0,0 +1,19 @@
+--- libs/mysql/serialization/archive.h.orig 2024-07-12 19:20:22 UTC
++++ libs/mysql/serialization/archive.h
+@@ -81,14 +81,14 @@ class Archive {
+ /// @note To be implemented in Archive_derived_type
+ template <typename Type>
+ static std::size_t get_size(Type &&arg) {
+- return Archive_derived_type::template get_size(std::forward<Type>(arg));
++ return Archive_derived_type::template get_size<>(std::forward<Type>(arg));
+ }
+
+ /// @brief Returns archive size - size of data written to the archive
+ /// @return archive size - size of data written to the archive
+ /// @note To be implemented in Archive_derived_type
+ inline std::size_t get_size_written() const {
+- return Archive_derived_type::template get_size_written();
++ return Archive_derived_type::template get_size_written<>();
+ }
+
+ /// @brief Function returns maximum size of the Type
diff --git a/databases/xtrabackup84/files/patch-libs_mysql_serialization_serializer__default__impl.hpp b/databases/xtrabackup84/files/patch-libs_mysql_serialization_serializer__default__impl.hpp
new file mode 100644
index 000000000000..43dd9792cd34
--- /dev/null
+++ b/databases/xtrabackup84/files/patch-libs_mysql_serialization_serializer__default__impl.hpp
@@ -0,0 +1,42 @@
+--- libs/mysql/serialization/serializer_default_impl.hpp.orig 2024-07-12 19:20:22 UTC
++++ libs/mysql/serialization/serializer_default_impl.hpp
+@@ -233,7 +233,7 @@ std::size_t Serializer_default<Archive_concrete_type>:
+ template <class Field_type, Field_size field_size_defined, typename Enabler>
+ std::size_t Serializer_default<Archive_concrete_type>::get_field_size(
+ const Field_type &field) {
+- return Archive_concrete_type::template get_size(
++ return Archive_concrete_type::template get_size<>(
+ Field_wrapper<const Field_type, field_size_defined>(field));
+ }
+
+@@ -473,7 +473,7 @@ std::size_t Serializer_default<Archive_concrete_type>:
+ std::size_t calculated_size = 0;
+ bool is_provided = field_definition.run_encode_predicate();
+ if (is_provided) {
+- auto size_id_type = Archive_concrete_type::template get_size(
++ auto size_id_type = Archive_concrete_type::template get_size<>(
+ create_varlen_field_wrapper(field_id));
+ calculated_size = get_field_size<Field_type, field_size_defined>(
+ field_definition.get_ref()) +
+@@ -489,18 +489,18 @@ std::size_t Serializer_default<Archive_concrete_type>:
+ bool skip_id) {
+ std::size_t serializable_overhead_type = 0;
+ if (skip_id == false) {
+- serializable_overhead_type = Archive_concrete_type::template get_size(
++ serializable_overhead_type = Archive_concrete_type::template get_size<>(
+ create_varlen_field_wrapper(field_id));
+ }
+ auto serializable_size = serializable.template get_size_internal<Base_type>();
+- auto serializable_overhead_size = Archive_concrete_type::template get_size(
++ auto serializable_overhead_size = Archive_concrete_type::template get_size<>(
+ create_varlen_field_wrapper(serializable_size));
+
+ Field_id_type last_non_ignorable_field_id =
+ find_last_non_ignorable_field_id(serializable);
+
+ auto serializable_overhead_last_non_ignorable_field_id =
+- Archive_concrete_type::template get_size(
++ Archive_concrete_type::template get_size<>(
+ create_varlen_field_wrapper(last_non_ignorable_field_id));
+ return serializable_overhead_type + serializable_overhead_size +
+ serializable_overhead_last_non_ignorable_field_id + serializable_size;
diff --git a/databases/xtrabackup84/files/patch-libs_mysql_serialization_serializer__impl.hpp b/databases/xtrabackup84/files/patch-libs_mysql_serialization_serializer__impl.hpp
new file mode 100644
index 000000000000..da31e03eb489
--- /dev/null
+++ b/databases/xtrabackup84/files/patch-libs_mysql_serialization_serializer__impl.hpp
@@ -0,0 +1,22 @@
+--- libs/mysql/serialization/serializer_impl.hpp.orig 2024-07-12 19:20:22 UTC
++++ libs/mysql/serialization/serializer_impl.hpp
+@@ -51,8 +51,8 @@ Serializer<Serializer_derived_type, Archive_type>::get
+ Serializer<Serializer_derived_type, Archive_type>::get_size_field_def(
+ Field_id_type field_id,
+ const Field_definition<Field_type, field_size_defined> &field_definition) {
+- return Serializer_derived_type::template get_size_field_def(field_id,
+- field_definition);
++ return Serializer_derived_type::template get_size_field_def<>(
++ field_id, field_definition);
+ }
+
+ template <class Serializer_derived_type, class Archive_type>
+@@ -61,7 +61,7 @@ Serializer<Serializer_derived_type, Archive_type>::get
+ Serializer<Serializer_derived_type, Archive_type>::get_size_serializable(
+ Field_id_type field_id, const Serializable_concrete_type &serializable,
+ bool skip_id) {
+- return Serializer_derived_type::template get_size_serializable(
++ return Serializer_derived_type::template get_size_serializable<>(
+ field_id, serializable, skip_id);
+ }
+
diff --git a/databases/xtrabackup84/files/patch-llvm-15 b/databases/xtrabackup84/files/patch-llvm-15
new file mode 100644
index 000000000000..0017d73b5902
--- /dev/null
+++ b/databases/xtrabackup84/files/patch-llvm-15
@@ -0,0 +1,28 @@
+--- storage/innobase/include/ddl0impl.h.orig 2023-10-19 12:05:28 UTC
++++ storage/innobase/include/ddl0impl.h
+@@ -118,14 +118,6 @@ struct Fetch_sequence : public Context::FTS::Sequence
+
+ /** Physical row context. */
+ struct Row {
+- /** Constructor. */
+- Row() = default;
+-
+- Row(const Row &) = default;
+-
+- /** Destructor. */
+- ~Row() = default;
+-
+ Row &operator=(const Row &) = default;
+
+ /** Build a row from a raw record.
+--- unittest/gunit/mysys_my_rdtsc-t.cc.orig 2023-10-19 12:05:28 UTC
++++ unittest/gunit/mysys_my_rdtsc-t.cc
+@@ -145,7 +145,7 @@ TEST_F(RDTimeStampCounter, TestNanosecond) {
+ ulonglong t1 = my_timer_nanoseconds();
+ ulonglong t2;
+ int i;
+- int backward = 0;
++ int backward [[maybe_unused]] = 0;
+ int nonzero = 0;
+
+ for (i = 0; i < LOOP_COUNT; i++) {
diff --git a/databases/xtrabackup84/files/patch-procps b/databases/xtrabackup84/files/patch-procps
new file mode 100644
index 000000000000..2604380ecf1e
--- /dev/null
+++ b/databases/xtrabackup84/files/patch-procps
@@ -0,0 +1,34 @@
+--- storage/innobase/xtrabackup/src/CMakeLists.txt.orig 2024-08-08 12:30:27.000000000 +0200
++++ storage/innobase/xtrabackup/src/CMakeLists.txt 2024-09-03 10:39:46.078261000 +0200
+@@ -19,12 +19,13 @@
+ OPTION(WITH_VERSION_CHECK "Build with version check" ON)
+
+ INCLUDE(${MYSQL_CMAKE_SCRIPT_DIR}/compile_flags.cmake)
++INCLUDE_DIRECTORIES(%%PREFIX%%/include)
+
+ FIND_GCRYPT()
+
+-IF(NOT APPLE)
+- FIND_PROCPS()
+-ENDIF()
++#IF(NOT APPLE)
++# FIND_PROCPS()
++#ENDIF()
+
+ CHECK_TYPE_SIZE("unsigned long" SIZEOF_UNSIGNED_LONG)
+
+@@ -134,14 +135,6 @@
+ ext::icu
+ crc
+ )
+-
+-IF(NOT APPLE)
+- IF(PROCPS_VERSION EQUAL 4)
+- TARGET_LINK_LIBRARIES(xtrabackup proc2)
+- ELSE()
+- TARGET_LINK_LIBRARIES(xtrabackup procps)
+- ENDIF()
+-ENDIF()
+
+ # We depend on protobuf because of the mysqlx plugin and replication.
+ IF(UNIX_INSTALL_RPATH_ORIGIN_PRIV_LIBDIR)
diff --git a/databases/xtrabackup84/files/patch-protobuf b/databases/xtrabackup84/files/patch-protobuf
new file mode 100644
index 000000000000..f1bd482d944a
--- /dev/null
+++ b/databases/xtrabackup84/files/patch-protobuf
@@ -0,0 +1,10 @@
+--- sql/protobuf/CMakeLists.txt.orig 2023-11-24 17:33:10.000000000 +0700
++++ sql/protobuf/CMakeLists.txt 2024-02-17 02:13:42.264307000 +0700
+@@ -21,6 +21,7 @@
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ INCLUDE(${CMAKE_SOURCE_DIR}/cmake/protobuf.cmake)
++INCLUDE_DIRECTORIES(%%PREFIX%%/include)
+
+ SET(PROTOBUF_LITE_LIB_NAME rpl_protobuf_lite)
+
diff --git a/databases/xtrabackup84/files/patch-sql_auth_sql__authorization.cc b/databases/xtrabackup84/files/patch-sql_auth_sql__authorization.cc
new file mode 100644
index 000000000000..95b8518d0a9a
--- /dev/null
+++ b/databases/xtrabackup84/files/patch-sql_auth_sql__authorization.cc
@@ -0,0 +1,13 @@
+--- sql/auth/sql_authorization.cc.orig 2023-10-19 12:05:28 UTC
++++ sql/auth/sql_authorization.cc
+@@ -7437,6 +7437,10 @@ bool operator==(const Role_id &a, const std::string &b
+ return tmp == b;
+ }
+
++bool operator==(const Role_id &a, const LEX_CSTRING &b) {
++ return a == to_string(b);
++}
++
+ bool operator==(const std::pair<Role_id, bool> &a, const std::string &b) {
+ return a.first == b;
+ }
diff --git a/databases/xtrabackup84/files/patch-storage_innobase_include_srv0mon.h b/databases/xtrabackup84/files/patch-storage_innobase_include_srv0mon.h
new file mode 100644
index 000000000000..a0279de2a126
--- /dev/null
+++ b/databases/xtrabackup84/files/patch-storage_innobase_include_srv0mon.h
@@ -0,0 +1,13 @@
+--- storage/innobase/include/srv0mon.h.orig 2024-04-10 06:26:28 UTC
++++ storage/innobase/include/srv0mon.h
+@@ -41,6 +41,10 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ /* Required for FreeBSD so that INT64_MAX is defined. */
+ #define __STDC_LIMIT_MACROS
+ #endif /* __STDC_LIMIT_MACROS */
++#ifdef __DragonFly__
++/* The hack above doen't work for dragonfly, stdint.h already imported */
++#include <machine/int_limits.h>
++#endif
+
+ #include <stdint.h>
+
diff --git a/databases/xtrabackup84/files/patch-storage_innobase_include_ut0crc32.h b/databases/xtrabackup84/files/patch-storage_innobase_include_ut0crc32.h
new file mode 100644
index 000000000000..b1b372a2d8c7
--- /dev/null
+++ b/databases/xtrabackup84/files/patch-storage_innobase_include_ut0crc32.h
@@ -0,0 +1,12 @@
+--- storage/innobase/include/ut0crc32.h.orig 2024-04-10 06:26:28 UTC
++++ storage/innobase/include/ut0crc32.h
+@@ -133,7 +133,9 @@ CRC32_DEFAULT
+ #endif /* CRC32_ARM64 */
+
+ #ifdef CRC32_ARM64_DEFAULT
++#ifndef __FreeBSD__
+ #include <asm/hwcap.h>
++#endif /* __FreeBSD__ */
+ #include <sys/auxv.h>
+ #endif /* CRC32_ARM64_DEFAULT */
+
diff --git a/databases/xtrabackup84/files/patch-storage_innobase_ut_crc32.cc b/databases/xtrabackup84/files/patch-storage_innobase_ut_crc32.cc
new file mode 100644
index 000000000000..4a2609cc1491
--- /dev/null
+++ b/databases/xtrabackup84/files/patch-storage_innobase_ut_crc32.cc
@@ -0,0 +1,104 @@
+--- storage/innobase/ut/crc32.cc.orig 2024-04-10 06:26:28 UTC
++++ storage/innobase/ut/crc32.cc
+@@ -333,8 +333,25 @@ bool can_use_poly_mul() { return true; }
+ #endif /* CRC32_ARM64_APPLE */
+
+ #ifdef CRC32_ARM64_DEFAULT
++#ifdef __FreeBSD__
++bool can_use_crc32() {
++ unsigned long capabilities;
++
++ if (elf_aux_info(AT_HWCAP, &capabilities, sizeof(unsigned long)))
++ return false;
++ return capabilities & HWCAP_CRC32;
++}
++bool can_use_poly_mul() {
++ unsigned long capabilities;
++
++ if (elf_aux_info(AT_HWCAP, &capabilities, sizeof(unsigned long)))
++ return false;
++ return capabilities & HWCAP_PMULL;
++}
++#else
+ bool can_use_crc32() { return getauxval(AT_HWCAP) & HWCAP_CRC32; }
+ bool can_use_poly_mul() { return getauxval(AT_HWCAP) & HWCAP_PMULL; }
++#endif
+ #endif /* CRC32_ARM64_DEFAULT */
+
+ /** A helper template to statically unroll a loop with a fixed number of
+@@ -443,25 +460,39 @@ uint64_t crc32_impl::update(uint64_t crc, uint64_t dat
+
+ #ifdef CRC32_ARM64
+ #ifdef CRC32_ARM64_DEFAULT
++#ifndef __clang__
+ MY_ATTRIBUTE((target("+crc")))
++#else
++MY_ATTRIBUTE((target("crc")))
++#endif
+ #endif /* CRC32_ARM64_DEFAULT */
+ uint32_t crc32_impl::update(uint32_t crc, unsigned char data) {
+ return __crc32cb(crc, data);
+ }
+ #ifdef CRC32_ARM64_DEFAULT
++#ifndef __clang__
+ MY_ATTRIBUTE((target("+crc")))
++#endif
+ #endif /* CRC32_ARM64_DEFAULT */
+ uint32_t crc32_impl::update(uint32_t crc, uint16_t data) {
+ return __crc32ch(crc, data);
+ }
+ #ifdef CRC32_ARM64_DEFAULT
++#ifndef __clang__
+ MY_ATTRIBUTE((target("+crc")))
++#else
++MY_ATTRIBUTE((target("crc")))
++#endif
+ #endif /* CRC32_ARM64_DEFAULT */
+ uint32_t crc32_impl::update(uint32_t crc, uint32_t data) {
+ return __crc32cw(crc, data);
+ }
+ #ifdef CRC32_ARM64_DEFAULT
++#ifndef __clang__
+ MY_ATTRIBUTE((target("+crc")))
++#else
++MY_ATTRIBUTE((target("crc")))
++#endif
+ #endif /* CRC32_ARM64_DEFAULT */
+ uint64_t crc32_impl::update(uint64_t crc, uint64_t data) {
+ return (uint64_t)__crc32cd((uint32_t)crc, data);
+@@ -508,7 +539,11 @@ template <uint32_t w>
+ }
+ template <uint32_t w>
+ #ifdef CRC32_ARM64_DEFAULT
++#ifndef __clang__
+ MY_ATTRIBUTE((target("+crypto")))
++#else
++MY_ATTRIBUTE((target("crypto")))
++#endif
+ #endif /* CRC32_ARM64_DEFAULT */
+ uint64_t use_pclmul::polynomial_mul_rev(uint32_t rev_u) {
+ constexpr uint64_t flipped_w = flip_at_32(w);
+@@ -751,7 +786,11 @@ MY_ATTRIBUTE((flatten))
+ MY_ATTRIBUTE((flatten))
+ #endif /* CRC32_ARM64_APPLE */
+ #ifdef CRC32_ARM64_DEFAULT
++#ifndef __clang__
+ MY_ATTRIBUTE((target("+crc+crypto"), flatten))
++#else
++MY_ATTRIBUTE((target("crc,crypto")))
++#endif
+ #endif /* CRC32_ARM64_DEFAULT */
+ uint32_t crc32_using_pclmul(const byte *data, size_t len) {
+ return crc32<use_pclmul>(0, data, len);
+@@ -771,7 +810,11 @@ MY_ATTRIBUTE((flatten))
+ MY_ATTRIBUTE((flatten))
+ #endif /* CRC32_ARM64_APPLE */
+ #ifdef CRC32_ARM64_DEFAULT
++#ifndef __clang__
+ MY_ATTRIBUTE((target("+crc"), flatten))
++#else
++MY_ATTRIBUTE((target("crc")))
++#endif
+ #endif /* CRC32_ARM64_DEFAULT */
+ uint32_t crc32_using_unrolled_loop_poly_mul(const byte *data, size_t len) {
+ return crc32<use_unrolled_loop_poly_mul>(0, data, len);
diff --git a/databases/xtrabackup84/files/patch-storage_innobase_xtrabackup_src_utils.cc b/databases/xtrabackup84/files/patch-storage_innobase_xtrabackup_src_utils.cc
new file mode 100644
index 000000000000..dbc84f05a7e1
--- /dev/null
+++ b/databases/xtrabackup84/files/patch-storage_innobase_xtrabackup_src_utils.cc
@@ -0,0 +1,59 @@
+--- storage/innobase/xtrabackup/src/utils.cc.orig 2023-10-19 12:05:28 UTC
++++ storage/innobase/xtrabackup/src/utils.cc
+@@ -21,6 +21,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Bos
+
+ #ifdef __APPLE__
+ #include <mach/mach_host.h>
++#endif
++#if defined(__APPLE__) || defined(__FreeBSD__)
+ #include <sys/sysctl.h>
+ #else
+ #ifdef HAVE_PROCPS_V3
+@@ -113,12 +115,14 @@ unsigned long get_version_number(std::string version_s
+ return major * 10000 + minor * 100 + version;
+ }
+
+-#ifdef __APPLE__
++#if defined(__APPLE__) || defined(__FreeBSD__)
+ unsigned long host_total_memory() {
+ unsigned long total_mem = sysconf(_SC_PHYS_PAGES) * sysconf(_SC_PAGESIZE);
+ return total_mem;
+ }
++#endif
+
++#ifdef __APPLE__
+ unsigned long host_free_memory() {
+ unsigned long total_mem = host_total_memory();
+ int64_t used_mem;
+@@ -139,6 +143,31 @@ unsigned long host_free_memory() {
+ return total_mem - (unsigned long)used_mem;
+ }
+ return 0;
++}
++#elif defined(__FreeBSD__)
++unsigned long host_free_memory() {
++ static int mib_free[2] = { -1, 0 };
++ static int mib_inactive[2] = { -1, 0 };
++ size_t miblen = sizeof(mib_free) / sizeof(mib_free[0]);
++ uint32_t free_pages, inactive_pages;
++ size_t sz = sizeof(free_pages);
++
++ free_pages = inactive_pages = 0;
++
++ if (mib_free[0] < 0 &&
++ sysctlnametomib("vm.stats.vm.v_free_count", mib_free, &miblen) < 0)
++ mib_free[0] = 0;
++ if (mib_inactive[0] < 0 &&
++ sysctlnametomib("vm.stats.vm.v_inactive_count", mib_inactive, &miblen) < 0)
++ mib_inactive[0] = 0;
++
++ if (mib_free[0] &&
++ sysctl(mib_free, 2, &free_pages, &sz, NULL, 0) < 0)
++ free_pages = 0; /* should not happen */
++ if (mib_inactive[0] && sysctl(mib_inactive, 2, &inactive_pages, &sz, NULL, 0) < 0)
++ inactive_pages = 0; /* should not happen, too */
++
++ return (free_pages + inactive_pages) * sysconf(_SC_PAGESIZE);
+ }
+ #else
+ unsigned long host_total_memory() {
diff --git a/databases/xtrabackup84/files/patch-storage_innobase_xtrabackup_xbcloud__osenv.sh b/databases/xtrabackup84/files/patch-storage_innobase_xtrabackup_xbcloud__osenv.sh
new file mode 100644
index 000000000000..37b1e45afc66
--- /dev/null
+++ b/databases/xtrabackup84/files/patch-storage_innobase_xtrabackup_xbcloud__osenv.sh
@@ -0,0 +1,15 @@
+--- storage/innobase/xtrabackup/xbcloud_osenv.sh.orig 2020-08-28 21:02:32 UTC
++++ storage/innobase/xtrabackup/xbcloud_osenv.sh
+@@ -1,4 +1,4 @@
+-#!/bin/bash
++#!/bin/sh
+
+ # Copyright (C) 2015 Percona LLC and/or its affiliates.
+ # This software comes with ABSOLUTELY NO WARRANTY. This is free software,
+@@ -105,5 +105,5 @@ fi
+
+ # do it
+ # shellcheck disable=SC2086,SC2048
+-${XBCLOUD_BIN} $* ${XBCLOUD_OS_ENV}
++${XBCLOUD_BIN} "$@" ${XBCLOUD_OS_ENV}
+
diff --git a/databases/xtrabackup84/pkg-descr b/databases/xtrabackup84/pkg-descr
new file mode 100644
index 000000000000..da1655f57769
--- /dev/null
+++ b/databases/xtrabackup84/pkg-descr
@@ -0,0 +1,4 @@
+Percona XtraBackup is an open-source hot backup utility for MySQL that
+doesn't lock your database during the backup. It can back up data from
+InnoDB, XtraDB and MyISAM tables on MySQL/Percona Server/MariaDB
+servers, and has many advanced features.
diff --git a/databases/xtrabackup84/pkg-plist b/databases/xtrabackup84/pkg-plist
new file mode 100644
index 000000000000..8128dd3b9dac
--- /dev/null
+++ b/databases/xtrabackup84/pkg-plist
@@ -0,0 +1,9 @@
+bin/xbcloud
+bin/xbcloud_osenv
+bin/xbcrypt
+bin/xbstream
+bin/xtrabackup
+lib/libmysqlservices.a
+lib/plugin/component_keyring_file.so
+lib/plugin/component_keyring_kms.so
+lib/plugin/component_keyring_vault.so