conf_data = configuration_data()
conf_data.set10('VALIDATION_UNSECURE_FEATURE', get_option('validate-unsecure-feature').enabled())
conf_data.set10('INSECURE_UNRESTRICTED_SENSOR_OVERRIDE', get_option('insecure-sensor-override').enabled())
conf_data.set10('NVMED_ENABLE_SINGLE_WOKER', get_option('single-worker').enabled())

metric_store_feature_map = {
    'disabled': 0,
    'static':  1,
    'dynamic':  2
}
metric_store_feature = metric_store_feature_map.get(get_option('metric-store'))
conf_data.set('METRIC_STORE_FEATURE', metric_store_feature)

conf_hdr = configure_file(input: 'dbus-sensor_config.h.in',
               output: 'dbus-sensor_config.h',
               configuration: conf_data)

thresholds_a = static_library(
    'thresholds_a',
    'Thresholds.cpp',
    dependencies: default_deps,
)

thresholds_dep = declare_dependency(
    link_with: [ thresholds_a ],
    dependencies: default_deps,
)

utils_a = static_library(
    'utils_a',
    [
        'FileHandle.cpp',
        'MctpUtil.cpp',
        'SensorPaths.cpp',
        'Utils.cpp',
    ],
    dependencies: default_deps,
)

utils_dep = declare_dependency(
    link_with: [ utils_a ],
    dependencies: [ sdbusplus, systemd ],
)

devicemgmt_a = static_library(
    'devicemgmt_a',
    [
        'DeviceMgmt.cpp',
    ],
    dependencies: default_deps,
)

devicemgmt_dep = declare_dependency(
    link_with: [ devicemgmt_a ],
    dependencies: default_deps,
)

pwmsensor_a = static_library(
    'pwmsensor_a',
    'PwmSensor.cpp',
    dependencies: [ default_deps, thresholds_dep ],
)

pwmsensor_dep = declare_dependency(
    link_with: [ pwmsensor_a ],
    dependencies: [ default_deps, thresholds_dep ],
)

peci_incdirs = []
if not meson.get_compiler('cpp').has_header('linux/peci-ioctl.h')
    peci_incdirs = ['../include']
endif

if get_option('intel-cpu').enabled()
    peci_dep = meson.get_compiler('cpp').find_library('libpeci', required : false)
    if not peci_dep.found()
      cmake = import('cmake')
      opt = cmake.subproject_options()
      opt.append_compile_args('c', '-Wno-pedantic')
      peci_proj = cmake.subproject('libpeci', options : opt)
      peci_dep = peci_proj.dependency('peci')
    endif
endif

if get_option('adc').enabled()
    executable(
        'adcsensor',
        'ADCSensor.cpp',
        'ADCSensorMain.cpp',
        dependencies: [
            default_deps,
            gpiodcxx,
            thresholds_dep,
            utils_dep,
        ],
        install: true,
    )
endif

if get_option('intel-cpu').enabled()
    executable(
        'intelcpusensor',
        'IntelCPUSensorMain.cpp',
        'IntelCPUSensor.cpp',
        dependencies: [
            default_deps,
            gpiodcxx,
            thresholds_dep,
            utils_dep,
            peci_dep,
        ],
        include_directories: peci_incdirs,
        install: true,
    )
endif

if get_option('exit-air').enabled()
    executable(
        'exitairtempsensor',
        'ExitAirTempSensor.cpp',
        dependencies: [
            default_deps,
            thresholds_dep,
            utils_dep,
        ],
        install: true,
    )
endif

if get_option('fan').enabled()
    executable(
        'fansensor',
        'FanMain.cpp',
        'TachSensor.cpp',
        'PwmSensor.cpp',
        dependencies: [
            default_deps,
            gpiodcxx,
            thresholds_dep,
            utils_dep,
        ],
        install: true,
    )
endif

if get_option('hwmon-temp').enabled()
    executable(
        'hwmontempsensor',
        'HwmonTempMain.cpp',
        'HwmonTempSensor.cpp',
        dependencies: [
            default_deps,
            devicemgmt_dep,
            thresholds_dep,
            utils_dep,
        ],
        install: true,
    )
endif

if get_option('intrusion').enabled()
    executable(
        'intrusionsensor',
        'ChassisIntrusionSensor.cpp',
        'IntrusionSensorMain.cpp',
        dependencies: [
            default_deps,
            gpiodcxx,
            i2c,
            utils_dep,
        ],
        install: true,
    )
endif

if get_option('ipmb').enabled()
    executable(
        'ipmbsensor',
        'IpmbSensor.cpp',
        'IpmbSDRSensor.cpp',
        dependencies: [
            default_deps,
            thresholds_dep,
            utils_dep,
        ],
        install: true,
    )
endif

if get_option('mcu').enabled()
    executable(
        'mcutempsensor',
        'MCUTempSensor.cpp',
        dependencies: [
            default_deps,
            i2c,
            thresholds_dep,
            utils_dep,
        ],
        install: true,
    )
endif

if get_option('nvme').enabled()
    nvme_srcs = files(
        'MctpEndpoint.cpp',
        'MctpReactorDevice.cpp',
        'NVMeSensorMain.cpp',
        'NVMeSensor.cpp',
        'NVMeBasic.cpp',
        'NVMeSubsys.cpp',
        'NVMeMi.cpp',
        'NVMeController.cpp',
        'NVMeProgress.cpp',
        'NVMeVolume.cpp',
        'NVMeDevice.cpp',
        'NVMeDrive.cpp',
        'NVMeError.cpp',
        'NVMeStorage.cpp',
        'NVMePlugin.cpp',
        'NVMeMetricStore.cpp',
        'NVMeFeatureStore.cpp',
    )

    pdi_dep = phosphor_dbus_interfaces_dep
    libnvme = dependency('libnvme',
        required : true,
        fallback : ['libnvme', 'libnvme_dep'],
        default_options : ['warning_level=1', 'werror=false'],
        include_type: 'system'
    )
    libnvme_mi = dependency('libnvme-mi',
        required : true,
        fallback : ['libnvme', 'libnvme_mi_dep'],
        include_type: 'system'
    )

    nvme_deps = [
        default_deps, i2c, thresholds_dep, utils_dep,
        threads, pdi_dep, libnvme, libnvme_mi,
        nvme_dbus_dep, nvme_proto_dep
    ]

    if get_option('nvme_shmem').enabled()
        nvme_deps += [
            absl_status_dep,
            shared_mem_dep
        ]
    endif

    cxx = meson.get_compiler('cpp')

    executable(
        'nvmesensor',
        sources: nvme_srcs,
        dependencies: nvme_deps,
        cpp_args: [
            '-frtti',
            '-DBOOST_ASIO_DISABLE_EPOLL',
            '-DBOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT',
            '-UBOOST_ASIO_NO_DEPRECATED',
            '-UBOOST_ASIO_DISABLE_THREADS',
            '-UBOOST_ASIO_HAS_IO_URING'
        ],
        link_args: cxx.get_id() == 'clang' ? ['-rdynamic'] : ['-export-dynamic'],
        install: true,
        include_directories: nvme_dbus_includes,
    )

    nvme_plugin_inc = include_directories('./')

    nvme_plugin_dep = declare_dependency(
        include_directories: nvme_plugin_inc,
        dependencies: [default_deps, nvme_dbus_dep, pdi_dep, libnvme_mi],
    )

    pkgconfig = import('pkgconfig')
    pkgconfig.generate(
        name: 'nvme-plugin',
        version: meson.project_version(),
        description: 'nvmed plugin package',
        subdirs: ['.', 'gen', 'nvmed']
    )

    install_headers(
        'Utils.hpp',
        'MctpUtil.hpp',
        'NVMePlugin.hpp',
        'NVMeUtil.hpp',
        'VariantVisitors.hpp',
        conf_hdr,
        'SensorPaths.hpp',
        'Thresholds.hpp',
        'sensor.hpp',
        'NVMeSensor.hpp',
        'NVMeCache.hpp',
        'NVMeMetricStore.hpp',
        'NVMeDefs.hpp',
        subdir: 'nvmed'
    )

endif

if get_option('psu').enabled()
    executable(
        'psusensor',
        'PSUEvent.cpp',
        'PSUSensor.cpp',
        'PSUSensorMain.cpp',
        dependencies: [
            default_deps,
            devicemgmt_dep,
            pwmsensor_dep,
            thresholds_dep,
            utils_dep,
        ],
        install: true,
    )
endif

if get_option('external').enabled()
    executable(
        'externalsensor',
        'ExternalSensor.cpp',
        'ExternalSensorMain.cpp',
        dependencies: [
            default_deps,
            thresholds_dep,
            utils_dep,
        ],
        install: true,
    )
endif
