Add support for building with meson

Follow the OpenBMC herd and support a modern, comprehensible build
framework.

To build with meson:
  meson build
  ninja -C build
OR
  bitbake dbus-sensors

Add -Dtests to match de-facto OpenBMC meson usage conventions.

Maintain existing per-sensor config flags; however, do not define
targets when opting out of a sensor class.

One noteable omission is support for subprojects or vendoring.

The OpenBMC CI scripts look for meson.build before looking for
CMakelists so approval of this patch would change the build system
during CI to meson.

meta-phosphor change to update the recipe to meson is also coming
shortly.

Change-Id: I27d8c8f5761850d760428ed813eecd41e8f47c33
Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
Signed-off-by: Ed Tanous <ed@tanous.net>
diff --git a/CMakeLists.txt b/CMakeLists.txt
deleted file mode 100644
index 86d703f..0000000
--- a/CMakeLists.txt
+++ /dev/null
@@ -1,311 +0,0 @@
-cmake_minimum_required (VERSION 2.8.10 FATAL_ERROR)
-set (BUILD_SHARED_LIBRARIES OFF)
-include (ExternalProject)
-set (CMAKE_CXX_STANDARD 17)
-set (CMAKE_CXX_STANDARD_REQUIRED ON)
-set (
-    CMAKE_CXX_FLAGS
-    "${CMAKE_CXX_FLAGS} -lstdc++fs \
-    -Werror \
-    -Wall \
-    -Wextra \
-    -Wnon-virtual-dtor \
-    -Wold-style-cast \
-    -Wcast-align \
-    -Wunused \
-    -Woverloaded-virtual \
-    -Wpedantic \
-    -Wmisleading-indentation \
-    -Wduplicated-cond \
-    -Wduplicated-branches \
-    -Wlogical-op \
-    -Wnull-dereference \
-    -Wuseless-cast \
-    -Wdouble-promotion \
-    -Wformat=2 \
-    -Wno-sign-compare \
-    -Wno-reorder \
-"
-)
-# todo: get rid of nos, add the below:
-#  -Wshadow \
-#  -Wconversion \
-
-set (CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH})
-
-option (YOCTO "Enable Building in Yocto" OFF)
-option (HUNTER_ENABLED "Enable hunter package pulling" OFF)
-
-option (DISABLE_ADC "Disable installing ADC sensor" OFF)
-option (DISABLE_CPU "Disable installing CPU sensor" OFF)
-option (DISABLE_EXIT_AIR "Disable installing Exit Air Temp sensor" OFF)
-option (DISABLE_FAN "Disable installing fan sensor" OFF)
-option (DISABLE_HWMON_TEMP "Disable installing hwmon temp sensor" OFF)
-option (DISABLE_INTRUSION "Disable installing intrusion sensor" OFF)
-option (DISABLE_IPMB "Disable installing IPMB sensor" OFF)
-option (DISABLE_MCUTEMP "Disable installing MCU temperature sensor" OFF)
-option (DISABLE_PSU "Disable installing PSU sensor" OFF)
-option (DISABLE_EXTERNAL "Disable installing external sensor" OFF)
-option (DISABLE_NVME "Disable installing NVME sensor" ON)
-
-include ("cmake/HunterGate.cmake")
-
-huntergate (URL "https://github.com/ruslo/hunter/archive/v0.18.64.tar.gz" SHA1
-            "baf9c8cc4f65306f0e442b5419967b4c4c04589a")
-
-project (sensors CXX)
-
-set (ADC_SRC_FILES src/Utils.cpp src/ADCSensor.cpp src/Thresholds.cpp)
-
-set (CPU_SRC_FILES src/Utils.cpp src/CPUSensor.cpp src/Thresholds.cpp)
-
-set (EXIT_AIR_SRC_FILES src/Utils.cpp src/Thresholds.cpp)
-
-set (FAN_SRC_FILES src/TachSensor.cpp src/PwmSensor.cpp src/Utils.cpp
-     src/Thresholds.cpp)
-
-set (HWMON_TEMP_SRC_FILES src/Utils.cpp src/HwmonTempSensor.cpp
-     src/Thresholds.cpp)
-
-set (INTRUSION_SRC_FILES src/Utils.cpp src/ChassisIntrusionSensor.cpp)
-
-set (IPMB_SRC_FILES src/Utils.cpp src/Thresholds.cpp)
-
-set (MCUTEMP_SRC_FILES src/Utils.cpp src/Thresholds.cpp)
-
-set (PSU_SRC_FILES src/Utils.cpp src/PSUSensor.cpp src/Thresholds.cpp
-     src/PwmSensor.cpp src/PSUEvent.cpp)
-
-set (EXTERNAL_SRC_FILES src/Utils.cpp src/ExternalSensorMain.cpp
-     src/ExternalSensor.cpp src/Thresholds.cpp)
-
-set (NVME_SRC_FILES src/Utils.cpp src/NVMeSensorMain.cpp
-     src/NVMeSensor.cpp src/Thresholds.cpp)
-
-set (EXTERNAL_PACKAGES Boost sdbusplus-project nlohmann-json)
-set (SENSOR_LINK_LIBS -lsystemd stdc++fs sdbusplus)
-
-if (NOT YOCTO)
-    set (DISABLE_NVME ON) # todo allow this to build out of tree
-    option (ENABLE_TEST "Enable Google Test" OFF)
-
-    externalproject_add (
-        Boost URL
-        https://dl.bintray.com/boostorg/release/1.66.0/source/boost_1_66_0.tar.gz
-        URL_MD5 d275cd85b00022313c171f602db59fc5 SOURCE_DIR
-        "${CMAKE_BINARY_DIR}/boost-src" BINARY_DIR
-        "${CMAKE_BINARY_DIR}/boost-build" CONFIGURE_COMMAND "" BUILD_COMMAND ""
-        INSTALL_COMMAND ""
-    )
-    include_directories (SYSTEM ${CMAKE_BINARY_DIR}/boost-src)
-    set (CMAKE_PREFIX_PATH ${CMAKE_BINARY_DIR}/boost-src ${CMAKE_PREFIX_PATH})
-
-    # requires apt install autoconf-archive and autoconf
-    externalproject_add (sdbusplus-project PREFIX
-                         ${CMAKE_BINARY_DIR}/sdbusplus-project GIT_REPOSITORY
-                         https://github.com/openbmc/sdbusplus.git SOURCE_DIR
-                         ${CMAKE_BINARY_DIR}/sdbusplus-src BINARY_DIR
-                         ${CMAKE_BINARY_DIR}/sdbusplus-build CONFIGURE_COMMAND
-                         "" BUILD_COMMAND cd ${CMAKE_BINARY_DIR}/sdbusplus-src
-                         && meson build -Ddefault_library=static && ninja -C
-                         build libsdbusplus.a INSTALL_COMMAND ""
-                         LOG_DOWNLOAD ON)
-    include_directories (SYSTEM ${CMAKE_BINARY_DIR}/sdbusplus-src)
-    link_directories (${CMAKE_BINARY_DIR}/sdbusplus-src/build)
-
-    externalproject_add (nlohmann-json PREFIX
-                         ${CMAKE_CURRENT_BINARY_DIR}/nlohmann-json
-                         GIT_REPOSITORY https://github.com/nlohmann/json.git
-                         SOURCE_DIR ${CMAKE_BINARY_DIR}/nlohmann-json-src
-                         BINARY_DIR ${CMAKE_BINARY_DIR}/nlohmann-json-build
-                         CONFIGURE_COMMAND "" BUILD_COMMAND "" INSTALL_COMMAND
-                         "" LOG_DOWNLOAD ON)
-    include_directories (SYSTEM ${CMAKE_BINARY_DIR}/nlohmann-json-src/include)
-
-    if (ENABLE_TEST)
-        option (HUNTER_ENABLED "Enable hunter package pulling" ON)
-        hunter_add_package (GTest)
-
-        find_package (GTest CONFIG REQUIRED)
-
-        enable_testing ()
-
-        add_executable (runTachTests tests/test_TachSensor.cpp ${FAN_SRC_FILES})
-        add_test (NAME test_fansensor COMMAND runTachTests)
-        target_link_libraries (runTachTests GTest::main GTest::gtest pthread
-                               ${DBUS_LIBRARIES} stdc++fs)
-        add_dependencies (runTachTests nlohmann-json)
-
-        add_executable (runHwmonTempTests tests/test_HwmonTempSensor.cpp
-                        ${HWMON_TEMP_SRC_FILES})
-        add_test (NAME test_hwmontempsensor COMMAND runHwmonTempTests)
-        target_link_libraries (runHwmonTempTests GTest::main GTest::gtest
-                               pthread ${DBUS_LIBRARIES} stdc++fs)
-        add_dependencies (runHwmonTempTests nlohmann-json)
-    endif ()
-
-endif ()
-
-add_definitions (-DBOOST_ERROR_CODE_HEADER_ONLY)
-add_definitions (-DBOOST_SYSTEM_NO_DEPRECATED)
-add_definitions (-DBOOST_ALL_NO_LIB)
-add_definitions (-DBOOST_NO_RTTI)
-add_definitions (-DBOOST_NO_TYPEID)
-add_definitions (-DBOOST_ASIO_DISABLE_THREADS)
-
-link_directories (${EXTERNAL_INSTALL_LOCATION}/lib)
-
-include_directories (${CMAKE_CURRENT_SOURCE_DIR}/include)
-
-add_executable (adcsensor src/ADCSensorMain.cpp ${ADC_SRC_FILES})
-add_dependencies (adcsensor sdbusplus-project)
-target_link_libraries (adcsensor ${SENSOR_LINK_LIBS})
-target_link_libraries (adcsensor gpiodcxx)
-
-add_executable (cpusensor src/CPUSensorMain.cpp ${CPU_SRC_FILES})
-add_dependencies (cpusensor sdbusplus-project)
-target_link_libraries (cpusensor ${SENSOR_LINK_LIBS})
-target_link_libraries (cpusensor gpiodcxx)
-
-add_executable (exitairtempsensor src/ExitAirTempSensor.cpp
-                ${EXIT_AIR_SRC_FILES})
-add_dependencies (exitairtempsensor sdbusplus-project)
-target_link_libraries (exitairtempsensor ${SENSOR_LINK_LIBS})
-
-add_executable (fansensor src/FanMain.cpp ${FAN_SRC_FILES})
-add_dependencies (fansensor sdbusplus-project)
-target_link_libraries (fansensor ${SENSOR_LINK_LIBS})
-target_link_libraries (fansensor gpiodcxx)
-
-add_executable (hwmontempsensor src/HwmonTempMain.cpp ${HWMON_TEMP_SRC_FILES})
-add_dependencies (hwmontempsensor sdbusplus-project)
-target_link_libraries (hwmontempsensor ${SENSOR_LINK_LIBS})
-
-add_executable (intrusionsensor src/IntrusionSensorMain.cpp
-                ${INTRUSION_SRC_FILES})
-add_dependencies (intrusionsensor sdbusplus-project)
-target_link_libraries (intrusionsensor ${SENSOR_LINK_LIBS})
-target_link_libraries (intrusionsensor i2c)
-target_link_libraries (intrusionsensor gpiodcxx)
-
-add_executable (ipmbsensor src/IpmbSensor.cpp ${IPMB_SRC_FILES})
-add_dependencies (ipmbsensor sdbusplus-project)
-target_link_libraries (ipmbsensor ${SENSOR_LINK_LIBS})
-
-add_executable (mcutempsensor src/MCUTempSensor.cpp ${MCUTEMP_SRC_FILES})
-add_dependencies (mcutempsensor sdbusplus-project)
-target_link_libraries (mcutempsensor ${SENSOR_LINK_LIBS})
-target_link_libraries (mcutempsensor i2c)
-
-add_executable (psusensor src/PSUSensorMain.cpp ${PSU_SRC_FILES})
-add_dependencies (psusensor sdbusplus-project)
-target_link_libraries (psusensor ${SENSOR_LINK_LIBS})
-
-if (NOT DISABLE_EXTERNAL)
-    add_executable (externalsensor ${EXTERNAL_SRC_FILES})
-    add_dependencies (externalsensor sdbusplus-project)
-    target_link_libraries (externalsensor ${SENSOR_LINK_LIBS})
-endif()
-
-if (NOT DISABLE_NVME)
-    add_executable (nvmesensor ${NVME_SRC_FILES})
-    add_dependencies (nvmesensor sdbusplus-project)
-    target_link_libraries (nvmesensor liblibmctp.a i2c ${SENSOR_LINK_LIBS})
-endif()
-
-set (SERVICE_FILE_SRC_DIR ${PROJECT_SOURCE_DIR}/service_files)
-set (SERVICE_FILE_INSTALL_DIR /lib/systemd/system/)
-
-if (NOT DISABLE_ADC)
-    add_dependencies (adcsensor ${EXTERNAL_PACKAGES})
-    install (TARGETS adcsensor DESTINATION bin)
-    install (FILES
-                 ${SERVICE_FILE_SRC_DIR}/xyz.openbmc_project.adcsensor.service
-                 DESTINATION ${SERVICE_FILE_INSTALL_DIR})
-endif ()
-
-if (NOT DISABLE_CPU)
-    add_dependencies (cpusensor ${EXTERNAL_PACKAGES})
-    install (TARGETS cpusensor DESTINATION bin)
-    install (FILES
-                 ${SERVICE_FILE_SRC_DIR}/xyz.openbmc_project.cpusensor.service
-                 DESTINATION ${SERVICE_FILE_INSTALL_DIR})
-endif ()
-
-if (NOT DISABLE_EXIT_AIR)
-    add_dependencies (exitairtempsensor ${EXTERNAL_PACKAGES})
-    install (TARGETS exitairtempsensor DESTINATION bin)
-    install (
-        FILES ${SERVICE_FILE_SRC_DIR}/xyz.openbmc_project.exitairsensor.service
-              DESTINATION ${SERVICE_FILE_INSTALL_DIR}
-    )
-endif ()
-
-if (NOT DISABLE_FAN)
-    add_dependencies (fansensor ${EXTERNAL_PACKAGES})
-    install (TARGETS fansensor DESTINATION bin)
-    install (FILES
-                 ${SERVICE_FILE_SRC_DIR}/xyz.openbmc_project.fansensor.service
-                 DESTINATION ${SERVICE_FILE_INSTALL_DIR})
-endif ()
-
-if (NOT DISABLE_HWMON_TEMP)
-    add_dependencies (hwmontempsensor ${EXTERNAL_PACKAGES})
-    install (TARGETS hwmontempsensor DESTINATION bin)
-    install (
-        FILES
-            ${SERVICE_FILE_SRC_DIR}/xyz.openbmc_project.hwmontempsensor.service
-            DESTINATION ${SERVICE_FILE_INSTALL_DIR}
-    )
-endif ()
-
-if (NOT DISABLE_INTRUSION)
-    add_dependencies (intrusionsensor ${EXTERNAL_PACKAGES})
-    install (TARGETS intrusionsensor DESTINATION bin)
-    install (
-        FILES
-            ${SERVICE_FILE_SRC_DIR}/xyz.openbmc_project.intrusionsensor.service
-            DESTINATION ${SERVICE_FILE_INSTALL_DIR}
-    )
-endif ()
-
-if (NOT DISABLE_IPMB)
-    add_dependencies (ipmbsensor ${EXTERNAL_PACKAGES})
-    install (TARGETS ipmbsensor DESTINATION bin)
-    install (FILES
-                 ${SERVICE_FILE_SRC_DIR}/xyz.openbmc_project.ipmbsensor.service
-                 DESTINATION ${SERVICE_FILE_INSTALL_DIR})
-endif ()
-
-if (NOT DISABLE_MCUTEMP)
-    add_dependencies (mcutempsensor ${EXTERNAL_PACKAGES})
-    install (TARGETS mcutempsensor DESTINATION bin)
-    install (
-        FILES ${SERVICE_FILE_SRC_DIR}/xyz.openbmc_project.mcutempsensor.service
-              DESTINATION ${SERVICE_FILE_INSTALL_DIR}
-    )
-endif ()
-
-if (NOT DISABLE_PSU)
-    add_dependencies (psusensor ${EXTERNAL_PACKAGES})
-    install (TARGETS psusensor DESTINATION bin)
-    install (FILES
-                 ${SERVICE_FILE_SRC_DIR}/xyz.openbmc_project.psusensor.service
-                 DESTINATION ${SERVICE_FILE_INSTALL_DIR})
-endif ()
-
-if (NOT DISABLE_EXTERNAL)
-    add_dependencies (externalsensor ${EXTERNAL_PACKAGES})
-    install (TARGETS externalsensor DESTINATION bin)
-    install (FILES
-                 ${SERVICE_FILE_SRC_DIR}/xyz.openbmc_project.externalsensor.service
-                 DESTINATION ${SERVICE_FILE_INSTALL_DIR})
-endif ()
-
-if (NOT DISABLE_NVME)
-    add_dependencies (nvmesensor ${EXTERNAL_PACKAGES})
-    install (TARGETS nvmesensor DESTINATION bin)
-    install (FILES
-                 ${SERVICE_FILE_SRC_DIR}/xyz.openbmc_project.nvmesensor.service
-                 DESTINATION ${SERVICE_FILE_INSTALL_DIR})
-endif ()
diff --git a/cmake-format.json b/cmake-format.json
deleted file mode 100644
index 4a68fb7..0000000
--- a/cmake-format.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "enum_char": ".",
-  "line_ending": "unix",
-  "bullet_char": "*",
-  "max_subargs_per_line": 99,
-  "command_case": "lower",
-  "tab_size": 4,
-  "line_width": 80,
-  "separate_fn_name_with_space": true,
-  "dangle_parens": true,
-  "separate_ctrl_name_with_space": true
-}
-
diff --git a/cmake/Finddbus.cmake b/cmake/Finddbus.cmake
deleted file mode 100644
index 2d8eea2..0000000
--- a/cmake/Finddbus.cmake
+++ /dev/null
@@ -1,61 +0,0 @@
-# - Try to find DBus
-# Once done, this will define
-#
-#  DBUS_FOUND - system has DBus
-#  DBUS_INCLUDE_DIRS - the DBus include directories
-#  DBUS_LIBRARIES - link these to use DBus
-#
-# Copyright (C) 2012 Raphael Kubo da Costa <rakuco@webkit.org>
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1.  Redistributions of source code must retain the above copyright
-#     notice, this list of conditions and the following disclaimer.
-# 2.  Redistributions in binary form must reproduce the above copyright
-#     notice, this list of conditions and the following disclaimer in the
-#     documentation and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND ITS CONTRIBUTORS ``AS
-# IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ITS
-# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-FIND_PACKAGE(PkgConfig)
-PKG_CHECK_MODULES(PC_DBUS QUIET dbus-1)
-
-FIND_LIBRARY(DBUS_LIBRARIES
-    NAMES dbus-1
-    HINTS ${PC_DBUS_LIBDIR}
-          ${PC_DBUS_LIBRARY_DIRS}
-)
-
-message("DBUS_LIBRARIES = ${DBUS_LIBRARIES}")
-
-FIND_PATH(DBUS_INCLUDE_DIR
-    NAMES dbus/dbus.h
-    HINTS ${PC_DBUS_INCLUDEDIR}
-          ${PC_DBUS_INCLUDE_DIRS}
-)
-
-GET_FILENAME_COMPONENT(_DBUS_LIBRARY_DIR ${DBUS_LIBRARIES} PATH)
-FIND_PATH(DBUS_ARCH_INCLUDE_DIR
-    NAMES dbus/dbus-arch-deps.h
-    HINTS ${PC_DBUS_INCLUDEDIR}
-          ${PC_DBUS_INCLUDE_DIRS}
-          ${_DBUS_LIBRARY_DIR}
-          ${DBUS_INCLUDE_DIR}
-    PATH_SUFFIXES include
-)
-
-SET(DBUS_INCLUDE_DIRS ${DBUS_INCLUDE_DIR} ${DBUS_ARCH_INCLUDE_DIR})
-
-INCLUDE(FindPackageHandleStandardArgs)
-FIND_PACKAGE_HANDLE_STANDARD_ARGS(DBUS REQUIRED_VARS DBUS_INCLUDE_DIRS DBUS_LIBRARIES)
diff --git a/cmake/HunterGate.cmake b/cmake/HunterGate.cmake
deleted file mode 100644
index 97f69cc..0000000
--- a/cmake/HunterGate.cmake
+++ /dev/null
@@ -1,514 +0,0 @@
-# Copyright (c) 2013-2015, Ruslan Baratov
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice, this
-#   list of conditions and the following disclaimer.
-#
-# * Redistributions in binary form must reproduce the above copyright notice,
-#   this list of conditions and the following disclaimer in the documentation
-#   and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-# This is a gate file to Hunter package manager.
-# Include this file using `include` command and add package you need, example:
-#
-#     cmake_minimum_required(VERSION 3.0)
-#
-#     include("cmake/HunterGate.cmake")
-#     HunterGate(
-#         URL "https://github.com/path/to/hunter/archive.tar.gz"
-#         SHA1 "798501e983f14b28b10cda16afa4de69eee1da1d"
-#     )
-#
-#     project(MyProject)
-#
-#     hunter_add_package(Foo)
-#     hunter_add_package(Boo COMPONENTS Bar Baz)
-#
-# Projects:
-#     * https://github.com/hunter-packages/gate/
-#     * https://github.com/ruslo/hunter
-
-option(HUNTER_ENABLED "Enable Hunter package manager support" ON)
-if(HUNTER_ENABLED)
-  if(CMAKE_VERSION VERSION_LESS "3.0")
-    message(FATAL_ERROR "At least CMake version 3.0 required for hunter dependency management."
-      " Update CMake or set HUNTER_ENABLED to OFF.")
-  endif()
-endif()
-
-include(CMakeParseArguments) # cmake_parse_arguments
-
-option(HUNTER_STATUS_PRINT "Print working status" ON)
-option(HUNTER_STATUS_DEBUG "Print a lot info" OFF)
-
-set(HUNTER_WIKI "https://github.com/ruslo/hunter/wiki")
-
-function(hunter_gate_status_print)
-  foreach(print_message ${ARGV})
-    if(HUNTER_STATUS_PRINT OR HUNTER_STATUS_DEBUG)
-      message(STATUS "[hunter] ${print_message}")
-    endif()
-  endforeach()
-endfunction()
-
-function(hunter_gate_status_debug)
-  foreach(print_message ${ARGV})
-    if(HUNTER_STATUS_DEBUG)
-      string(TIMESTAMP timestamp)
-      message(STATUS "[hunter *** DEBUG *** ${timestamp}] ${print_message}")
-    endif()
-  endforeach()
-endfunction()
-
-function(hunter_gate_wiki wiki_page)
-  message("------------------------------ WIKI -------------------------------")
-  message("    ${HUNTER_WIKI}/${wiki_page}")
-  message("-------------------------------------------------------------------")
-  message("")
-  message(FATAL_ERROR "")
-endfunction()
-
-function(hunter_gate_internal_error)
-  message("")
-  foreach(print_message ${ARGV})
-    message("[hunter ** INTERNAL **] ${print_message}")
-  endforeach()
-  message("[hunter ** INTERNAL **] [Directory:${CMAKE_CURRENT_LIST_DIR}]")
-  message("")
-  hunter_gate_wiki("error.internal")
-endfunction()
-
-function(hunter_gate_fatal_error)
-  cmake_parse_arguments(hunter "" "WIKI" "" "${ARGV}")
-  string(COMPARE EQUAL "${hunter_WIKI}" "" have_no_wiki)
-  if(have_no_wiki)
-    hunter_gate_internal_error("Expected wiki")
-  endif()
-  message("")
-  foreach(x ${hunter_UNPARSED_ARGUMENTS})
-    message("[hunter ** FATAL ERROR **] ${x}")
-  endforeach()
-  message("[hunter ** FATAL ERROR **] [Directory:${CMAKE_CURRENT_LIST_DIR}]")
-  message("")
-  hunter_gate_wiki("${hunter_WIKI}")
-endfunction()
-
-function(hunter_gate_user_error)
-  hunter_gate_fatal_error(${ARGV} WIKI "error.incorrect.input.data")
-endfunction()
-
-function(hunter_gate_self root version sha1 result)
-  string(COMPARE EQUAL "${root}" "" is_bad)
-  if(is_bad)
-    hunter_gate_internal_error("root is empty")
-  endif()
-
-  string(COMPARE EQUAL "${version}" "" is_bad)
-  if(is_bad)
-    hunter_gate_internal_error("version is empty")
-  endif()
-
-  string(COMPARE EQUAL "${sha1}" "" is_bad)
-  if(is_bad)
-    hunter_gate_internal_error("sha1 is empty")
-  endif()
-
-  string(SUBSTRING "${sha1}" 0 7 archive_id)
-
-  if(EXISTS "${root}/cmake/Hunter")
-    set(hunter_self "${root}")
-  else()
-    set(
-        hunter_self
-        "${root}/_Base/Download/Hunter/${version}/${archive_id}/Unpacked"
-    )
-  endif()
-
-  set("${result}" "${hunter_self}" PARENT_SCOPE)
-endfunction()
-
-# Set HUNTER_GATE_ROOT cmake variable to suitable value.
-function(hunter_gate_detect_root)
-  # Check CMake variable
-  string(COMPARE NOTEQUAL "${HUNTER_ROOT}" "" not_empty)
-  if(not_empty)
-    set(HUNTER_GATE_ROOT "${HUNTER_ROOT}" PARENT_SCOPE)
-    hunter_gate_status_debug("HUNTER_ROOT detected by cmake variable")
-    return()
-  endif()
-
-  # Check environment variable
-  string(COMPARE NOTEQUAL "$ENV{HUNTER_ROOT}" "" not_empty)
-  if(not_empty)
-    set(HUNTER_GATE_ROOT "$ENV{HUNTER_ROOT}" PARENT_SCOPE)
-    hunter_gate_status_debug("HUNTER_ROOT detected by environment variable")
-    return()
-  endif()
-
-  # Check HOME environment variable
-  string(COMPARE NOTEQUAL "$ENV{HOME}" "" result)
-  if(result)
-    set(HUNTER_GATE_ROOT "$ENV{HOME}/.hunter" PARENT_SCOPE)
-    hunter_gate_status_debug("HUNTER_ROOT set using HOME environment variable")
-    return()
-  endif()
-
-  # Check SYSTEMDRIVE and USERPROFILE environment variable (windows only)
-  if(WIN32)
-    string(COMPARE NOTEQUAL "$ENV{SYSTEMDRIVE}" "" result)
-    if(result)
-      set(HUNTER_GATE_ROOT "$ENV{SYSTEMDRIVE}/.hunter" PARENT_SCOPE)
-      hunter_gate_status_debug(
-          "HUNTER_ROOT set using SYSTEMDRIVE environment variable"
-      )
-      return()
-    endif()
-
-    string(COMPARE NOTEQUAL "$ENV{USERPROFILE}" "" result)
-    if(result)
-      set(HUNTER_GATE_ROOT "$ENV{USERPROFILE}/.hunter" PARENT_SCOPE)
-      hunter_gate_status_debug(
-          "HUNTER_ROOT set using USERPROFILE environment variable"
-      )
-      return()
-    endif()
-  endif()
-
-  hunter_gate_fatal_error(
-      "Can't detect HUNTER_ROOT"
-      WIKI "error.detect.hunter.root"
-  )
-endfunction()
-
-macro(hunter_gate_lock dir)
-  if(NOT HUNTER_SKIP_LOCK)
-    if("${CMAKE_VERSION}" VERSION_LESS "3.2")
-      hunter_gate_fatal_error(
-          "Can't lock, upgrade to CMake 3.2 or use HUNTER_SKIP_LOCK"
-          WIKI "error.can.not.lock"
-      )
-    endif()
-    hunter_gate_status_debug("Locking directory: ${dir}")
-    file(LOCK "${dir}" DIRECTORY GUARD FUNCTION)
-    hunter_gate_status_debug("Lock done")
-  endif()
-endmacro()
-
-function(hunter_gate_download dir)
-  string(
-      COMPARE
-      NOTEQUAL
-      "$ENV{HUNTER_DISABLE_AUTOINSTALL}"
-      ""
-      disable_autoinstall
-  )
-  if(disable_autoinstall AND NOT HUNTER_RUN_INSTALL)
-    hunter_gate_fatal_error(
-        "Hunter not found in '${dir}'"
-        "Set HUNTER_RUN_INSTALL=ON to auto-install it from '${HUNTER_GATE_URL}'"
-        "Settings:"
-        "  HUNTER_ROOT: ${HUNTER_GATE_ROOT}"
-        "  HUNTER_SHA1: ${HUNTER_GATE_SHA1}"
-        WIKI "error.run.install"
-    )
-  endif()
-  string(COMPARE EQUAL "${dir}" "" is_bad)
-  if(is_bad)
-    hunter_gate_internal_error("Empty 'dir' argument")
-  endif()
-
-  string(COMPARE EQUAL "${HUNTER_GATE_SHA1}" "" is_bad)
-  if(is_bad)
-    hunter_gate_internal_error("HUNTER_GATE_SHA1 empty")
-  endif()
-
-  string(COMPARE EQUAL "${HUNTER_GATE_URL}" "" is_bad)
-  if(is_bad)
-    hunter_gate_internal_error("HUNTER_GATE_URL empty")
-  endif()
-
-  set(done_location "${dir}/DONE")
-  set(sha1_location "${dir}/SHA1")
-
-  set(build_dir "${dir}/Build")
-  set(cmakelists "${dir}/CMakeLists.txt")
-
-  hunter_gate_lock("${dir}")
-  if(EXISTS "${done_location}")
-    # while waiting for lock other instance can do all the job
-    hunter_gate_status_debug("File '${done_location}' found, skip install")
-    return()
-  endif()
-
-  file(REMOVE_RECURSE "${build_dir}")
-  file(REMOVE_RECURSE "${cmakelists}")
-
-  file(MAKE_DIRECTORY "${build_dir}") # check directory permissions
-
-  # Disabling languages speeds up a little bit, reduces noise in the output
-  # and avoids path too long windows error
-  file(
-      WRITE
-      "${cmakelists}"
-      "cmake_minimum_required(VERSION 3.0)\n"
-      "project(HunterDownload LANGUAGES NONE)\n"
-      "include(ExternalProject)\n"
-      "ExternalProject_Add(\n"
-      "    Hunter\n"
-      "    URL\n"
-      "    \"${HUNTER_GATE_URL}\"\n"
-      "    URL_HASH\n"
-      "    SHA1=${HUNTER_GATE_SHA1}\n"
-      "    DOWNLOAD_DIR\n"
-      "    \"${dir}\"\n"
-      "    SOURCE_DIR\n"
-      "    \"${dir}/Unpacked\"\n"
-      "    CONFIGURE_COMMAND\n"
-      "    \"\"\n"
-      "    BUILD_COMMAND\n"
-      "    \"\"\n"
-      "    INSTALL_COMMAND\n"
-      "    \"\"\n"
-      ")\n"
-  )
-
-  if(HUNTER_STATUS_DEBUG)
-    set(logging_params "")
-  else()
-    set(logging_params OUTPUT_QUIET)
-  endif()
-
-  hunter_gate_status_debug("Run generate")
-
-  # Need to add toolchain file too.
-  # Otherwise on Visual Studio + MDD this will fail with error:
-  # "Could not find an appropriate version of the Windows 10 SDK installed on this machine"
-  if(EXISTS "${CMAKE_TOOLCHAIN_FILE}")
-    set(toolchain_arg "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}")
-  else()
-    # 'toolchain_arg' can't be empty
-    set(toolchain_arg "-DCMAKE_TOOLCHAIN_FILE=")
-  endif()
-
-  execute_process(
-      COMMAND "${CMAKE_COMMAND}" "-H${dir}" "-B${build_dir}" "-G${CMAKE_GENERATOR}" "${toolchain_arg}"
-      WORKING_DIRECTORY "${dir}"
-      RESULT_VARIABLE download_result
-      ${logging_params}
-  )
-
-  if(NOT download_result EQUAL 0)
-    hunter_gate_internal_error("Configure project failed")
-  endif()
-
-  hunter_gate_status_print(
-      "Initializing Hunter workspace (${HUNTER_GATE_SHA1})"
-      "  ${HUNTER_GATE_URL}"
-      "  -> ${dir}"
-  )
-  execute_process(
-      COMMAND "${CMAKE_COMMAND}" --build "${build_dir}"
-      WORKING_DIRECTORY "${dir}"
-      RESULT_VARIABLE download_result
-      ${logging_params}
-  )
-
-  if(NOT download_result EQUAL 0)
-    hunter_gate_internal_error("Build project failed")
-  endif()
-
-  file(REMOVE_RECURSE "${build_dir}")
-  file(REMOVE_RECURSE "${cmakelists}")
-
-  file(WRITE "${sha1_location}" "${HUNTER_GATE_SHA1}")
-  file(WRITE "${done_location}" "DONE")
-
-  hunter_gate_status_debug("Finished")
-endfunction()
-
-# Must be a macro so master file 'cmake/Hunter' can
-# apply all variables easily just by 'include' command
-# (otherwise PARENT_SCOPE magic needed)
-macro(HunterGate)
-  if(HUNTER_GATE_DONE)
-    # variable HUNTER_GATE_DONE set explicitly for external project
-    # (see `hunter_download`)
-    set_property(GLOBAL PROPERTY HUNTER_GATE_DONE YES)
-  endif()
-
-  # First HunterGate command will init Hunter, others will be ignored
-  get_property(_hunter_gate_done GLOBAL PROPERTY HUNTER_GATE_DONE SET)
-
-  if(NOT HUNTER_ENABLED)
-    # Empty function to avoid error "unknown function"
-    function(hunter_add_package)
-    endfunction()
-  elseif(_hunter_gate_done)
-    hunter_gate_status_debug("Secondary HunterGate (use old settings)")
-    hunter_gate_self(
-        "${HUNTER_CACHED_ROOT}"
-        "${HUNTER_VERSION}"
-        "${HUNTER_SHA1}"
-        _hunter_self
-    )
-    include("${_hunter_self}/cmake/Hunter")
-  else()
-    set(HUNTER_GATE_LOCATION "${CMAKE_CURRENT_LIST_DIR}")
-
-    string(COMPARE NOTEQUAL "${PROJECT_NAME}" "" _have_project_name)
-    if(_have_project_name)
-      hunter_gate_fatal_error(
-          "Please set HunterGate *before* 'project' command. "
-          "Detected project: ${PROJECT_NAME}"
-          WIKI "error.huntergate.before.project"
-      )
-    endif()
-
-    cmake_parse_arguments(
-        HUNTER_GATE "LOCAL" "URL;SHA1;GLOBAL;FILEPATH" "" ${ARGV}
-    )
-
-    string(COMPARE EQUAL "${HUNTER_GATE_SHA1}" "" _empty_sha1)
-    string(COMPARE EQUAL "${HUNTER_GATE_URL}" "" _empty_url)
-    string(
-        COMPARE
-        NOTEQUAL
-        "${HUNTER_GATE_UNPARSED_ARGUMENTS}"
-        ""
-        _have_unparsed
-    )
-    string(COMPARE NOTEQUAL "${HUNTER_GATE_GLOBAL}" "" _have_global)
-    string(COMPARE NOTEQUAL "${HUNTER_GATE_FILEPATH}" "" _have_filepath)
-
-    if(_have_unparsed)
-      hunter_gate_user_error(
-          "HunterGate unparsed arguments: ${HUNTER_GATE_UNPARSED_ARGUMENTS}"
-      )
-    endif()
-    if(_empty_sha1)
-      hunter_gate_user_error("SHA1 suboption of HunterGate is mandatory")
-    endif()
-    if(_empty_url)
-      hunter_gate_user_error("URL suboption of HunterGate is mandatory")
-    endif()
-    if(_have_global)
-      if(HUNTER_GATE_LOCAL)
-        hunter_gate_user_error("Unexpected LOCAL (already has GLOBAL)")
-      endif()
-      if(_have_filepath)
-        hunter_gate_user_error("Unexpected FILEPATH (already has GLOBAL)")
-      endif()
-    endif()
-    if(HUNTER_GATE_LOCAL)
-      if(_have_global)
-        hunter_gate_user_error("Unexpected GLOBAL (already has LOCAL)")
-      endif()
-      if(_have_filepath)
-        hunter_gate_user_error("Unexpected FILEPATH (already has LOCAL)")
-      endif()
-    endif()
-    if(_have_filepath)
-      if(_have_global)
-        hunter_gate_user_error("Unexpected GLOBAL (already has FILEPATH)")
-      endif()
-      if(HUNTER_GATE_LOCAL)
-        hunter_gate_user_error("Unexpected LOCAL (already has FILEPATH)")
-      endif()
-    endif()
-
-    hunter_gate_detect_root() # set HUNTER_GATE_ROOT
-
-    # Beautify path, fix probable problems with windows path slashes
-    get_filename_component(
-        HUNTER_GATE_ROOT "${HUNTER_GATE_ROOT}" ABSOLUTE
-    )
-    hunter_gate_status_debug("HUNTER_ROOT: ${HUNTER_GATE_ROOT}")
-    if(NOT HUNTER_ALLOW_SPACES_IN_PATH)
-      string(FIND "${HUNTER_GATE_ROOT}" " " _contain_spaces)
-      if(NOT _contain_spaces EQUAL -1)
-        hunter_gate_fatal_error(
-            "HUNTER_ROOT (${HUNTER_GATE_ROOT}) contains spaces."
-            "Set HUNTER_ALLOW_SPACES_IN_PATH=ON to skip this error"
-            "(Use at your own risk!)"
-            WIKI "error.spaces.in.hunter.root"
-        )
-      endif()
-    endif()
-
-    string(
-        REGEX
-        MATCH
-        "[0-9]+\\.[0-9]+\\.[0-9]+[-_a-z0-9]*"
-        HUNTER_GATE_VERSION
-        "${HUNTER_GATE_URL}"
-    )
-    string(COMPARE EQUAL "${HUNTER_GATE_VERSION}" "" _is_empty)
-    if(_is_empty)
-      set(HUNTER_GATE_VERSION "unknown")
-    endif()
-
-    hunter_gate_self(
-        "${HUNTER_GATE_ROOT}"
-        "${HUNTER_GATE_VERSION}"
-        "${HUNTER_GATE_SHA1}"
-        _hunter_self
-    )
-
-    set(_master_location "${_hunter_self}/cmake/Hunter")
-    if(EXISTS "${HUNTER_GATE_ROOT}/cmake/Hunter")
-      # Hunter downloaded manually (e.g. by 'git clone')
-      set(_unused "xxxxxxxxxx")
-      set(HUNTER_GATE_SHA1 "${_unused}")
-      set(HUNTER_GATE_VERSION "${_unused}")
-    else()
-      get_filename_component(_archive_id_location "${_hunter_self}/.." ABSOLUTE)
-      set(_done_location "${_archive_id_location}/DONE")
-      set(_sha1_location "${_archive_id_location}/SHA1")
-
-      # Check Hunter already downloaded by HunterGate
-      if(NOT EXISTS "${_done_location}")
-        hunter_gate_download("${_archive_id_location}")
-      endif()
-
-      if(NOT EXISTS "${_done_location}")
-        hunter_gate_internal_error("hunter_gate_download failed")
-      endif()
-
-      if(NOT EXISTS "${_sha1_location}")
-        hunter_gate_internal_error("${_sha1_location} not found")
-      endif()
-      file(READ "${_sha1_location}" _sha1_value)
-      string(COMPARE EQUAL "${_sha1_value}" "${HUNTER_GATE_SHA1}" _is_equal)
-      if(NOT _is_equal)
-        hunter_gate_internal_error(
-            "Short SHA1 collision:"
-            "  ${_sha1_value} (from ${_sha1_location})"
-            "  ${HUNTER_GATE_SHA1} (HunterGate)"
-        )
-      endif()
-      if(NOT EXISTS "${_master_location}")
-        hunter_gate_user_error(
-            "Master file not found:"
-            "  ${_master_location}"
-            "try to update Hunter/HunterGate"
-        )
-      endif()
-    endif()
-    include("${_master_location}")
-    set_property(GLOBAL PROPERTY HUNTER_GATE_DONE YES)
-  endif()
-endmacro()
\ No newline at end of file
diff --git a/include/PSUEvent.hpp b/include/PSUEvent.hpp
index 8dfa3ea..aebb58d 100644
--- a/include/PSUEvent.hpp
+++ b/include/PSUEvent.hpp
@@ -52,7 +52,7 @@
     size_t errCount;
     std::string path;
     std::string eventName;
-    std::string groupEventName;
+
     boost::asio::deadline_timer waitTimer;
     std::shared_ptr<boost::asio::streambuf> readBuf;
     void handleResponse(const boost::system::error_code& err);
@@ -63,6 +63,7 @@
     static constexpr unsigned int eventPollMs = 1000;
     static constexpr size_t warnAfterErrorCount = 10;
     std::string psuName;
+    std::string groupEventName;
     std::string fanName;
     std::string assertMessage;
     std::string deassertMessage;
diff --git a/include/PSUSensor.hpp b/include/PSUSensor.hpp
index 102fe63..7b4bfdb 100644
--- a/include/PSUSensor.hpp
+++ b/include/PSUSensor.hpp
@@ -30,8 +30,8 @@
     boost::asio::deadline_timer waitTimer;
     std::shared_ptr<boost::asio::streambuf> readBuf;
     std::string path;
-    std::string pathRatedMin;
     std::string pathRatedMax;
+    std::string pathRatedMin;
     size_t errCount;
     unsigned int sensorFactor;
     uint8_t minMaxReadCounter;
diff --git a/meson.build b/meson.build
new file mode 100644
index 0000000..a1b79be
--- /dev/null
+++ b/meson.build
@@ -0,0 +1,66 @@
+project(
+    'dbus-sensors',
+    'cpp',
+    default_options: [
+        'warning_level=3',
+        'werror=true',
+        'cpp_std=c++17'
+    ],
+    license: 'Apache-2.0',
+    version: '0.1',
+)
+
+add_project_arguments(
+    '-DBOOST_SYSTEM_NO_DEPRECATED',
+    '-DBOOST_ERROR_CODE_HEADER_ONLY',
+    '-DBOOST_NO_RTTI',
+    '-DBOOST_NO_TYPEID',
+    '-DBOOST_ALL_NO_LIB',
+    '-DBOOST_ASIO_DISABLE_THREADS',
+    '-DBOOST_ALLOW_DEPRECATED_HEADERS',
+    language: 'cpp',
+)
+
+build_tests = get_option('tests')
+cppfs = meson.get_compiler('cpp').find_library('stdc++fs')
+gpiodcxx = dependency('libgpiodcxx')
+i2c = meson.get_compiler('cpp').find_library('i2c')
+sdbusplus = dependency('sdbusplus')
+mctp = meson.get_compiler('cpp').find_library('mctp', required : false)
+systemd = dependency('systemd')
+systemd_system_unit_dir = systemd.get_pkgconfig_variable(
+    'systemdsystemunitdir',
+    define_variable: ['prefix', get_option('prefix')])
+threads = dependency('threads')
+
+thresholds_a = static_library(
+    'thresholds_a',
+    'src/Thresholds.cpp',
+    implicit_include_directories: false,
+    include_directories: 'include',
+)
+
+utils_a = static_library(
+    'utils_a',
+    'src/Utils.cpp',
+    dependencies: [
+        cppfs,
+    ],
+    implicit_include_directories: false,
+    include_directories: 'include',
+)
+
+pwmsensor_a = static_library(
+    'pwmsensor_a',
+    'src/PwmSensor.cpp',
+    implicit_include_directories: false,
+    include_directories: 'include',
+)
+
+
+subdir('service_files')
+subdir('src')
+
+if not build_tests.disabled()
+    subdir('tests')
+endif
diff --git a/meson_options.txt b/meson_options.txt
new file mode 100644
index 0000000..5fa3fd3
--- /dev/null
+++ b/meson_options.txt
@@ -0,0 +1,13 @@
+option('adc', type: 'feature', value: 'enabled', description: 'Enable ADC sensor.',)
+option('cpu', type: 'feature', value: 'enabled', description: 'Enable CPU sensor.',)
+option('exit-air', type: 'feature', value: 'enabled', description: 'Enable exit air sensor.',)
+option('fan', type: 'feature', value: 'enabled', description: 'Enable fan sensor.',)
+option('hwmon-temp', type: 'feature', value: 'enabled', description: 'Enable HWMON temperature sensor.',)
+option('intrusion', type: 'feature', value: 'enabled', description: 'Enable intrusion sensor.',)
+option('ipmb', type: 'feature', value: 'enabled', description: 'Enable IPMB sensor.',)
+option('mcu', type: 'feature', value: 'enabled', description: 'Enable CPU sensor.',)
+option('mcu-temp', type: 'feature', value: 'enabled', description: 'Enable MCU sensor.',)
+option('nvme', type: 'feature', value: 'disabled', description: 'Enable NVMe sensor.',)
+option('psu-temp', type: 'feature', value: 'enabled', description: 'Enable PSU sensor.',)
+option('external', type: 'feature', value: 'enabled', description: 'Enable External sensor.',)
+option('tests', type: 'feature', description: 'Build tests.',)
diff --git a/service_files/meson.build b/service_files/meson.build
new file mode 100644
index 0000000..9158ef2
--- /dev/null
+++ b/service_files/meson.build
@@ -0,0 +1,26 @@
+unit_files = [
+    ['adc', 'xyz.openbmc_project.adcsensor.service'],
+    ['cpu', 'xyz.openbmc_project.cpusensor.service'],
+    ['exit-air', 'xyz.openbmc_project.exitairsensor.service'],
+    ['fan', 'xyz.openbmc_project.fansensor.service'],
+    ['hwmon-temp', 'xyz.openbmc_project.hwmontempsensor.service'],
+    ['ipmb', 'xyz.openbmc_project.ipmbsensor.service'],
+    ['intrusion', 'xyz.openbmc_project.intrusionsensor.service'],
+    ['mcu-temp', 'xyz.openbmc_project.mcutempsensor.service'],
+    ['nvme', 'xyz.openbmc_project.nvmesensor.service'],
+    ['psu-temp', 'xyz.openbmc_project.psusensor.service'],
+]
+
+foreach tuple : unit_files
+    if get_option(tuple[0]).enabled()
+        configure_file(
+            copy: true,
+            input: tuple[1],
+            install: true,
+            install_dir: systemd_system_unit_dir,
+            output: tuple[1],
+        )
+    endif
+
+
+endforeach
diff --git a/src/PSUSensorMain.cpp b/src/PSUSensorMain.cpp
index d55d3a0..3520fbe 100644
--- a/src/PSUSensorMain.cpp
+++ b/src/PSUSensorMain.cpp
@@ -470,7 +470,7 @@
             std::string labelPath;
 
             /* find and differentiate _max and _input to replace "label" */
-            int pos = sensorPathStr.find("_");
+            size_t pos = sensorPathStr.find("_");
             if (pos != std::string::npos)
             {
 
diff --git a/src/meson.build b/src/meson.build
new file mode 100644
index 0000000..32b6e85
--- /dev/null
+++ b/src/meson.build
@@ -0,0 +1,211 @@
+peci_incdirs = []
+if not meson.get_compiler('cpp').has_header('linux/peci-ioctl.h')
+    peci_incdirs = ['../include']
+endif
+
+if get_option('adc').enabled()
+    executable(
+        'adcsensor',
+        'ADCSensor.cpp',
+        'ADCSensorMain.cpp',
+        dependencies: [
+            gpiodcxx,
+            sdbusplus,
+        ],
+        implicit_include_directories: false,
+        include_directories: '../include',
+        install: true,
+        link_with: [
+            thresholds_a,
+            utils_a,
+        ],
+    )
+endif
+
+if get_option('cpu').enabled()
+    executable(
+        'cpusensor',
+        'CPUSensorMain.cpp',
+        'CPUSensor.cpp',
+        dependencies: [
+            gpiodcxx,
+            sdbusplus,
+        ],
+        implicit_include_directories: false,
+        include_directories: [
+            '../include'
+        ] + peci_incdirs,
+        install: true,
+        link_with: [
+            thresholds_a,
+            utils_a,
+        ],
+    )
+endif
+
+if get_option('exit-air').enabled()
+    executable(
+        'exitairtempsensor',
+        'ExitAirTempSensor.cpp',
+        dependencies: [
+            sdbusplus,
+        ],
+        implicit_include_directories: false,
+        include_directories: '../include',
+        install: true,
+        link_with: [
+            thresholds_a,
+            utils_a,
+        ],
+    )
+endif
+
+if get_option('fan').enabled()
+    executable(
+        'fansensor',
+        'FanMain.cpp',
+        'TachSensor.cpp',
+        'PwmSensor.cpp',
+        dependencies: [
+            sdbusplus,
+            gpiodcxx
+        ],
+        implicit_include_directories: false,
+        include_directories: '../include',
+        install: true,
+        link_with: [
+            thresholds_a,
+            utils_a,
+        ],
+    )
+endif
+
+if get_option('hwmon-temp').enabled()
+    executable(
+        'hwmontempsensor',
+        'HwmonTempMain.cpp',
+        'HwmonTempSensor.cpp',
+        dependencies: [
+            sdbusplus,
+        ],
+        implicit_include_directories: false,
+        include_directories: '../include',
+        install: true,
+        link_with: [
+            thresholds_a,
+            utils_a,
+        ],
+    )
+endif
+
+if get_option('intrusion').enabled()
+    executable(
+        'intrusionsensor',
+        'ChassisIntrusionSensor.cpp',
+        'IntrusionSensorMain.cpp',
+        dependencies: [
+            i2c,
+            sdbusplus,
+            gpiodcxx,
+        ],
+        implicit_include_directories: false,
+        include_directories: '../include',
+        install: true,
+        link_with: [
+            utils_a,
+        ],
+    )
+endif
+
+if get_option('ipmb').enabled()
+    executable(
+        'ipmbsensor',
+        'IpmbSensor.cpp',
+        dependencies: [
+            sdbusplus,
+        ],
+        implicit_include_directories: false,
+        include_directories: '../include',
+        install: true,
+        link_with: [
+            thresholds_a,
+            utils_a,
+        ],
+    )
+endif
+
+if get_option('mcu-temp').enabled()
+    executable(
+        'mcutempsensor',
+        'MCUTempSensor.cpp',
+        dependencies: [
+            i2c,
+            sdbusplus,
+        ],
+        implicit_include_directories: false,
+        include_directories: '../include',
+        install: true,
+        link_with: [
+            utils_a,
+            thresholds_a,
+        ],
+    )
+endif
+
+if get_option('nvme').enabled()
+    executable(
+        'nvmesensor',
+        'NVMeSensorMain.cpp',
+	'NVMeSensor.cpp',
+        dependencies: [
+            i2c,
+            sdbusplus,
+            mctp,
+	],
+        implicit_include_directories: false,
+        include_directories: '../include',
+        install: true,
+        link_with: [
+            utils_a,
+            thresholds_a,
+        ],
+    )
+endif
+
+if get_option('psu-temp').enabled()
+    executable(
+        'psutempsensor',
+        'PSUEvent.cpp',
+        'PSUSensor.cpp',
+        'PSUSensorMain.cpp',
+        dependencies: [
+            sdbusplus,
+        ],
+        implicit_include_directories: false,
+        include_directories: '../include',
+        install: true,
+        link_with: [
+            pwmsensor_a,
+            thresholds_a,
+            utils_a,
+        ],
+    )
+endif
+
+if get_option('external').enabled()
+    executable(
+        'externalsensor',
+        'ExternalSensor.cpp',
+        'ExternalSensorMain.cpp',
+        dependencies: [
+            sdbusplus,
+        ],
+        implicit_include_directories: false,
+        include_directories: '../include',
+        install: true,
+        link_with: [
+            thresholds_a,
+            utils_a,
+        ],
+    )
+endif
diff --git a/tests/meson.build b/tests/meson.build
new file mode 100644
index 0000000..b63d437
--- /dev/null
+++ b/tests/meson.build
@@ -0,0 +1,32 @@
+gtest = dependency('gtest', main: true, disabler: true, required: build_tests)
+have_boost_dbus = meson.get_compiler('cpp').has_header('dbus/connection.hpp')
+
+if have_boost_dbus
+test(
+    'test_hwmon_temp_sensor',
+    executable(
+        'test_hwmon_temp_sensor',
+        'test_HwmonTempSensor.cpp',
+        dependencies: [
+            gtest,
+            boost_dbus,
+        ],
+        implicit_include_directories: false,
+        include_directories: '../include',
+    )
+)
+
+test(
+    'test_tach_sensor',
+    executable(
+        'test_tach_sensor',
+        'test_TachSensor.cpp',
+        dependencies: [
+            gtest,
+            boost_dbus,
+        ],
+        implicit_include_directories: false,
+        include_directories: '../include',
+    )
+)
+endif