Move repository to meson

The time has come to move this over to meson as automake is not building
properly with the latest c++ and the OpenBMC project has made it a
requirement that all repos move to meson.

Tested:
- Confirmed p10bmc now builds with appropriate recipe updates on top
  of latest sdbusplus bump

Change-Id: I303731f1b5b7c617ecb1140b22bac6dbd27acbc0
Signed-off-by: Andrew Geissler <geissonator@yahoo.com>
diff --git a/.gitignore b/.gitignore
index 6ef6990..6ebea1a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,52 +1,4 @@
-# Template from:
-# https://github.com/github/gitignore/blob/master/Autotools.gitignore
-
-# http://www.gnu.org/software/automake
-
-Makefile.in
-/ar-lib
-/mdate-sh
-/py-compile
-/test-driver
-/ylwrap
-
-# http://www.gnu.org/software/autoconf
-
-/autom4te.cache
-/autoscan.log
-/autoscan-*.log
-/aclocal.m4
-/compile
-/config.guess
-/config.h.in
-/config.sub
-/configure
-/configure.scan
-/depcomp
-/install-sh
-/missing
-/stamp-h1
-
-# https://www.gnu.org/software/libtool/
-/libtool
-/ltmain.sh
-
-# http://www.gnu.org/software/texinfo
-
-/texinfo.tex
-
-# Repo Specific Items
-/*.o
-/config.h
-/config.h.in~
-/config.log
-/config.status
-Makefile
-.deps
-*-libtool
-.project
-.libs*
-*.lo
-*.la
-org/open_power/OCC/Metrics/*
-/inventory-sensor.cpp
+build*/
+subprojects/*
+!subprojects/*.wrap
+.vscode/
\ No newline at end of file
diff --git a/Makefile.am b/Makefile.am
deleted file mode 100644
index 00ea59f..0000000
--- a/Makefile.am
+++ /dev/null
@@ -1,38 +0,0 @@
-liboemhandlerdir = ${libdir}/ipmid-providers
-liboemhandler_LTLIBRARIES = liboemhandler.la
-
-liboemhandler_la_SOURCES = oemhandler.cpp \
-                           host-interface.cpp \
-                           org/open_power/OCC/Metrics/error.cpp \
-                           inventory-sensor.cpp
-
-BUILT_SOURCES = org/open_power/OCC/Metrics/error.hpp \
-                org/open_power/OCC/Metrics/error.cpp \
-                inventory-sensor.cpp
-
-CLEANFILES = $(BUILT_SOURCES)
-
-liboemhandler_la_LDFLAGS = $(SYSTEMD_LIBS)\
-                           $(SDBUSPLUS_LIBS) \
-                           $(LIBIPMID_LIBS) \
-                           $(LIBIPMID_HOST_LIBS) \
-                           $(PHOSPHOR_LOGGING_LIBS) \
-                           -version-info 0:0:0 -shared
-
-liboemhandler_la_CXXFLAGS = $(SYSTEMD_CFLAGS) \
-                            $(SDBUSPLUS_CFLAGS) \
-                            $(LIBIPMID_CFLAGS) \
-                            $(LIBIPMID_HOST_CFLAGS) \
-                            $(PHOSPHOR_LOGGING_CFLAGS) \
-                            $(AM_CXXFLAGS)
-
-org/open_power/OCC/Metrics/error.hpp: ${top_srcdir}/org/open_power/OCC/Metrics.errors.yaml
-	@mkdir -p `dirname $@`
-	$(SDBUSPLUSPLUS) -r $(top_srcdir) error exception-header org.open_power.OCC.Metrics > $@
-
-org/open_power/OCC/Metrics/error.cpp: ${top_srcdir}/org/open_power/OCC/Metrics.errors.yaml
-	@mkdir -p `dirname $@`
-	$(SDBUSPLUSPLUS) -r $(top_srcdir) error exception-cpp org.open_power.OCC.Metrics > $@
-
-inventory-sensor.cpp:
-	$(AM_V_GEN)@INVSENSORGEN@ -o $(top_builddir) generate-cpp
diff --git a/README.md b/README.md
index 31aed45..5e3fb66 100644
--- a/README.md
+++ b/README.md
@@ -7,11 +7,10 @@
 ```
 To build this package, do the following steps:
 
-    1. ./bootstrap.sh
-    2. ./configure ${CONFIGURE_FLAGS}
-    3. make
+    meson setup build
+    ninja -C build
 
-To clean the repository run `./bootstrap.sh clean`.
+To clean the repository again run rm -rf build.
 ```
 
 ## Supported Commands
diff --git a/configure.ac b/configure.ac
deleted file mode 100644
index 33d383a..0000000
--- a/configure.ac
+++ /dev/null
@@ -1,84 +0,0 @@
-# Initialization
-AC_PREREQ([2.69])
-AC_INIT([openpower-host-ipmi-oem], [1.0], [https://github.com/openbmc/openpower-host-ipmi-oem/issues])
-AC_CONFIG_HEADERS([config.h])
-AM_INIT_AUTOMAKE([subdir-objects -Wall -Werror foreign dist-xz])
-AM_SILENT_RULES([yes])
-AC_LANG([C++])
-
-# Checks for programs.
-AC_PROG_CXX
-AM_PROG_AR
-AC_PROG_INSTALL
-AC_PROG_MAKE_SET
-
-# Checks for libraries.
-PKG_CHECK_MODULES([SYSTEMD], [libsystemd >= 221])
-
-# Checks for header files.
-AC_CHECK_HEADER(systemd/sd-bus.h, ,[AC_MSG_ERROR([Could not find systemd/sd-bus.h...systemd development package required])])
-PKG_CHECK_MODULES([LIBIPMID], [libipmid])
-PKG_CHECK_MODULES([SDBUSPLUS], [sdbusplus])
-PKG_CHECK_MODULES([PHOSPHOR_LOGGING], [phosphor-logging])
-
-# Check for sdbus++ tool
-AC_PATH_PROG([SDBUSPLUSPLUS], [sdbus++])
-AS_IF([test "x$SDBUSPLUSPLUS" == "x"], AC_MSG_ERROR([Cannot find sdbus++]))
-
-# Checks for typedefs, structures, and compiler characteristics.
-AX_CXX_COMPILE_STDCXX([20],[noext])
-AX_APPEND_COMPILE_FLAGS([-Wall -Werror], [CXXFLAGS])
-
-# Checks for library functions.
-LT_INIT([disable-static shared])
-
-# Check/set gtest specific functions.
-AX_PTHREAD([GTEST_CPPFLAGS="-DGTEST_HAS_PTHREAD=1"],[GTEST_CPPFLAGS="-GTEST_HAS_PTHREAD=0"])
-AC_SUBST(GTEST_CPPFLAGS)
-
-AC_ARG_ENABLE([oe-sdk],
-    AS_HELP_STRING([--enable-oe-sdk], [Link testcases absolutely against OE SDK so they can be ran within it.])
-)
-AC_ARG_VAR(OECORE_TARGET_SYSROOT,
-    [Path to the OE SDK SYSROOT])
-AS_IF([test "x$enable_oe_sdk" == "xyes"],
-    AS_IF([test "x$OECORE_TARGET_SYSROOT" == "x"],
-          AC_MSG_ERROR([OECORE_TARGET_SYSROOT must be set with --enable-oe-sdk])
-    )
-    AC_MSG_NOTICE([Enabling OE-SDK at $OECORE_TARGET_SYSROOT])
-    [
-        testcase_flags="-Wl,-rpath,\${OECORE_TARGET_SYSROOT}/lib"
-        testcase_flags="${testcase_flags} -Wl,-rpath,\${OECORE_TARGET_SYSROOT}/usr/lib"
-        testcase_flags="${testcase_flags} -Wl,-dynamic-linker,`find \${OECORE_TARGET_SYSROOT}/lib/ld-*.so | sort -r -n | head -n1`"
-    ]
-    AC_SUBST([OESDK_TESTCASE_FLAGS], [$testcase_flags])
-)
-
-# Host object name in the D-Bus
-AC_ARG_VAR(HOST_NAME, [The Host name in the object path])
-AS_IF([test "x$HOST_NAME" == "x"],
-      [HOST_NAME="host"])
-AC_DEFINE_UNQUOTED([HOST_NAME], ["$HOST_NAME"], [The Host name in the object path])
-
-# Service dbus object manager
-AC_ARG_VAR(CONTROL_HOST_OBJ_MGR, [The Control Host D-Bus Object Manager])
-AS_IF([test "x$CONTROL_HOST_OBJ_MGR" == "x"],
-      [CONTROL_HOST_OBJ_MGR="/org/open_power/control"])
-AC_DEFINE_UNQUOTED([CONTROL_HOST_OBJ_MGR], ["$CONTROL_HOST_OBJ_MGR"], [The Control Host D-Bus Object Manager])
-
-AS_IF([test "x$INVSENSOR_YAML_GEN" == "x"], [INVSENSOR_YAML_GEN="inventory-sensor-example.yaml"])
-INVSENSORGEN="$PYTHON ${srcdir}/scripts/inventory-sensor.py -i $INVSENSOR_YAML_GEN"
-AC_SUBST(INVSENSORGEN)
-
-AC_DEFINE(MAPPER_BUS_NAME, "xyz.openbmc_project.ObjectMapper",
-          [The object mapper bus name])
-
-AC_DEFINE(MAPPER_OBJ, "/xyz/openbmc_project/object_mapper",
-          [The object mapper object path])
-
-AC_DEFINE(MAPPER_IFACE, "xyz.openbmc_project.ObjectMapper",
-          [The object mapper interface])
-
-# Create configured output.
-AC_CONFIG_FILES([Makefile])
-AC_OUTPUT
diff --git a/meson.build b/meson.build
new file mode 100644
index 0000000..1611a06
--- /dev/null
+++ b/meson.build
@@ -0,0 +1,57 @@
+project(
+    'openpower-host-ipmi-oem',
+    'cpp',
+    default_options: [
+        'warning_level=3',
+        'werror=true',
+        'cpp_std=c++23',
+        'buildtype=debugoptimized',
+    ],
+    meson_version: '>=1.1.1',
+    license: 'Apache-2.0',
+    version: '0.1',
+)
+
+conf = configuration_data()
+conf.set_quoted('HOST_NAME', get_option('host-name'))
+
+configure_file(output: 'config.h', configuration: conf)
+
+sdbusplus = dependency('sdbusplus')
+phosphorlogging = dependency('phosphor-logging')
+phosphordbusinterfaces = dependency('phosphor-dbus-interfaces')
+ipmid = dependency('libipmid')
+
+root = meson.current_source_dir()
+
+# Generate sdbus++ code (occmetrics)
+subdir('org/open_power/OCC/Metrics')
+
+# Generate inventory sensor files
+inventory_gen_src = []
+subdir('scripts')
+
+lilboemhandler_sources = [
+    'host-interface.cpp',
+    'oemhandler.cpp',
+    md_cpp,
+    inventory_gen_src,
+]
+
+lilboemhandler = library(
+    'oemhandler',
+    lilboemhandler_sources,
+    gnu_symbol_visibility: 'hidden',
+    install: true,
+    install_dir: get_option('libdir') / 'ipmid-providers',
+    version: meson.project_version(),
+    override_options: ['b_lundef=false'],
+    dependencies: [
+        sdbusplus,
+        phosphorlogging,
+        phosphordbusinterfaces,
+        ipmid,
+        occmetrics_dbus,
+    ],
+)
+
diff --git a/meson.options b/meson.options
new file mode 100644
index 0000000..0284ed1
--- /dev/null
+++ b/meson.options
@@ -0,0 +1,15 @@
+option('tests', type: 'feature', description: 'Build tests')
+
+option(
+    'host-name',
+    type: 'string',
+    value: 'host',
+    description: 'The Host name in the object path.',
+)
+
+# Generate configuration from Yaml
+option(
+    'invsensor-yaml-gen',
+    type: 'string',
+    value: 'inventory-sensor-example.yaml',
+)
diff --git a/oemhandler.cpp b/oemhandler.cpp
index 80ea42e..9623b97 100644
--- a/oemhandler.cpp
+++ b/oemhandler.cpp
@@ -83,8 +83,10 @@
 std::string getService(sdbusplus::bus_t& bus, const std::string& path,
                        const std::string& interface)
 {
-    auto method = bus.new_method_call(MAPPER_BUS_NAME, MAPPER_OBJ, MAPPER_IFACE,
-                                      "GetObject");
+    auto method =
+        bus.new_method_call("xyz.openbmc_project.ObjectMapper",
+                            "/xyz/openbmc_project/object_mapper",
+                            "xyz.openbmc_project.ObjectMapper", "GetObject");
 
     method.append(path);
     method.append(std::vector<std::string>({interface}));
@@ -228,8 +230,10 @@
 // storage.  Likely via the ipmi add_sel command.
 ///////////////////////////////////////////////////////////////////////////////
 ipmi_ret_t ipmi_ibm_oem_partial_esel(
-    ipmi_netfn_t netfn, ipmi_cmd_t cmd, ipmi_request_t request,
-    ipmi_response_t response, ipmi_data_len_t data_len, ipmi_context_t context)
+    [[maybe_unused]] ipmi_netfn_t netfn, [[maybe_unused]] ipmi_cmd_t cmd,
+    [[maybe_unused]] ipmi_request_t request,
+    [[maybe_unused]] ipmi_response_t response, ipmi_data_len_t data_len,
+    [[maybe_unused]] ipmi_context_t context)
 {
     uint8_t* reqptr = (uint8_t*)request;
     esel_request_t esel_req;
@@ -318,8 +322,10 @@
 // Prepare for FW Update.
 // Execute needed commands to prepare the system for a fw update from the host.
 ipmi_ret_t ipmi_ibm_oem_prep_fw_update(
-    ipmi_netfn_t netfn, ipmi_cmd_t cmd, ipmi_request_t request,
-    ipmi_response_t response, ipmi_data_len_t data_len, ipmi_context_t context)
+    [[maybe_unused]] ipmi_netfn_t netfn, [[maybe_unused]] ipmi_cmd_t cmd,
+    [[maybe_unused]] ipmi_request_t request,
+    [[maybe_unused]] ipmi_response_t response, ipmi_data_len_t data_len,
+    [[maybe_unused]] ipmi_context_t context)
 {
     ipmi_ret_t ipmi_rc = IPMI_CC_OK;
     *data_len = 0;
@@ -357,8 +363,11 @@
 }
 
 ipmi_ret_t ipmi_ibm_oem_bmc_factory_reset(
-    ipmi_netfn_t netfn, ipmi_cmd_t cmd, ipmi_request_t request,
-    ipmi_response_t response, ipmi_data_len_t data_len, ipmi_context_t context)
+    [[maybe_unused]] ipmi_netfn_t netfn, [[maybe_unused]] ipmi_cmd_t cmd,
+    [[maybe_unused]] ipmi_request_t request,
+    [[maybe_unused]] ipmi_response_t response,
+    [[maybe_unused]] ipmi_data_len_t data_len,
+    [[maybe_unused]] ipmi_context_t context)
 {
     sdbusplus::bus_t bus{ipmid_get_sd_bus_connection()};
 
@@ -449,12 +458,13 @@
                            ipmi_ibm_oem_bmc_factory_reset, SYSTEM_INTERFACE);
 
     // Create new object on the bus
-    auto objPath = std::string{CONTROL_HOST_OBJ_MGR} + '/' + HOST_NAME + '0';
+    auto objPath = std::string{"/org/open_power/control"} + '/' + HOST_NAME +
+                   '0';
 
     // Add sdbusplus ObjectManager.
     auto& sdbusPlusHandler = ipmid_get_sdbus_plus_handler();
     objManager = std::make_unique<sdbusplus::server::manager_t>(
-        *sdbusPlusHandler, CONTROL_HOST_OBJ_MGR);
+        *sdbusPlusHandler, "/org/open_power/control");
 
     opHost = std::make_unique<open_power::host::command::Host>(
         *sdbusPlusHandler, objPath.c_str());
diff --git a/org/open_power/OCC/Metrics/meson.build b/org/open_power/OCC/Metrics/meson.build
new file mode 100644
index 0000000..40504c1
--- /dev/null
+++ b/org/open_power/OCC/Metrics/meson.build
@@ -0,0 +1,34 @@
+sdbuspp_prog = find_program('sdbus++')
+
+domain = 'org.open_power.OCC.Metrics'
+md_yaml_file = files('../Metrics.metadata.yaml')
+
+md_cpp = custom_target(
+    'error.cpp',
+    output: 'error.cpp',
+    input: md_yaml_file,
+    capture: true,
+    command: [sdbuspp_prog, '-r', root, 'error', 'exception-cpp', domain],
+    install: true,
+    install_dir: get_option('includedir') / 'org/open_power/OCC/Metrics',
+)
+
+md_hpp = custom_target(
+    'error.hpp',
+    output: 'error.hpp',
+    input: md_yaml_file,
+    capture: true,
+    command: [sdbuspp_prog, '-r', root, 'error', 'exception-header', domain],
+    install: true,
+    install_dir: get_option('includedir') / 'org/open_power/OCC/Metrics',
+)
+
+occmetrics_dbus_deps = [
+    dependency('phosphor-dbus-interfaces'),
+    dependency('sdbusplus'),
+]
+
+occmetrics_dbus = declare_dependency(
+    dependencies: occmetrics_dbus_deps,
+    sources: [md_cpp, md_hpp],
+)
diff --git a/scripts/inventory-sensor.py b/scripts/inventory-sensor.py
index f5a8d1d..680f5e7 100755
--- a/scripts/inventory-sensor.py
+++ b/scripts/inventory-sensor.py
@@ -9,7 +9,7 @@
 
 
 def generate_cpp(sensor_yaml, output_dir):
-    with open(os.path.join(script_dir, sensor_yaml), "r") as f:
+    with open(sensor_yaml, "r") as f:
         ifile = yaml.safe_load(f)
         if not isinstance(ifile, dict):
             ifile = {}
@@ -57,7 +57,7 @@
 
     args = parser.parse_args()
 
-    if not (os.path.isfile(os.path.join(script_dir, args.sensor_yaml))):
+    if not (os.path.isfile(args.sensor_yaml)):
         sys.exit("Can not find input yaml file " + args.sensor_yaml)
 
     function = valid_commands[args.command]
diff --git a/scripts/meson.build b/scripts/meson.build
new file mode 100644
index 0000000..9b78af1
--- /dev/null
+++ b/scripts/meson.build
@@ -0,0 +1,18 @@
+# Generate Configuration Files from Yaml
+python_exe = find_program('python3', 'python')
+
+invsensor_gen = custom_target(
+    'invsensor-gen',
+    output: 'inventory-sensor.cpp',
+    input: ['inventory-sensor.py', get_option('invsensor-yaml-gen')],
+    command: [
+        python_exe,
+        '@INPUT0@',
+        '-i',
+        '@INPUT1@',
+        '-o',
+        meson.current_build_dir(),
+        'generate-cpp',
+    ],
+)
+inventory_gen_src = invsensor_gen
diff --git a/subprojects/phosphor-dbus-interfaces.wrap b/subprojects/phosphor-dbus-interfaces.wrap
new file mode 100644
index 0000000..346aa0c
--- /dev/null
+++ b/subprojects/phosphor-dbus-interfaces.wrap
@@ -0,0 +1,6 @@
+[wrap-git]
+url = https://github.com/openbmc/phosphor-dbus-interfaces.git
+revision = HEAD
+
+[provide]
+phosphor-dbus-interfaces = phosphor_dbus_interfaces_dep
diff --git a/subprojects/phosphor-logging.wrap b/subprojects/phosphor-logging.wrap
new file mode 100644
index 0000000..71eee8b
--- /dev/null
+++ b/subprojects/phosphor-logging.wrap
@@ -0,0 +1,6 @@
+[wrap-git]
+url = https://github.com/openbmc/phosphor-logging.git
+revision = HEAD
+
+[provide]
+phosphor-logging = phosphor_logging_dep
diff --git a/subprojects/sdbusplus.wrap b/subprojects/sdbusplus.wrap
new file mode 100644
index 0000000..7b076d0
--- /dev/null
+++ b/subprojects/sdbusplus.wrap
@@ -0,0 +1,6 @@
+[wrap-git]
+url = https://github.com/openbmc/sdbusplus.git
+revision = HEAD
+
+[provide]
+sdbusplus = sdbusplus_dep