build: support building with subprojects

Enable everything to build outside of an OE-SDK by leveraging
subproject wrap files.  Needed to update C++ to C++20 as well
in order to allow phosphor-logging to compile.

Signed-off-by: Patrick Williams <patrick@stwcx.xyz>
Change-Id: I43f5fcd53ef3ac024d7b5ce50fd035903d08bab0
diff --git a/.gitignore b/.gitignore
index 378eac2..6da54be 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,3 @@
-build
+build*/
+subprojects/*
+!subprojects/*.wrap
diff --git a/meson.build b/meson.build
index 29939ed..e182f46 100644
--- a/meson.build
+++ b/meson.build
@@ -1,10 +1,11 @@
 project('phosphor-bmc-code-mgmt', 'cpp',
     default_options: [
         'buildtype=debugoptimized',
-        'cpp_std=c++17',
+        'cpp_std=c++20',
         'warning_level=3',
         'werror=true'
     ],
+    meson_version: '>= 0.57.0',
     license: 'Apache-2.0',
     version: '1.0')
 
@@ -19,6 +20,8 @@
     language: 'cpp',
 )
 
+cpp = meson.get_compiler('cpp')
+
 conf = configuration_data()
 
 # DBus information
@@ -96,10 +99,52 @@
 
 configure_file(output: 'config.h', configuration: conf)
 
+sdbusplus_dep = dependency('sdbusplus', required: false)
+sdbusplus_proj = dependency('', required: false)
+if not sdbusplus_dep.found() or sdbusplus_dep.type_name() == 'internal'
+    sdbusplus_proj = subproject('sdbusplus')
+endif
+if not sdbusplus_dep.found()
+    sdbusplus_dep = sdbusplus_proj.get_variable('sdbusplus_dep')
+endif
+
+if sdbusplus_proj.found()
+    sdbusplusplus_prog = sdbusplus_proj.get_variable('sdbusplusplus_prog')
+    sdbuspp_gen_meson_prog = sdbusplus_proj.get_variable(
+        'sdbuspp_gen_meson_prog')
+else
+    sdbusplusplus_prog = find_program('sdbus++', native: true)
+    sdbuspp_gen_meson_prog = find_program('sdbus++-gen-meson', native: true)
+endif
+
+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
+
 deps = [
-    dependency('phosphor-dbus-interfaces'),
-    dependency('phosphor-logging'),
-    dependency('sdbusplus')
+    dependency(
+        'phosphor-dbus-interfaces',
+        fallback: ['phosphor-dbus-interfaces', 'phosphor_dbus_interfaces_dep'],
+    ),
+    dependency(
+        'phosphor-logging',
+        fallback: ['phosphor-logging', 'phosphor_logging_dep'],
+    ),
+    sdbusplus_dep,
+    cereal_dep,
 ]
 
 ssl = dependency('openssl')
@@ -119,7 +164,6 @@
     'xyz.openbmc_project.Software.Version.service.in'
 ]
 
-sdbuspp = find_program('sdbus++')
 subdir('xyz/openbmc_project/Software/Image')
 
 image_updater_sources = files(
diff --git a/subprojects/cereal.wrap b/subprojects/cereal.wrap
new file mode 100644
index 0000000..a4cb7ec
--- /dev/null
+++ b/subprojects/cereal.wrap
@@ -0,0 +1,4 @@
+[wrap-git]
+url = https://github.com/USCiLab/cereal.git
+revision = HEAD
+# need at least for C++20 fixes 3e4d1b84cab4891368d2179a61a7ba06a5693e7f
diff --git a/subprojects/phosphor-dbus-interfaces.wrap b/subprojects/phosphor-dbus-interfaces.wrap
new file mode 100644
index 0000000..935a8b2
--- /dev/null
+++ b/subprojects/phosphor-dbus-interfaces.wrap
@@ -0,0 +1,3 @@
+[wrap-git]
+url = https://github.com/openbmc/phosphor-dbus-interfaces.git
+revision = HEAD
diff --git a/subprojects/phosphor-logging.wrap b/subprojects/phosphor-logging.wrap
new file mode 100644
index 0000000..a039fcf
--- /dev/null
+++ b/subprojects/phosphor-logging.wrap
@@ -0,0 +1,3 @@
+[wrap-git]
+url = https://github.com/openbmc/phosphor-logging.git
+revision = HEAD
diff --git a/subprojects/sdbusplus.wrap b/subprojects/sdbusplus.wrap
new file mode 100644
index 0000000..d470130
--- /dev/null
+++ b/subprojects/sdbusplus.wrap
@@ -0,0 +1,3 @@
+[wrap-git]
+url = https://github.com/openbmc/sdbusplus.git
+revision = HEAD
diff --git a/xyz/openbmc_project/Software/Image/meson.build b/xyz/openbmc_project/Software/Image/meson.build
index 293efa0..4ae382f 100644
--- a/xyz/openbmc_project/Software/Image/meson.build
+++ b/xyz/openbmc_project/Software/Image/meson.build
@@ -2,7 +2,7 @@
     'error.hpp',
     capture: true,
     command: [
-        sdbuspp,
+        sdbusplusplus_prog,
         '-r', meson.source_root(),
         'error',
         'exception-header',
@@ -18,7 +18,7 @@
     'error.cpp',
     capture: true,
     command: [
-        sdbuspp,
+        sdbusplusplus_prog,
         '-r', meson.source_root(),
         'error',
         'exception-cpp',