Implement a performance testing tool for sensors

There are a lot of hypothesis being made about how to improve the
performance of the sensor subsystem within OpenBMC.  There are a number
of statements being made about dbus performance that actually seem
likely to be related to the efficiency of specific implementations of
certain sensors within OpenBMC.  Blocking calls, non blocking calls,
asio, bulk collection, eventing, threads and other design decisions all
can have an effect on the performance of a sensor application.

This commit attempts to write a small, portable daemon that publishes
sensor interfaces read from memory in a relatively simple and
controllable manner.  This allows running it on a bmc (with services
unloaded) to determine some theoretical "max" performance
characteristics, assuming 0 cost for grabbing actual values.

Signed-off-by: Ed Tanous <edtanous@google.com>
Change-Id: I27f1560ba13492ccff6a01013c3a1d5ee210cef0
diff --git a/dbus_sensor_tester/meson.build b/dbus_sensor_tester/meson.build
new file mode 100644
index 0000000..31d28c5
--- /dev/null
+++ b/dbus_sensor_tester/meson.build
@@ -0,0 +1,138 @@
+project('dbus-sensor-tester', 'cpp',
+        version : '1.0',
+        meson_version: '>=0.57.0',
+        default_options: [
+            'b_lto_mode=default',
+            'b_lto_threads=0',
+            'b_lto=true',
+            'b_ndebug=if-release',
+            'buildtype=debugoptimized',
+            'cpp_rtti=false',
+            'cpp_std=c++20',
+            'warning_level=3',
+            'werror=true',
+           ])
+
+# Project related links
+
+project_pretty_name = 'dbus-sensor-tester'
+
+# Validate the c++ Standard
+
+if get_option('cpp_std') != 'c++20'
+    error('This project requires c++20 support')
+endif
+
+# Get compiler and default build type
+
+cxx = meson.get_compiler('cpp')
+build = get_option('buildtype')
+optimization = get_option('optimization')
+summary('Build Type',build, section : 'Build Info')
+summary('Optimization',optimization, section : 'Build Info')
+
+# Disable lto when compiling with no optimization
+if(get_option('optimization') == '0')
+  add_project_arguments('-fno-lto', language: 'cpp')
+  message('Disabling lto & its supported features as optimization is disabled')
+endif
+
+# Add compiler arguments
+
+# -Wpedantic, -Wextra comes by default with warning level
+add_project_arguments(
+  cxx.get_supported_arguments([
+  '-Wcast-align',
+  '-Wconversion',
+  '-Wformat=2',
+  '-Wold-style-cast',
+  '-Woverloaded-virtual',
+  '-Wsign-conversion',
+  '-Wunused',
+  '-Wno-attributes',
+  ]),
+  language: 'cpp'
+)
+
+if (cxx.get_id() == 'clang' and cxx.version().version_compare('>9.0'))
+add_project_arguments(
+  cxx.get_supported_arguments([
+    '-Weverything',
+    '-Wno-c++98-compat-pedantic',
+    '-Wno-c++98-compat',
+    '-Wno-documentation-unknown-command',
+    '-Wno-documentation',
+    '-Wno-exit-time-destructors',
+    '-Wno-global-constructors',
+    '-Wno-newline-eof',
+    '-Wno-padded',
+    '-Wno-shadow',
+    '-Wno-used-but-marked-unused',
+    '-Wno-weak-vtables',
+  ]),
+  language:'cpp')
+endif
+
+# if compiler is gnu-gcc , and version is > 8.0 then we add few more
+# compiler arguments , we know that will pass
+
+if (cxx.get_id() == 'gcc' and cxx.version().version_compare('>8.0'))
+  add_project_arguments(
+    cxx.get_supported_arguments([
+     '-Wduplicated-cond',
+     '-Wduplicated-branches',
+     '-Wlogical-op',
+     '-Wunused-parameter',
+     '-Wnull-dereference',
+     '-Wdouble-promotion',
+     ]),
+    language:'cpp')
+endif
+
+# Find the dependency modules, if not found use meson wrap to get them
+# automatically during the configure step
+dependencies = []
+
+sdbusplus = dependency('sdbusplus', required : false, include_type: 'system')
+if not sdbusplus.found()
+  sdbusplus_proj = subproject('sdbusplus', required: true)
+  sdbusplus = sdbusplus_proj.get_variable('sdbusplus_dep')
+  sdbusplus = sdbusplus.as_system('system')
+endif
+dependencies += sdbusplus
+
+cli11 = dependency('cli11', required : false, include_type: 'system')
+if not cli11.found()
+  cli11_proj = subproject('cli11', required: true)
+  cli11 = cli11_proj.get_variable('CLI11_dep')
+  cli11 = cli11.as_system('system')
+endif
+dependencies += cli11
+
+systemd = dependency('systemd')
+dependencies += [systemd]
+
+boost = dependency('boost', version : '>=1.78.0', required : false, include_type: 'system')
+if not boost.found()
+  subproject('boost', required: false)
+  boost_inc = include_directories('subprojects/boost_1_78_0/', is_system:true)
+  boost  = declare_dependency(include_directories : boost_inc)
+  boost = boost.as_system('system')
+endif
+dependencies += boost
+
+srcfiles_sensortest = [
+]
+
+systemd_system_unit_dir = systemd.get_variable(pkgconfig: 'systemdsystemunitdir')
+bindir = get_option('prefix') + '/' +get_option('bindir')
+
+# Generate the executable
+executable(
+  'sensortest',
+  srcfiles_sensortest + ['main.cpp'],
+  dependencies: dependencies,
+  link_args: '-Wl,--gc-sections',
+  install: true,
+  install_dir: bindir
+)