| project( |
| 'phosphor-power', |
| 'cpp', |
| default_options: [ |
| 'warning_level=3', |
| 'werror=true', |
| 'cpp_std=c++23', |
| 'buildtype=debugoptimized', |
| 'prefix=/usr' |
| ], |
| license: 'Apache-2.0', |
| version: '1.0', |
| meson_version: '>=1.1.1', |
| ) |
| |
| cxx = meson.get_compiler('cpp') |
| |
| build_tests = get_option('tests') |
| |
| if get_option('oe-sdk').allowed() |
| # Setup OE SYSROOT |
| OECORE_TARGET_SYSROOT = run_command('sh', '-c', 'echo $OECORE_TARGET_SYSROOT').stdout().strip() |
| if OECORE_TARGET_SYSROOT == '' |
| error('Unable to get $OECORE_TARGET_SYSROOT, check your environment.') |
| endif |
| message('OE_SYSROOT: ' + OECORE_TARGET_SYSROOT) |
| rpath = ':'.join([OECORE_TARGET_SYSROOT + '/lib', OECORE_TARGET_SYSROOT + '/usr/lib']) |
| ld_so = run_command('sh', '-c', 'find ' + OECORE_TARGET_SYSROOT + '/lib/ld-*.so | sort -r -n | head -n1').stdout().strip() |
| dynamic_linker = ['-Wl,-dynamic-linker,' + ld_so] |
| else |
| dynamic_linker = [] |
| endif |
| |
| |
| gmock = dependency('gmock', disabler: true, required: false) |
| gtest = dependency('gtest', main: true, disabler: true, required: false) |
| if (not gtest.found() or not gmock.found()) and build_tests.allowed() |
| gtest_opts = import('cmake').subproject_options() |
| gtest_opts.add_cmake_defines({ |
| 'BUILD_SHARED_LIBS': 'ON' |
| }) |
| gtest_proj = import('cmake').subproject('googletest', |
| options: gtest_opts, |
| 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(false, 'Googletest is required if tests are enabled') |
| endif |
| endif |
| |
| |
| |
| phosphor_dbus_interfaces = dependency('phosphor-dbus-interfaces') |
| phosphor_logging = dependency('phosphor-logging') |
| prog_python = import('python').find_installation('python3') |
| sdbusplus = dependency('sdbusplus') |
| sdbuspp = find_program('sdbus++') |
| sdeventplus = dependency('sdeventplus') |
| pthread = dependency('threads') |
| stdplus = dependency('stdplus') |
| boost = dependency('boost') |
| fmt = dependency('fmt', required: false) |
| if not fmt.found() |
| fmt_proj = import('cmake').subproject( |
| 'fmt', |
| cmake_options: [ |
| '-DCMAKE_POSITION_INDEPENDENT_CODE=ON', |
| '-DMASTER_PROJECT=OFF' |
| ], |
| required: false) |
| assert(fmt_proj.found(), 'fmtlib is required') |
| fmt = fmt_proj.dependency('fmt') |
| endif |
| libgpiodcxx = dependency('libgpiodcxx', |
| default_options: ['bindings=cxx']) |
| |
| nlohmann_json_dep = dependency('nlohmann_json', include_type: 'system') |
| |
| if cxx.has_header('CLI/CLI.hpp') |
| cli11_dep = declare_dependency() |
| else |
| cli11_dep = dependency('CLI11') |
| endif |
| |
| systemd = dependency('systemd') |
| servicedir = systemd.get_variable('systemdsystemunitdir') |
| |
| services = [ |
| ['supply-monitor', 'power-supply-monitor@.service'], |
| ['sequencer-monitor', 'pseq-monitor-pgood.service'], |
| ['sequencer-monitor', 'pseq-monitor.service'], |
| ['supply-monitor-ng', 'phosphor-psu-monitor.service'], |
| ['regulators', 'phosphor-regulators.service'], |
| ['regulators', 'phosphor-regulators-config.service'], |
| ['regulators', 'phosphor-regulators-monitor-enable.service'], |
| ['regulators', 'phosphor-regulators-monitor-disable.service'], |
| ['power-control', 'phosphor-power-control.service'], |
| ] |
| |
| fs = import('fs') |
| foreach service : services |
| if get_option(service[0]) |
| fs.copyfile('services/' + service[1], |
| install: true, |
| install_dir: servicedir) |
| endif |
| endforeach |
| |
| # Get the power sequencer class name |
| sequencer = get_option('power_sequencer') |
| if sequencer == 'ucd90160' |
| sequencer_class = 'UCD90160' |
| elif sequencer == 'mihawk-cpld' |
| sequencer_class = 'MihawkCPLD' |
| else |
| # power sequencer is incorrect |
| error('power sequencer is incorrect') |
| endif |
| |
| conf = configuration_data() |
| conf.set_quoted( |
| 'INPUT_HISTORY_BUSNAME_ROOT', get_option('input-history-busname-root')) |
| conf.set_quoted( |
| 'INPUT_HISTORY_SENSOR_ROOT', get_option('input-history-sensor-root')) |
| conf.set_quoted( |
| 'INPUT_HISTORY_SYNC_GPIO', get_option('input-history-sync-gpio')) |
| conf.set_quoted( |
| 'PSU_JSON_PATH', '/usr/share/phosphor-power/psu.json') |
| conf.set( |
| 'SEQUENCER', sequencer_class) |
| conf.set10( |
| 'DEVICE_ACCESS', get_option('device-access')) |
| conf.set10('IBM_VPD', get_option('ibm-vpd')) |
| |
| configure_file(output: 'config.h', configuration: conf) |
| |
| # Ensure the generated header here winds up in the correct path in the build |
| # tree such that it actually get used and doesn't get found in the sysroot |
| # somewhere. Meson doesn't allow path elements (rightfully so) when specifying |
| # the output filename of a target definition so the target must be defined in |
| # the directory where the artifacts need to be placed. Do that now, because |
| # the generated source (cpp) is needed to define the library target. |
| subdir('org/open_power/Witherspoon/Fault') |
| |
| libpower = static_library( |
| 'power', |
| error_cpp, |
| error_hpp, |
| 'gpio.cpp', |
| 'pmbus.cpp', |
| 'temporary_file.cpp', |
| 'utility.cpp', |
| dependencies: [ |
| nlohmann_json_dep, |
| phosphor_dbus_interfaces, |
| phosphor_logging, |
| sdbusplus, |
| sdeventplus, |
| ], |
| ) |
| |
| libpower_inc = include_directories('.') |
| |
| # Build the tools/i2c sub-directory first. Other sub-directories depend on |
| # Meson variables defined there. |
| subdir('tools/i2c') |
| |
| if get_option('regulators') |
| subdir('phosphor-regulators') |
| endif |
| if get_option('sequencer-monitor') |
| subdir('power-sequencer') |
| endif |
| if get_option('power-control') |
| subdir('phosphor-power-sequencer') |
| endif |
| if get_option('supply-monitor') |
| subdir('power-supply') |
| endif |
| if get_option('supply-monitor-ng') |
| subdir('phosphor-power-supply') |
| endif |
| if get_option('utils') |
| subdir('tools/power-utils') |
| endif |
| if get_option('tests').allowed() |
| subdir('test') |
| endif |
| if get_option('cold-redundancy') |
| subdir('cold-redundancy') |
| endif |