meson: add proper cereal dependency

There are source files that assume cereal header files will be present
without the meson build explicitly finding that dependency.  This leads
to compile failures when using the meson-subproject based build.  Add a
proper dependency and wrap file for this, based on similar code found in
phosphor-logging.

Signed-off-by: Patrick Williams <patrick@stwcx.xyz>
Change-Id: I6819be89101ded9f8a4dbe885074d30cb06e2df7
diff --git a/meson.build b/meson.build
index 2eb51d3..a064c1c 100644
--- a/meson.build
+++ b/meson.build
@@ -12,9 +12,11 @@
         license: 'Apache-2.0'
        )
 
+cpp = meson.get_compiler('cpp')
+
 # Checking dependency external library
 
-cppfs = meson.get_compiler('cpp').find_library('stdc++fs')
+cppfs = cpp.find_library('stdc++fs')
 libsystemd = dependency('libsystemd', version : '>=221')
 
 sdbusplus_dep = dependency('sdbusplus', required: false)
@@ -57,6 +59,24 @@
   fmt_dep = fmt_proj.dependency('fmt')
 endif
 
+# Get Cereal dependency.
+cereal_dep = dependency('cereal', required: false)
+has_cereal = cpp.has_header_symbol(
+    'cereal/cereal.hpp',
+    'cereal::specialize',
+    dependencies: cereal_dep,
+    required: false)
+if not has_cereal
+    cereal_opts = import('cmake').subproject_options()
+    cereal_opts.add_cmake_defines({'BUILD_TESTS': 'OFF'})
+    cereal_proj = import('cmake').subproject(
+        'cereal',
+        options: cereal_opts,
+        required: false)
+    assert(cereal_proj.found(), 'cereal is required')
+    cereal_dep = cereal_proj.dependency('cereal')
+endif
+
 # Disable FORTIFY_SOURCE when compiling with no optimization
 if(get_option('optimization') == '0')
   add_project_arguments('-U_FORTIFY_SOURCE',language:['cpp','c'])
@@ -160,7 +180,8 @@
         sdbusplus_dep,
         phosphor_logging_dep,
         cppfs,
-        fmt_dep
+        fmt_dep,
+        cereal_dep,
     ]
 
 phosphor_dump_manager_install = true