metrics-ipmi-blobs: Refactor meson build

Change-Id: I7aae036339fd1429781237932a99ddc701d91d84
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/metrics-ipmi-blobs/handler.cpp b/metrics-ipmi-blobs/handler.cpp
index 9baa9b2..6b594fb 100644
--- a/metrics-ipmi-blobs/handler.cpp
+++ b/metrics-ipmi-blobs/handler.cpp
@@ -41,13 +41,13 @@
 }
 
 // BmcBlobDelete (7) is not supported.
-bool MetricBlobHandler::deleteBlob(const std::string& path)
+bool MetricBlobHandler::deleteBlob(const std::string&)
 {
     return false;
 }
 
 // BmcBlobStat (8) (global stat) is not supported.
-bool MetricBlobHandler::stat(const std::string& path, BlobMeta* meta)
+bool MetricBlobHandler::stat(const std::string&, BlobMeta*)
 {
     return false;
 }
@@ -102,22 +102,20 @@
 }
 
 // BmcBlobWrite(4) is not supported.
-bool MetricBlobHandler::write(uint16_t session, uint32_t offset,
-                              const std::vector<uint8_t>& data)
+bool MetricBlobHandler::write(uint16_t, uint32_t, const std::vector<uint8_t>&)
 {
     return false;
 }
 
 // BmcBlobWriteMeta(10) is not supported.
-bool MetricBlobHandler::writeMeta(uint16_t session, uint32_t offset,
-                                  const std::vector<uint8_t>& data)
+bool MetricBlobHandler::writeMeta(uint16_t, uint32_t,
+                                  const std::vector<uint8_t>&)
 {
     return false;
 }
 
 // BmcBlobCommit(5) is not supported.
-bool MetricBlobHandler::commit(uint16_t session,
-                               const std::vector<uint8_t>& data)
+bool MetricBlobHandler::commit(uint16_t, const std::vector<uint8_t>&)
 {
     return false;
 }
diff --git a/metrics-ipmi-blobs/meson.build b/metrics-ipmi-blobs/meson.build
index ad13955..6915ea0 100644
--- a/metrics-ipmi-blobs/meson.build
+++ b/metrics-ipmi-blobs/meson.build
@@ -17,42 +17,56 @@
   'cpp',
   version: '0.1',
   default_options: [
+    'warning_level=3',
+    'werror=true',
     'cpp_std=c++17',
+    'tests=' + (meson.is_subproject() ? 'disabled' : 'auto'),
   ],
 )
 
-add_project_arguments(
-  '-Wno-unused-parameter',
-  language:'cpp')
+headers = include_directories('.')
 
-protoc = find_program('protoc', required: true)
+deps = [
+  dependency('phosphor-logging'),
+  dependency('phosphor-ipmi-blobs'),
+  dependency('protobuf'),
+]
 
-gen = generator(protoc,
-  output: [
-    '@BASENAME@.pb.cc', '@BASENAME@.pb.h'
-  ],
-  arguments : ['--proto_path=@CURRENT_SOURCE_DIR@', '--cpp_out=@BUILD_DIR@', '@INPUT@'])
-generated = gen.process(['metricblob.proto'])
-
-shared_library(
-  'metrics',
-  'main.cpp',
+lib = static_library(
+  'metricsblob',
+  'util.cpp',
   'handler.cpp',
   'metric.cpp',
-  'util.cpp',
-  generated,
-  install: true,
-  install_dir: '/usr/lib/blob-ipmid/',
-  dependencies: [
-    dependency('phosphor-logging'),
-    dependency('phosphor-ipmi-blobs'),
-    dependency('protobuf'),
-  ],
-  version: '0',
-)
+  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'),
+  include_directories: headers,
+  implicit_include_directories: false,
+  dependencies: deps)
 
-gtest_dep = dependency('gtest')
-text_executable = executable('testprog', [
-    'test/util_test.cpp', 'util.cpp'],
-    dependencies: [ gtest_dep, dependency('phosphor-logging') ])
-test('gtest test', text_executable)
+dep = declare_dependency(
+  dependencies: deps,
+  include_directories: headers,
+  link_with: lib)
+
+shared_module(
+  'metricsblob',
+  'main.cpp',
+  dependencies: dep,
+  implicit_include_directories: false,
+  install: true,
+  install_dir: get_option('libdir') / 'ipmid-providers')
+
+if not get_option('tests').disabled()
+  subdir('test')
+endif
diff --git a/metrics-ipmi-blobs/meson_options.txt b/metrics-ipmi-blobs/meson_options.txt
new file mode 100644
index 0000000..0fc2767
--- /dev/null
+++ b/metrics-ipmi-blobs/meson_options.txt
@@ -0,0 +1 @@
+option('tests', type: 'feature', description: 'Build tests')
diff --git a/metrics-ipmi-blobs/test/meson.build b/metrics-ipmi-blobs/test/meson.build
new file mode 100644
index 0000000..a4b60d0
--- /dev/null
+++ b/metrics-ipmi-blobs/test/meson.build
@@ -0,0 +1,32 @@
+gtest = dependency('gtest', main: true, disabler: true, required: false)
+gmock = dependency('gmock', disabler: true, required: false)
+if not gtest.found() or not gmock.found()
+  gtest_proj = import('cmake').subproject(
+    'googletest',
+    cmake_options: [
+      '-DCMAKE_CXX_FLAGS=-Wno-pedantic',
+    ],
+    required: false)
+  if gtest_proj.found()
+    gtest = declare_dependency(
+      dependencies: [
+        dependency('threads'),
+        gtest_proj.dependency('gtest'),
+        gtest_proj.dependency('gtest_main'),
+      ])
+    gmock = gtest_proj.dependency('gmock')
+  else
+    assert(not get_option('tests').enabled(), 'Googletest is required')
+  endif
+endif
+
+tests = [
+  'util_test',
+]
+
+foreach t : tests
+  test(t, executable(t.underscorify(), t + '.cpp',
+                     implicit_include_directories: false,
+                     dependencies: [gtest, gmock, dep]))
+endforeach
+