Setup RDE client environment

Google-Bug-Id: 309116881
Change-Id: Ic6047219731bac1bfbaef53c65eb5ce5a624a545
Signed-off-by: Harsh Tyagi <harshtya@google.com>
diff --git a/meson.build b/meson.build
new file mode 100644
index 0000000..ad85098
--- /dev/null
+++ b/meson.build
@@ -0,0 +1,95 @@
+project('rded', ['c', 'cpp'],
+        version: '0.1', meson_version: '>=1.1.1',
+        default_options: [
+          'warning_level=3',
+          'werror=true',
+          'cpp_std=c++23',
+          'c_std=c18',
+        ])
+
+sources = [
+  'rded.cpp'
+]
+
+cpp = meson.get_compiler('cpp')
+phosphor_dbus_interfaces = dependency('phosphor-dbus-interfaces')
+sdbusplus = dependency('sdbusplus')
+sdeventplus = dependency('sdeventplus')
+stdplus = dependency('stdplus')
+phosphor_logging_dep = dependency('phosphor-logging')
+
+if cpp.has_header('nlohmann/json.hpp')
+  nlohmann_json = declare_dependency()
+else
+  nlohmann_json = dependency('nlohmann_json')
+endif
+
+if get_option('tests').allowed()
+  subdir('tests')
+endif
+
+libbej_dep = dependency('libbej')
+libpldm_dep = dependency('libpldm')
+
+headers = ['.']
+requester_inc = include_directories(headers)
+req_src = declare_dependency(include_directories:requester_inc)
+
+boost = dependency(
+  'boost',
+  version : '>=1.82.0',
+  required : false,
+  include_type: 'system'
+)
+
+if not boost.found()
+  boost = subproject('boost', required: true).get_variable('boost_dep')
+  boost = boost.as_system('system')
+endif
+
+boost_compile_args = [
+  '-DBOOST_ASIO_DISABLE_THREADS',
+  '-DBOOST_ALL_NO_LIB',
+  '-DBOOST_SYSTEM_NO_DEPRECATED',
+  '-DBOOST_ERROR_CODE_HEADER_ONLY',
+  '-DBOOST_COROUTINES_NO_DEPRECATION_WARNING',
+]
+
+boost_dep = declare_dependency(
+    dependencies: dependency('boost',
+    modules: ['coroutine', 'context'],
+    disabler: true,
+    required: false
+  ),
+  compile_args: boost_compile_args)
+
+deps = [
+  libpldm_dep,
+  libbej_dep,
+  boost_dep,
+  nlohmann_json,
+  phosphor_dbus_interfaces,
+  sdbusplus,
+  sdeventplus,
+  stdplus,
+  req_src,
+]
+
+executable(
+  'rded',
+  sources,
+  implicit_include_directories: false,
+  dependencies: deps,
+  install: true,
+  install_dir: get_option('bindir'))
+
+systemd_dep = dependency('systemd')
+if systemd_dep.found()
+  configure_file(
+    copy: true,
+    input: 'service_files/rded.service',
+    install: true,
+    install_dir: systemd_dep.get_variable('systemdsystemunitdir'),
+    output: 'rded1.service',
+  )
+endif
diff --git a/meson_options.txt b/meson_options.txt
new file mode 100644
index 0000000..90486a6
--- /dev/null
+++ b/meson_options.txt
@@ -0,0 +1,2 @@
+option('tests', type: 'feature', description: 'Build tests', value: 'enabled')
+option('systemd', type: 'feature', description: 'Include systemd support', value: 'enabled')
diff --git a/rded.cpp b/rded.cpp
new file mode 100644
index 0000000..42f2d9b
--- /dev/null
+++ b/rded.cpp
@@ -0,0 +1,6 @@
+#include <iostream>
+int main()
+{
+    // TODO(@harshtya): Add RDE Code
+    return 0;
+}
diff --git a/service_files/rded.service b/service_files/rded.service
new file mode 100644
index 0000000..eb3af9b
--- /dev/null
+++ b/service_files/rded.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=Phosphor RDE Daemon
+
+[Service]
+Type=simple
+Restart=always
+ExecStart=/usr/bin/rded
+
+[Install]
+WantedBy=multi-user.target
diff --git a/subprojects/boost.wrap b/subprojects/boost.wrap
new file mode 100644
index 0000000..2e6b7d1
--- /dev/null
+++ b/subprojects/boost.wrap
@@ -0,0 +1,9 @@
+[wrap-file]
+directory = boost-1.83.0
+
+source_url = https://github.com/boostorg/boost/releases/download/boost-1.83.0/boost-1.83.0.tar.gz
+source_hash = 0c6049764e80aa32754acd7d4f179fd5551d8172a83b71532ae093e7384e98da
+source_filename = 1_83_0.tar.gz
+
+[provide]
+boost = boost_dep
diff --git a/subprojects/libbej.wrap b/subprojects/libbej.wrap
new file mode 100644
index 0000000..4c03659
--- /dev/null
+++ b/subprojects/libbej.wrap
@@ -0,0 +1,6 @@
+[wrap-git]
+url = https://github.com/openbmc/libbej
+revision = HEAD
+
+[provide]
+libbej = libbej
diff --git a/subprojects/libpldm.wrap b/subprojects/libpldm.wrap
new file mode 100644
index 0000000..5c90142
--- /dev/null
+++ b/subprojects/libpldm.wrap
@@ -0,0 +1,6 @@
+[wrap-git]
+url = https://github.com/openbmc/libpldm.git
+revision = HEAD
+
+[provide]
+libpldm = libpldm_dep
diff --git a/subprojects/phosphor-dbus-interfaces.wrap b/subprojects/phosphor-dbus-interfaces.wrap
new file mode 100644
index 0000000..cb65be8
--- /dev/null
+++ b/subprojects/phosphor-dbus-interfaces.wrap
@@ -0,0 +1,6 @@
+[wrap-git]
+url = https://github.com/openbmc/phosphor-dbus-interfaces
+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
diff --git a/subprojects/sdeventplus.wrap b/subprojects/sdeventplus.wrap
new file mode 100644
index 0000000..f871ac0
--- /dev/null
+++ b/subprojects/sdeventplus.wrap
@@ -0,0 +1,6 @@
+[wrap-git]
+url = https://github.com/openbmc/sdeventplus.git
+revision = HEAD
+
+[provide]
+sdeventplus = sdeventplus_dep
diff --git a/subprojects/stdplus.wrap b/subprojects/stdplus.wrap
new file mode 100644
index 0000000..2f8a5f4
--- /dev/null
+++ b/subprojects/stdplus.wrap
@@ -0,0 +1,6 @@
+[wrap-git]
+url = https://github.com/openbmc/stdplus.git
+revision = HEAD
+
+[provide]
+stdplus = stdplus_dep
diff --git a/tests/meson.build b/tests/meson.build
new file mode 100644
index 0000000..446256e
--- /dev/null
+++ b/tests/meson.build
@@ -0,0 +1,30 @@
+gtest = dependency('gtest', main: true, disabler: true, required: false)
+gmock = dependency('gmock', disabler: true, required: false)
+if not gtest.found() or not gmock.found()
+    gtest_proj = import('cmake').subproject('googletest', required: false)
+    if gtest_proj.found()
+        gtest = declare_dependency(
+            dependencies: [
+                dependency('threads'),
+                gtest_proj.dependency('gtest'),
+                gtest_proj.dependency('gtest_main'),
+            ]
+        )
+        gmock = gtest_proj.dependency('gmock')
+    else
+        assert(
+            not get_option('tests').enabled(),
+            'Googletest is required if tests are enabled'
+        )
+    endif
+endif
+
+test(
+    'test_utils',
+    executable(
+        'test_utils',
+        'rde_test.cpp',
+        dependencies: [gtest],
+        implicit_include_directories: false,
+    )
+)
diff --git a/tests/rde_test.cpp b/tests/rde_test.cpp
new file mode 100644
index 0000000..1ad6631
--- /dev/null
+++ b/tests/rde_test.cpp
@@ -0,0 +1,7 @@
+#include <gtest/gtest.h>
+
+TEST(DummyTest, DummyTest)
+{
+    // TODO(@harshtya): Add tests for RDE
+    EXPECT_TRUE(true);
+}