project(
    'openpower-occ-control', 'cpp',
    version : '1.0.0',
    meson_version: '>=0.57.0',
    default_options: [
        'warning_level=3',
        'werror=true',
        'cpp_std=c++20',
        'buildtype=debugoptimized'
    ]
)

cxx = meson.get_compiler('cpp')

conf_data = configuration_data()
conf_data.set_quoted('OCC_CONTROL_BUSNAME', 'org.open_power.OCC.Control')
conf_data.set_quoted('OCC_CONTROL_ROOT', '/org/open_power/control')
conf_data.set_quoted('OCC_SENSORS_ROOT', '/xyz/openbmc_project/sensors')
conf_data.set_quoted('CPU_NAME', 'cpu')
conf_data.set_quoted('OCC_NAME', 'occ')
conf_data.set_quoted('OCC_MASTER_NAME', 'occ-hwmon.1')
conf_data.set_quoted('OCC_DEV_PATH', '/dev/occ')
conf_data.set_quoted('CPU_SUBPATH', '/xyz/openbmc_project/inventory/system/chassis/motherboard')
conf_data.set_quoted('OCC_CONTROL_PERSIST_PATH', '/var/lib/openpower-occ-control')

conf_data.set('MAX_CPUS', get_option('max-cpus'))
conf_data.set('OCC_CPU_TEMP_SENSOR_TYPE', 0xC0)
conf_data.set('OCC_DIMM_TEMP_SENSOR_TYPE', 0xD0)
conf_data.set('PS_DERATING_FACTOR', get_option('ps-derating-factor'))

if get_option('i2c-occ').enabled()
    conf_data.set_quoted('OCC_HWMON_PATH', '/sys/bus/i2c/drivers/occ-hwmon/')
    conf_data.set_quoted('DEV_PATH', '/sys/bus/i2c/devices')
    conf_data.set_quoted('I2C_OCC_DEVICE_NAME', 'p8-occ-hwmon')
else
    conf_data.set_quoted('OCC_HWMON_PATH', '/sys/bus/platform/drivers/occ-hwmon/')
    conf_data.set_quoted('DEV_PATH', '/sys/bus/platform/devices/')
endif

if get_option('install-error-yaml').disabled()
    conf_data.set('I2C_OCC', get_option('i2c-occ').enabled())
    conf_data.set('READ_OCC_SENSORS', get_option('read-occ-sensors').enabled())
    conf_data.set('PLDM', get_option('with-host-communication-protocol')=='pldm')
    conf_data.set('POWER10', get_option('power10-support').enabled())
endif

configure_file(output: 'config.h',
    configuration: conf_data
)

install_data('occ-active.sh',
    install_mode: 'rwxr-xr-x',
    install_dir: get_option('bindir')
)

systemd = dependency('systemd')
systemd_system_unit_dir = systemd.get_variable(
    pkgconfig : 'systemdsystemunitdir')
subdir('service_files')

sdbusplus_dep = dependency('sdbusplus')
sdbusplusplus_prog = find_program('sdbus++')
sdbuspp_gen_meson_prog = find_program('sdbus++-gen-meson')
sdbusplusplus_depfiles = files()
if sdbusplus_dep.type_name() == 'internal'
    sdbusplusplus_depfiles = subproject('sdbusplus').get_variable('sdbusplusplus_depfiles')
endif

python_prog = find_program('python3', required: true)
realpath_prog = find_program('realpath')

selected_subdirs = []
selected_subdirs += 'org/open_power/OCC'

generated_root = meson.current_build_dir() / 'gen'
generated_others = []
generated_sources = []

# Source the generated meson files.
subdir('gen')
foreach d : selected_subdirs
  subdir('gen' / d)
endforeach

# Parse through the list from sdbus++-gendir and put into sets.
generated_headers = []
generated_cpp = []
generated_others_files = []

foreach g : generated_sources generated_others
    foreach f : g.to_list()
        rel_path = run_command(
            realpath_prog,
            '--relative-to', generated_root,
            f.full_path(),
        ).stdout().strip().split('\n')[-1]

        if rel_path.endswith('.hpp')
            generated_headers += rel_path
        elif rel_path.endswith('.cpp')
            generated_cpp += rel_path
        else
            generated_others_files += rel_path
        endif
    endforeach
endforeach

deps = []
sources = []
if get_option('install-error-yaml').disabled()
    sdeventplus_dep = dependency(
        'sdeventplus',
        fallback: [
            'sdeventplus',
            'sdeventplus_dep'
        ],
    )
    phosphor_logging_dep = dependency(
        'phosphor-logging',
        fallback: [
            'phosphor-logging',
            'phosphor_logging_dep'
        ],
    )
    phosphor_dbus_interfaces_dep = dependency(
        'phosphor-dbus-interfaces',
        fallback: [
            'phosphor-dbus-interfaces',
            'phosphor_dbus_interfaces_dep'
        ],
    )

    deps += [
        sdbusplus_dep,
        sdeventplus_dep,
        phosphor_logging_dep,
        phosphor_dbus_interfaces_dep,
    ]

    sources += [
        'app.cpp',
        'occ_pass_through.cpp',
        'occ_manager.cpp',
        'occ_status.cpp',
        'occ_device.cpp',
        'occ_errors.cpp',
        'occ_ffdc.cpp',
        'occ_presence.cpp',
        'occ_command.cpp',
        'occ_dbus.cpp',
        'powercap.cpp',
        'i2c_occ.cpp',
        'utils.cpp',
    ]

    if get_option('with-host-communication-protocol')=='pldm'
        libpldm_dep = dependency(
            'libpldm',
            fallback: ['pldm', 'libpldm_dep'],
            default_options: ['libpldm-only=enabled', 'oem-ibm=enabled'],
        )
        deps += [
            libpldm_dep,
            cxx.find_library('pdbg'),
            cxx.find_library('phal'),
        ]
        sources += [
            'pldm.cpp',
        ]
    endif

    if get_option('power10-support').enabled()
        sources += [
            'powermode.cpp',
        ]
    endif

    yamldir = get_option('yamldir')
    if yamldir == ''
        yamldir = meson.project_source_root() / 'example'
    endif

    # Generate occ-sensor.hpp.
    occ_sensor_hpp = custom_target(
        'occ-sensor.hpp',
        command : [
            python_prog,
            meson.project_source_root() + '/sensor_gen.py',
            '-i', yamldir,
        ],
        output : 'occ-sensor.hpp')
    sources += [occ_sensor_hpp]

    executable(
        'openpower-occ-control',
        sources,
        generated_sources,
        include_directories: ['.', 'gen'],
        implicit_include_directories: true,
        dependencies: deps,
        install: true,
        install_dir: get_option('bindir')
    )
endif

if not get_option('tests').disabled()
  subdir('test')
endif
