From: Faidon Liambotis <paravoid@debian.org>
Date: Wed, 3 Sep 2025 18:27:04 +0300
Subject: Add --enable-nanopb-ext option to build with an external nanopb

Bug: https://github.com/confluentinc/librdkafka/issues/5186
---
 configure.self                 | 9 +++++++++
 src/Makefile                   | 5 ++++-
 src/rdkafka_telemetry.c        | 2 +-
 src/rdkafka_telemetry_decode.c | 2 +-
 src/rdkafka_telemetry_encode.c | 2 +-
 5 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/configure.self b/configure.self
index 45c7bdb..05ef948 100644
--- a/configure.self
+++ b/configure.self
@@ -41,6 +41,8 @@ mkl_toggle_option "Feature" ENABLE_REGEX_EXT "--enable-regex-ext" "Enable extern
 
 mkl_toggle_option "Feature" ENABLE_CJSON_EXT "--enable-cjson-ext" "Enable external cJSON (else use builtin)" "y"
 
+mkl_toggle_option "Feature" ENABLE_NANOPB_EXT "--enable-nanopb-ext" "Enable external Nanopb (else use builtin)" "y"
+
 # librdkafka with TSAN won't work with glibc C11 threads on Ubuntu 19.04.
 # This option allows disabling libc-based C11 threads and instead
 # use the builtin tinycthread alternative.
@@ -128,6 +130,13 @@ void foo (void) {
                       "#include <cJSON.h>"
     fi
 
+    # Use builtin nanopb if linking statically or if --disable-nanopb-ext is used.
+    if [[ $MKL_SOURCE_DEPS_ONLY != y ]] && [[ $WITH_STATIC_LINKING != y ]] && [[ $ENABLE_NANOPB_EXT == y ]]; then
+        mkl_meta_set "libnanopb" "static" "libprotobuf-nanopb.a"
+        mkl_lib_check "libnanopb" "WITH_NANOPB_EXT" disable CC "-lprotobuf-nanopb" \
+                      "#include <nanopb/pb.h>"
+    fi
+
     if [[ $ENABLE_SYSLOG == y ]]; then
         mkl_compile_check "syslog" "WITH_SYSLOG" disable CC "" \
                           '
diff --git a/src/Makefile b/src/Makefile
index 6838516..5ad4a4f 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -37,6 +37,10 @@ ifneq ($(WITH_CJSON_EXT), y)
 SRCS_y += cJSON.c
 endif
 
+ifneq ($(WITH_NANOPB_EXT), y)
+SRCS_y += nanopb/pb_encode.c nanopb/pb_decode.c nanopb/pb_common.c
+endif
+
 ifneq ($(HAVE_REGEX), y)
 SRCS_y += regexp.c
 endif
@@ -64,7 +68,6 @@ SRCS=		rdkafka.c rdkafka_broker.c rdkafka_msg.c rdkafka_topic.c \
 		rdkafka_mock.c rdkafka_mock_handlers.c rdkafka_mock_cgrp.c \
 		rdkafka_error.c rdkafka_fetcher.c rdkafka_telemetry.c \
 		rdkafka_telemetry_encode.c rdkafka_telemetry_decode.c \
-		nanopb/pb_encode.c nanopb/pb_decode.c nanopb/pb_common.c \
 		opentelemetry/metrics.pb.c opentelemetry/common.pb.c opentelemetry/resource.pb.c \
 		$(SRCS_y)
 
diff --git a/src/rdkafka_telemetry.c b/src/rdkafka_telemetry.c
index b76effa..cad88e9 100644
--- a/src/rdkafka_telemetry.c
+++ b/src/rdkafka_telemetry.c
@@ -30,7 +30,7 @@
 #include "rdkafka_msgset.h"
 #include "rdkafka_telemetry_encode.h"
 #include "rdkafka_request.h"
-#include "nanopb/pb.h"
+#include <nanopb/pb.h>
 #include "rdkafka_lz4.h"
 #include "snappy.h"
 #include "rdunittest.h"
diff --git a/src/rdkafka_telemetry_decode.c b/src/rdkafka_telemetry_decode.c
index 452e43c..fedd61f 100644
--- a/src/rdkafka_telemetry_decode.c
+++ b/src/rdkafka_telemetry_decode.c
@@ -27,7 +27,7 @@
  */
 
 #include "rdkafka_telemetry_decode.h"
-#include "nanopb/pb_decode.h"
+#include <nanopb/pb_decode.h>
 #include "rdunittest.h"
 #include "rdkafka_lz4.h"
 #include "rdgz.h"
diff --git a/src/rdkafka_telemetry_encode.c b/src/rdkafka_telemetry_encode.c
index da1a341..ff8b8df 100644
--- a/src/rdkafka_telemetry_encode.c
+++ b/src/rdkafka_telemetry_encode.c
@@ -27,7 +27,7 @@
  */
 
 #include "rdkafka_telemetry_encode.h"
-#include "nanopb/pb_encode.h"
+#include <nanopb/pb_encode.h>
 #include "opentelemetry/metrics.pb.h"
 
 #define THREE_ORDERS_MAGNITUDE 1000
