Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 14 Dec 2023 17:03:18 GMT
From:      Po-Chuan Hsieh <sunpoet@FreeBSD.org>
To:        ports-committers@FreeBSD.org, dev-commits-ports-all@FreeBSD.org, dev-commits-ports-main@FreeBSD.org
Subject:   git: ff78a16bf827 - main - devel/protobuf3: Add protobuf3 3.21.12 (copied from protobuf)
Message-ID:  <202312141703.3BEH3IZO016314@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by sunpoet:

URL: https://cgit.FreeBSD.org/ports/commit/?id=ff78a16bf827b34df61bc3d37992fb7f9811bb75

commit ff78a16bf827b34df61bc3d37992fb7f9811bb75
Author:     Po-Chuan Hsieh <sunpoet@FreeBSD.org>
AuthorDate: 2023-12-14 16:08:17 +0000
Commit:     Po-Chuan Hsieh <sunpoet@FreeBSD.org>
CommitDate: 2023-12-14 17:03:02 +0000

    devel/protobuf3: Add protobuf3 3.21.12 (copied from protobuf)
    
    - Add PORTSCOUT
---
 devel/Makefile                              |   1 +
 devel/protobuf3/Makefile                    |  43 ++++++++
 devel/protobuf3/distinfo                    |   3 +
 devel/protobuf3/files/patch-Makefile.in     |  11 +++
 devel/protobuf3/files/patch-i386            |  13 +++
 devel/protobuf3/files/patch-src-Makefile.in | 124 +++++++++++++++++++++++
 devel/protobuf3/pkg-descr                   |   3 +
 devel/protobuf3/pkg-plist                   | 146 ++++++++++++++++++++++++++++
 8 files changed, 344 insertions(+)

diff --git a/devel/Makefile b/devel/Makefile
index 49c526d70c4a..53c0f40c089b 100644
--- a/devel/Makefile
+++ b/devel/Makefile
@@ -4170,6 +4170,7 @@
     SUBDIR += protobuf-c
     SUBDIR += protobuf-java
     SUBDIR += protobuf25
+    SUBDIR += protobuf3
     SUBDIR += prototool
     SUBDIR += protozero
     SUBDIR += pructl
diff --git a/devel/protobuf3/Makefile b/devel/protobuf3/Makefile
new file mode 100644
index 000000000000..c6eeb10d9efd
--- /dev/null
+++ b/devel/protobuf3/Makefile
@@ -0,0 +1,43 @@
+PORTNAME=	protobuf
+PORTVERSION=	3.21.12
+DISTVERSIONPREFIX=	cpp-
+CATEGORIES=	devel
+MASTER_SITES=	https://github.com/protocolbuffers/protobuf/releases/download/v${PORTVERSION:R:E}.${PORTVERSION:E}/
+PKGNAMESUFFIX=	3
+
+MAINTAINER=	sunpoet@FreeBSD.org
+COMMENT=	Data interchange format library
+WWW=		https://protobuf.dev/ \
+		https://github.com/protocolbuffers/protobuf
+
+LICENSE=	BSD3CLAUSE
+LICENSE_FILE=	${WRKSRC}/LICENSE
+
+BROKEN_sparc64=	fails to compile: no atomic ops available
+
+TEST_DEPENDS=	googletest>=0:devel/googletest
+
+USES=		compiler:c++11-lang cpe libtool localbase pathfix pkgconfig
+
+CFLAGS+=	-D_THREAD_SAFE -DGOOGLE_PROTOBUF_NO_RTTI -I${WRKSRC}/src
+CONFIGURE_ENV=	CC_FOR_BUILD="${CC}" \
+		CFLAGS_FOR_BUILD="${CFLAGS}" \
+		CPPFLAGS_FOR_BUILD="${CPPFLAGS}" \
+		CXX_FOR_BUILD="${CXX}" \
+		CXXFLAGS_FOR_BUILD="${CXXFLAGS}" \
+		LDFLAGS_FOR_BUILD="${LDFLAGS}"
+GNU_CONFIGURE=	yes
+INSTALL_TARGET=	install-strip
+TEST_ARGS=	${MAKE_ARGS} ${_MAKE_JOBS}
+TEST_TARGET=	check
+USE_CXXSTD=	c++11
+USE_LDCONFIG=	yes
+
+PLIST_SUB=	PATCH_VERSION=${PORTVERSION:E}
+WRKSRC=		${WRKDIR}/${PORTNAME}-${PORTVERSION}
+
+CPE_VENDOR=	google
+
+PORTSCOUT=	limit:^3\.
+
+.include <bsd.port.mk>
diff --git a/devel/protobuf3/distinfo b/devel/protobuf3/distinfo
new file mode 100644
index 000000000000..b0b2e5326d8a
--- /dev/null
+++ b/devel/protobuf3/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1674589582
+SHA256 (protobuf-cpp-3.21.12.tar.gz) = 4eab9b524aa5913c6fffb20b2a8abf5ef7f95a80bc0701f3a6dbb4c607f73460
+SIZE (protobuf-cpp-3.21.12.tar.gz) = 4842303
diff --git a/devel/protobuf3/files/patch-Makefile.in b/devel/protobuf3/files/patch-Makefile.in
new file mode 100644
index 000000000000..b93039e03270
--- /dev/null
+++ b/devel/protobuf3/files/patch-Makefile.in
@@ -0,0 +1,11 @@
+--- Makefile.in.orig	2022-12-14 14:21:49 UTC
++++ Makefile.in
+@@ -2188,7 +2188,7 @@ uninstall-am: uninstall-pkgconfigDATA
+ # which takes a lot of time and is generally not useful to us.  Also, we don't
+ # want "make install" to recurse into gmock since we don't want to overwrite
+ # the installed version of gmock if there is one.
+-check-local:
++disabled-check-local:
+ 	@echo "Making lib/libgmock.a lib/libgmock_main.a in gmock"
+ 	@cd third_party/googletest/googletest && $(MAKE) $(AM_MAKEFLAGS) lib/libgtest.la lib/libgtest_main.la
+ 	@cd third_party/googletest/googlemock && $(MAKE) $(AM_MAKEFLAGS) lib/libgmock.la lib/libgmock_main.la
diff --git a/devel/protobuf3/files/patch-i386 b/devel/protobuf3/files/patch-i386
new file mode 100644
index 000000000000..56efb9d86368
--- /dev/null
+++ b/devel/protobuf3/files/patch-i386
@@ -0,0 +1,13 @@
+Obtained from:	https://cgit.freebsd.org/ports/commit/?id=c212fb9fcceacf49ac4f236c7944aaec5d3cfa57
+
+--- src/google/protobuf/arena_impl.h.orig	2022-09-29 19:05:00 UTC
++++ src/google/protobuf/arena_impl.h
+@@ -640,7 +640,7 @@ class PROTOBUF_EXPORT ThreadSafeArena {
+ #ifdef _MSC_VER
+ #pragma warning(disable : 4324)
+ #endif
+-  struct alignas(kCacheAlignment) CacheAlignedLifecycleIdGenerator {
++  struct alignas(alignof(std::atomic<LifecycleIdAtomic>)) CacheAlignedLifecycleIdGenerator {
+     std::atomic<LifecycleIdAtomic> id;
+   };
+   static CacheAlignedLifecycleIdGenerator lifecycle_id_generator_;
diff --git a/devel/protobuf3/files/patch-src-Makefile.in b/devel/protobuf3/files/patch-src-Makefile.in
new file mode 100644
index 000000000000..0ffe912b69bf
--- /dev/null
+++ b/devel/protobuf3/files/patch-src-Makefile.in
@@ -0,0 +1,124 @@
+--- src/Makefile.in.orig	2022-12-14 14:21:49 UTC
++++ src/Makefile.in
+@@ -492,9 +492,9 @@ protobuf_lazy_descriptor_test_OBJECTS =  \
+ 	$(nodist_protobuf_lazy_descriptor_test_OBJECTS)
+ protobuf_lazy_descriptor_test_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ 	libprotobuf.la libprotoc.la \
+-	$(GOOGLETEST_BUILD_DIR)/lib/libgtest.la \
+-	$(GOOGLEMOCK_BUILD_DIR)/lib/libgmock.la \
+-	$(GOOGLEMOCK_BUILD_DIR)/lib/libgmock_main.la
++	-lgtest \
++	-lgmock \
++	-lgmock_main
+ protobuf_lazy_descriptor_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ 	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ 	$(protobuf_lazy_descriptor_test_CXXFLAGS) $(CXXFLAGS) \
+@@ -513,9 +513,9 @@ protobuf_lite_arena_test_OBJECTS =  \
+ 	$(am_protobuf_lite_arena_test_OBJECTS) \
+ 	$(nodist_protobuf_lite_arena_test_OBJECTS)
+ protobuf_lite_arena_test_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+-	libprotobuf-lite.la $(GOOGLETEST_BUILD_DIR)/lib/libgtest.la \
+-	$(GOOGLEMOCK_BUILD_DIR)/lib/libgmock.la \
+-	$(GOOGLEMOCK_BUILD_DIR)/lib/libgmock_main.la
++	libprotobuf-lite.la -lgtest \
++	-lgmock \
++	-lgmock_main
+ protobuf_lite_arena_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ 	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ 	$(protobuf_lite_arena_test_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+@@ -535,9 +535,9 @@ nodist_protobuf_lite_test_OBJECTS = $(am__objects_11)
+ protobuf_lite_test_OBJECTS = $(am_protobuf_lite_test_OBJECTS) \
+ 	$(nodist_protobuf_lite_test_OBJECTS)
+ protobuf_lite_test_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+-	libprotobuf-lite.la $(GOOGLETEST_BUILD_DIR)/lib/libgtest.la \
+-	$(GOOGLEMOCK_BUILD_DIR)/lib/libgmock.la \
+-	$(GOOGLEMOCK_BUILD_DIR)/lib/libgmock_main.la
++	libprotobuf-lite.la -lgtest \
++	-lgmock \
++	-lgmock_main
+ protobuf_lite_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ 	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ 	$(protobuf_lite_test_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+@@ -681,9 +681,9 @@ nodist_protobuf_test_OBJECTS = $(am__objects_15)
+ protobuf_test_OBJECTS = $(am_protobuf_test_OBJECTS) \
+ 	$(nodist_protobuf_test_OBJECTS)
+ protobuf_test_DEPENDENCIES = $(am__DEPENDENCIES_1) libprotobuf.la \
+-	libprotoc.la $(GOOGLETEST_BUILD_DIR)/lib/libgtest.la \
+-	$(GOOGLEMOCK_BUILD_DIR)/lib/libgmock.la \
+-	$(GOOGLEMOCK_BUILD_DIR)/lib/libgmock_main.la
++	libprotoc.la -lgtest \
++	-lgmock \
++	-lgmock_main
+ protobuf_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ 	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ 	$(protobuf_test_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+@@ -697,7 +697,7 @@ am_test_plugin_OBJECTS = google/protobuf/compiler/test
+ 	google/protobuf/testing/test_plugin-file.$(OBJEXT)
+ test_plugin_OBJECTS = $(am_test_plugin_OBJECTS)
+ test_plugin_DEPENDENCIES = $(am__DEPENDENCIES_1) libprotobuf.la \
+-	libprotoc.la $(GOOGLETEST_BUILD_DIR)/lib/libgtest.la
++	libprotoc.la -lgtest
+ am__zcgunzip_SOURCES_DIST = google/protobuf/testing/zcgunzip.cc
+ @HAVE_ZLIB_TRUE@am_zcgunzip_OBJECTS =  \
+ @HAVE_ZLIB_TRUE@	google/protobuf/testing/zcgunzip.$(OBJEXT)
+@@ -2346,9 +2346,9 @@ GOOGLEMOCK_BUILD_DIR = ../third_party/googletest/googl
+ GOOGLETEST_SRC_DIR = $(srcdir)/../third_party/googletest/googletest
+ GOOGLEMOCK_SRC_DIR = $(srcdir)/../third_party/googletest/googlemock
+ protobuf_test_LDADD = $(PTHREAD_LIBS) libprotobuf.la libprotoc.la \
+-                      $(GOOGLETEST_BUILD_DIR)/lib/libgtest.la     \
+-                      $(GOOGLEMOCK_BUILD_DIR)/lib/libgmock.la     \
+-                      $(GOOGLEMOCK_BUILD_DIR)/lib/libgmock_main.la
++                      -lgtest     \
++                      -lgmock     \
++                      -lgmock_main
+ 
+ protobuf_test_CPPFLAGS = -I$(GOOGLETEST_SRC_DIR)/include \
+                          -I$(GOOGLEMOCK_SRC_DIR)/include
+@@ -2446,9 +2446,9 @@ nodist_protobuf_test_SOURCES = $(protoc_outputs)
+ # Run cpp_unittest again with PROTOBUF_TEST_NO_DESCRIPTORS defined.
+ protobuf_lazy_descriptor_test_LDADD = $(PTHREAD_LIBS) libprotobuf.la \
+                       libprotoc.la                                   \
+-                      $(GOOGLETEST_BUILD_DIR)/lib/libgtest.la        \
+-                      $(GOOGLEMOCK_BUILD_DIR)/lib/libgmock.la        \
+-                      $(GOOGLEMOCK_BUILD_DIR)/lib/libgmock_main.la
++                      -lgtest        \
++                      -lgmock        \
++                      -lgmock_main
+ 
+ protobuf_lazy_descriptor_test_CPPFLAGS = -I$(GOOGLEMOCK_SRC_DIR)/include \
+                                          -I$(GOOGLETEST_SRC_DIR)/include \
+@@ -2475,9 +2475,9 @@ COMMON_LITE_TEST_SOURCES = \
+ # full runtime and we want to make sure this test builds without full
+ # runtime.
+ protobuf_lite_test_LDADD = $(PTHREAD_LIBS) libprotobuf-lite.la     \
+-                           $(GOOGLETEST_BUILD_DIR)/lib/libgtest.la \
+-                           $(GOOGLEMOCK_BUILD_DIR)/lib/libgmock.la \
+-                           $(GOOGLEMOCK_BUILD_DIR)/lib/libgmock_main.la
++                           -lgtest \
++                           -lgmock \
++                           -lgmock_main
+ 
+ protobuf_lite_test_CPPFLAGS = -I$(GOOGLEMOCK_SRC_DIR)/include \
+                              -I$(GOOGLETEST_SRC_DIR)/include
+@@ -2493,9 +2493,9 @@ nodist_protobuf_lite_test_SOURCES = $(protoc_lite_outp
+ # gtest when building the test internally our memory sanitizer doesn't detect
+ # memory leaks (don't know why).
+ protobuf_lite_arena_test_LDADD = $(PTHREAD_LIBS) libprotobuf-lite.la \
+-                      $(GOOGLETEST_BUILD_DIR)/lib/libgtest.la        \
+-                      $(GOOGLEMOCK_BUILD_DIR)/lib/libgmock.la        \
+-                      $(GOOGLEMOCK_BUILD_DIR)/lib/libgmock_main.la
++                      -lgtest        \
++                      -lgmock        \
++                      -lgmock_main
+ 
+ protobuf_lite_arena_test_CPPFLAGS = -I$(GOOGLEMOCK_SRC_DIR)/include  \
+                                     -I$(GOOGLETEST_SRC_DIR)/include
+@@ -2509,7 +2509,7 @@ nodist_protobuf_lite_arena_test_SOURCES = $(protoc_lit
+ 
+ # Test plugin binary.
+ test_plugin_LDADD = $(PTHREAD_LIBS) libprotobuf.la libprotoc.la \
+-                    $(GOOGLETEST_BUILD_DIR)/lib/libgtest.la
++                    -lgtest
+ 
+ test_plugin_CPPFLAGS = -I$(GOOGLETEST_SRC_DIR)/include
+ test_plugin_SOURCES = \
diff --git a/devel/protobuf3/pkg-descr b/devel/protobuf3/pkg-descr
new file mode 100644
index 000000000000..73df6ac90a21
--- /dev/null
+++ b/devel/protobuf3/pkg-descr
@@ -0,0 +1,3 @@
+Protocol Buffers are a way of encoding structured data in an efficient yet
+extensible format. Google uses Protocol Buffers for almost all of its internal
+RPC protocols and file formats.
diff --git a/devel/protobuf3/pkg-plist b/devel/protobuf3/pkg-plist
new file mode 100644
index 000000000000..d60b9a3c684c
--- /dev/null
+++ b/devel/protobuf3/pkg-plist
@@ -0,0 +1,146 @@
+bin/protoc
+include/google/protobuf/any.h
+include/google/protobuf/any.pb.h
+include/google/protobuf/any.proto
+include/google/protobuf/api.pb.h
+include/google/protobuf/api.proto
+include/google/protobuf/arena.h
+include/google/protobuf/arena_impl.h
+include/google/protobuf/arenastring.h
+include/google/protobuf/arenaz_sampler.h
+include/google/protobuf/compiler/code_generator.h
+include/google/protobuf/compiler/command_line_interface.h
+include/google/protobuf/compiler/cpp/cpp_generator.h
+include/google/protobuf/compiler/cpp/file.h
+include/google/protobuf/compiler/cpp/generator.h
+include/google/protobuf/compiler/cpp/helpers.h
+include/google/protobuf/compiler/cpp/names.h
+include/google/protobuf/compiler/csharp/csharp_doc_comment.h
+include/google/protobuf/compiler/csharp/csharp_generator.h
+include/google/protobuf/compiler/csharp/csharp_names.h
+include/google/protobuf/compiler/csharp/csharp_options.h
+include/google/protobuf/compiler/importer.h
+include/google/protobuf/compiler/java/generator.h
+include/google/protobuf/compiler/java/java_generator.h
+include/google/protobuf/compiler/java/kotlin_generator.h
+include/google/protobuf/compiler/java/names.h
+include/google/protobuf/compiler/objectivec/objectivec_generator.h
+include/google/protobuf/compiler/objectivec/objectivec_helpers.h
+include/google/protobuf/compiler/parser.h
+include/google/protobuf/compiler/php/php_generator.h
+include/google/protobuf/compiler/plugin.h
+include/google/protobuf/compiler/plugin.pb.h
+include/google/protobuf/compiler/plugin.proto
+include/google/protobuf/compiler/python/generator.h
+include/google/protobuf/compiler/python/pyi_generator.h
+include/google/protobuf/compiler/python/python_generator.h
+include/google/protobuf/compiler/ruby/ruby_generator.h
+include/google/protobuf/descriptor.h
+include/google/protobuf/descriptor.pb.h
+include/google/protobuf/descriptor.proto
+include/google/protobuf/descriptor_database.h
+include/google/protobuf/duration.pb.h
+include/google/protobuf/duration.proto
+include/google/protobuf/dynamic_message.h
+include/google/protobuf/empty.pb.h
+include/google/protobuf/empty.proto
+include/google/protobuf/endian.h
+include/google/protobuf/explicitly_constructed.h
+include/google/protobuf/extension_set.h
+include/google/protobuf/extension_set_inl.h
+include/google/protobuf/field_access_listener.h
+include/google/protobuf/field_mask.pb.h
+include/google/protobuf/field_mask.proto
+include/google/protobuf/generated_enum_reflection.h
+include/google/protobuf/generated_enum_util.h
+include/google/protobuf/generated_message_bases.h
+include/google/protobuf/generated_message_reflection.h
+include/google/protobuf/generated_message_tctable_decl.h
+include/google/protobuf/generated_message_tctable_impl.h
+include/google/protobuf/generated_message_util.h
+include/google/protobuf/has_bits.h
+include/google/protobuf/implicit_weak_message.h
+include/google/protobuf/inlined_string_field.h
+include/google/protobuf/io/coded_stream.h
+include/google/protobuf/io/gzip_stream.h
+include/google/protobuf/io/io_win32.h
+include/google/protobuf/io/printer.h
+include/google/protobuf/io/strtod.h
+include/google/protobuf/io/tokenizer.h
+include/google/protobuf/io/zero_copy_stream.h
+include/google/protobuf/io/zero_copy_stream_impl.h
+include/google/protobuf/io/zero_copy_stream_impl_lite.h
+include/google/protobuf/map.h
+include/google/protobuf/map_entry.h
+include/google/protobuf/map_entry_lite.h
+include/google/protobuf/map_field.h
+include/google/protobuf/map_field_inl.h
+include/google/protobuf/map_field_lite.h
+include/google/protobuf/map_type_handler.h
+include/google/protobuf/message.h
+include/google/protobuf/message_lite.h
+include/google/protobuf/metadata.h
+include/google/protobuf/metadata_lite.h
+include/google/protobuf/parse_context.h
+include/google/protobuf/port.h
+include/google/protobuf/port_def.inc
+include/google/protobuf/port_undef.inc
+include/google/protobuf/reflection.h
+include/google/protobuf/reflection_internal.h
+include/google/protobuf/reflection_ops.h
+include/google/protobuf/repeated_field.h
+include/google/protobuf/repeated_ptr_field.h
+include/google/protobuf/service.h
+include/google/protobuf/source_context.pb.h
+include/google/protobuf/source_context.proto
+include/google/protobuf/struct.pb.h
+include/google/protobuf/struct.proto
+include/google/protobuf/stubs/bytestream.h
+include/google/protobuf/stubs/callback.h
+include/google/protobuf/stubs/casts.h
+include/google/protobuf/stubs/common.h
+include/google/protobuf/stubs/hash.h
+include/google/protobuf/stubs/logging.h
+include/google/protobuf/stubs/macros.h
+include/google/protobuf/stubs/map_util.h
+include/google/protobuf/stubs/mutex.h
+include/google/protobuf/stubs/once.h
+include/google/protobuf/stubs/platform_macros.h
+include/google/protobuf/stubs/port.h
+include/google/protobuf/stubs/status.h
+include/google/protobuf/stubs/stl_util.h
+include/google/protobuf/stubs/stringpiece.h
+include/google/protobuf/stubs/strutil.h
+include/google/protobuf/stubs/template_util.h
+include/google/protobuf/text_format.h
+include/google/protobuf/timestamp.pb.h
+include/google/protobuf/timestamp.proto
+include/google/protobuf/type.pb.h
+include/google/protobuf/type.proto
+include/google/protobuf/unknown_field_set.h
+include/google/protobuf/util/delimited_message_util.h
+include/google/protobuf/util/field_comparator.h
+include/google/protobuf/util/field_mask_util.h
+include/google/protobuf/util/json_util.h
+include/google/protobuf/util/message_differencer.h
+include/google/protobuf/util/time_util.h
+include/google/protobuf/util/type_resolver.h
+include/google/protobuf/util/type_resolver_util.h
+include/google/protobuf/wire_format.h
+include/google/protobuf/wire_format_lite.h
+include/google/protobuf/wrappers.pb.h
+include/google/protobuf/wrappers.proto
+lib/libprotobuf-lite.a
+lib/libprotobuf-lite.so
+lib/libprotobuf-lite.so.32
+lib/libprotobuf-lite.so.32.0.%%PATCH_VERSION%%
+lib/libprotobuf.a
+lib/libprotobuf.so
+lib/libprotobuf.so.32
+lib/libprotobuf.so.32.0.%%PATCH_VERSION%%
+lib/libprotoc.a
+lib/libprotoc.so
+lib/libprotoc.so.32
+lib/libprotoc.so.32.0.%%PATCH_VERSION%%
+libdata/pkgconfig/protobuf-lite.pc
+libdata/pkgconfig/protobuf.pc



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202312141703.3BEH3IZO016314>