metrics-ipmi-blobs: Convert to nanopb

Tested: Decoded a metric proto from a host and verified that the fields
all looked as expected and "normal" with decode successfully identifying
everything.

Change-Id: Iaa1b5500db6d1b93fae95d44a1045a858624cc51
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/subprojects/metrics-ipmi-blobs/meson.build b/subprojects/metrics-ipmi-blobs/meson.build
index 54d831c..15eead9 100644
--- a/subprojects/metrics-ipmi-blobs/meson.build
+++ b/subprojects/metrics-ipmi-blobs/meson.build
@@ -14,54 +14,88 @@
 
 project(
   'metrics-ipmi-blobs',
-  'cpp',
+  ['cpp', 'c'],
   version: '0.1',
   default_options: [
     'warning_level=3',
     'werror=true',
     'cpp_std=c++23',
+    'c_std=c18',
     'tests=' + (meson.is_subproject() ? 'disabled' : 'auto'),
   ],
 )
 
-headers = include_directories('.')
+nanopb = find_program('nanopb_generator.py', native: true, required: false)
+if not nanopb.found()
+  nanopb_opts = import('cmake').subproject_options()
+  nanopb_opts.add_cmake_defines({'BUILD_SHARED_LIBS': 'ON'})
+  nanopb_proj = import('cmake').subproject('nanopb', options: nanopb_opts)
+  nanopb = find_program(meson.global_source_root() + '/subprojects/nanopb/generator/nanopb_generator.py', native: true)
+  nanopb_dep = nanopb_proj.dependency('protobuf_nanopb')
+else
+  nanopb_dep = meson.get_compiler('cpp').find_library('protobuf-nanopb')
+endif
 
-deps = [
-  dependency('phosphor-logging'),
-  dependency('phosphor-ipmi-blobs'),
-  dependency('protobuf'),
-  dependency('sdbusplus'),
-]
+nanopb_kwargs = {
+  'output': [
+    '@BASENAME@.pb.n.h',
+    '@BASENAME@.pb.n.c',
+  ],
+  'command': [
+    nanopb,
+    '-q',
+    '-s', 'packed_struct:0',
+    '-H.n.h',
+    '-S.n.c',
+    '-I' + import('fs').relative_to(meson.current_source_dir(), meson.global_build_root()),
+    '-D' + import('fs').relative_to(meson.current_build_dir(), meson.global_build_root()),
+    '@INPUT@',
+  ],
+}
 
-proto = custom_target(
-  'metricblob_proto',
-  command: [
-    find_program('protoc', native: true),
-    '--proto_path=@CURRENT_SOURCE_DIR@',
-    '--cpp_out=@OUTDIR@',
-    '@INPUT@'
-  ],
-  output: [
-    'metricblob.pb.cc',
-    'metricblob.pb.h',
-  ],
-  input: 'metricblob.proto')
-proto_h = proto[1]
+tgt = custom_target(
+  'metricblob.pb.n.hc',
+  input: 'metricblob.proto',
+  kwargs: nanopb_kwargs)
+metrics_nanopb_hdr = tgt[0]
+metrics_nanopb_src = tgt[1]
+
+metrics_nanopb_pre = declare_dependency(
+  include_directories: include_directories('.'),
+  sources: metrics_nanopb_hdr,
+  dependencies: [
+    nanopb_dep,
+  ])
+
+metrics_nanopb_lib = static_library(
+  'metrics_nanopb',
+  metrics_nanopb_src,
+  implicit_include_directories: false,
+  dependencies: metrics_nanopb_pre)
+
+metrics_nanopb_dep = declare_dependency(
+  dependencies: metrics_nanopb_pre,
+  link_with: metrics_nanopb_lib)
+
+pre = declare_dependency(
+  include_directories: include_directories('.'),
+  dependencies: [
+    metrics_nanopb_dep,
+    dependency('phosphor-logging'),
+    dependency('phosphor-ipmi-blobs'),
+    dependency('sdbusplus'),
+  ])
 
 lib = static_library(
   'metricsblob',
   'util.cpp',
   'handler.cpp',
   'metric.cpp',
-  proto,
-  include_directories: headers,
   implicit_include_directories: false,
-  dependencies: deps)
+  dependencies: pre)
 
 dep = declare_dependency(
-  sources: proto_h,
-  dependencies: deps,
-  include_directories: headers,
+  dependencies: pre,
   link_with: lib)
 
 shared_module(