build: enable meson build

Add meson build support.  Autotools support will be removed in
the future once the consuming meta-phosphor recipes are updated.

This should be feature complete relative to the previous autotools
support.

Additionally, support is added for using sdbusplus as a subproject
in the event that users do not have sdbusplus installed.

Signed-off-by: Patrick Williams <patrick@stwcx.xyz>
Change-Id: Ic2c0129bda11cf10aaa557c2fd6403e2ed2cd8dd
diff --git a/meson.build b/meson.build
new file mode 100644
index 0000000..d2bb5cd
--- /dev/null
+++ b/meson.build
@@ -0,0 +1,123 @@
+project('phosphor-dbus-interfaces', 'cpp',
+    meson_version: '>= 0.54.1',
+    default_options: [
+        'buildtype=debugoptimized',
+        'cpp_std=c++17',
+        'warning_level=3',
+        'werror=true',
+    ],
+    version: '1.0.0',
+)
+# meson_version >= 0.54.1 is necessary because that is the first place meson
+# generates unique object filenames for two files with the same `basename`.
+# Many sdbus++ generated files have `basename` collisions because they are
+# named like `.../server.cpp`.  Prior to this version, meson would create a
+# ninja recipe for a single `server.o` file.
+
+# Get sdbusplus dependency.
+sdbusplus_dep = dependency('sdbusplus', required: false)
+if sdbusplus_dep.found()
+    sdbusplusplus_prog = find_program('sdbus++')
+    sdbusgen_prog = find_program('sdbus++-gendir')
+else
+    sdbusplus_proj = subproject('sdbusplus', required: true)
+    sdbusplus_dep = sdbusplus_proj.get_variable('sdbusplus_dep')
+    sdbusplusplus_prog = sdbusplus_proj.get_variable('sdbusplusplus_prog')
+    sdbusgen_prog = sdbusplus_proj.get_variable('sdbusgen_prog')
+endif
+
+realpath_prog = find_program('realpath')
+
+# Parse options to determine appropriate subdirectories to support.
+selected_subdirs = []
+if get_option('data_com_ibm')
+    selected_subdirs += 'com/ibm'
+endif
+if get_option('data_org_open_power')
+    selected_subdirs += 'org/open_power'
+endif
+if get_option('data_xyz_openbmc_project')
+    selected_subdirs += 'xyz/openbmc_project'
+endif
+
+# Install the selected YAML files.
+foreach d : selected_subdirs
+    install_subdir(
+        d,
+        install_dir: get_option('datadir') / 'phosphor-dbus-yaml/yaml' / d,
+        strip_directory: true,
+    )
+endforeach
+
+# If libphosphor_dbus was not enabled, exit out from here.  We installed
+# the YAML which is all we are asked to do.
+if not get_option('libphosphor_dbus')
+    subdir_done()
+endif
+
+# Generate all the sdbus++ files from the selected subdirectories.
+generated_root = meson.current_build_dir() / 'gen-out'
+generated_files = run_command(
+        sdbusgen_prog,
+        '--list-all',
+        '--tool', sdbusplusplus_prog,
+        '--output', generated_root,
+        selected_subdirs,
+        check: true,
+).stdout().strip().split('\n')
+
+# Parse through the list from sdbus++-gendir and put into sets.
+generated_headers = []
+generated_cpp = []
+generated_cpp_fullpath = []
+generated_others = []
+
+foreach f : generated_files
+    rel_path = run_command(
+        realpath_prog,
+        '--relative-to', generated_root,
+        f,
+    ).stdout().strip().split('\n')[-1]
+
+    if f.endswith('.hpp')
+        generated_headers += rel_path
+    elif f.endswith('.cpp')
+        generated_cpp += rel_path
+        generated_cpp_fullpath += f
+    else
+        generated_others += rel_path
+    endif
+endforeach
+
+# Install the generated header files.
+install_subdir(
+    generated_root,
+    exclude_files: [ generated_cpp, generated_others ],
+    install_dir: get_option('includedir'),
+    strip_directory: true,
+)
+
+# Install the generated markdown files.
+install_subdir(
+    generated_root,
+    exclude_files: [ generated_headers, generated_cpp ],
+    install_dir: get_option('datadir') / meson.project_name(),
+    strip_directory: true,
+)
+
+# Define and build libphosphor_dbus.so from the C++ files.
+libphosphor_dbus = library(
+    'phosphor_dbus',
+    files(generated_cpp_fullpath),
+    include_directories: include_directories('gen-out'),
+    dependencies: sdbusplus_dep,
+    version: meson.project_version(),
+    install: true,
+)
+
+import('pkgconfig').generate(
+    libraries: libphosphor_dbus,
+    name: meson.project_name(),
+    version: meson.project_version(),
+    description: 'Generated sdbusplus bindings for phosphor-dbus-interfaces'
+)