| project( |
| 'phosphor-fan-presence', |
| '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', |
| ) |
| |
| python_prog = find_program('python3', native: true) |
| |
| cpp = meson.get_compiler('cpp') |
| |
| cli11_dep = dependency('cli11', required: false) |
| |
| if not cpp.has_header_symbol( |
| 'CLI/CLI.hpp', |
| 'CLI::App', |
| dependencies: cli11_dep, |
| required: false) |
| cli11_proj = subproject('cli11', required:false) |
| assert(cli11_proj.found(), 'CLI11 is required') |
| cli11_dep = cli11_proj.get_variable('CLI11_dep') |
| endif |
| |
| cereal_dep = dependency('cereal', required: false) |
| has_cereal = cpp.has_header_symbol( |
| 'cereal/cereal.hpp', |
| 'cereal::specialize', |
| dependencies: cereal_dep, |
| required: false) |
| if not has_cereal |
| cereal_opts = import('cmake').subproject_options() |
| cereal_opts.add_cmake_defines({'BUILD_TESTS': 'OFF', 'SKIP_PERFORMANCE_COMPARISON': 'ON'}) |
| cereal_proj = import('cmake').subproject( |
| 'cereal', |
| options: cereal_opts, |
| required: false) |
| assert(cereal_proj.found(), 'cereal is required') |
| cereal_dep = cereal_proj.dependency('cereal') |
| endif |
| |
| nlohmann_json_dep = dependency('nlohmann_json', include_type: 'system') |
| phosphor_dbus_interfaces_dep = dependency('phosphor-dbus-interfaces') |
| phosphor_logging_dep = dependency('phosphor-logging') |
| sdbusplus_dep = dependency('sdbusplus') |
| sdeventplus_dep = dependency('sdeventplus') |
| stdplus_dep = dependency('stdplus') |
| systemd_dep = dependency('systemd') |
| |
| if(get_option('tests').allowed()) |
| gmock_dep = dependency('gmock', disabler: true, required: false) |
| gtest_dep = dependency('gtest', main: true, disabler: true, required: false) |
| |
| if not gtest_dep.found() or not gmock_dep.found() |
| gtest_proj = import('cmake').subproject('googletest', required: false) |
| if gtest_proj.found() |
| gtest_dep = declare_dependency( |
| dependencies: [ |
| dependency('threads'), |
| gtest_proj.dependency('gtest'), |
| gtest_proj.dependency('gtest_main'), |
| ] |
| ) |
| gmock_dep = gtest_proj.dependency('gmock') |
| else |
| assert( |
| not get_option('tests').allowed(), |
| 'Googletest is required if tests are enabled' |
| ) |
| endif |
| endif |
| subdir('test') |
| endif |
| |
| |
| servicedir = systemd_dep.get_variable('systemdsystemunitdir') |
| usr_share_dir = '/usr/share/phosphor-fan-presence' |
| |
| conf = configuration_data() |
| |
| # Control |
| conf.set_quoted( |
| 'CONTROL_PERSIST_ROOT_PATH', get_option('control-persist-root-path')) |
| conf.set_quoted( |
| 'CONTROL_PERSIST_ROOT_PATH', get_option('control-persist-root-path')) |
| conf.set_quoted( |
| 'FAN_DEF_YAML_FILE', get_option('fan-def-yaml-file')) |
| conf.set_quoted( |
| 'FAN_ZONE_YAML_FILE', get_option('fan-zone-yaml-file')) |
| conf.set_quoted( |
| 'ZONE_EVENTS_YAML_FILE', get_option('zone-events-yaml-file')) |
| conf.set_quoted( |
| 'ZONE_CONDITIONS_YAML_FILE', get_option('zone-conditions-yaml-file')) |
| |
| # Fan control can be in YAML mode when everything else is in JSON mode |
| control_conf_type = 'yaml' |
| if get_option('json-config').allowed() and get_option('json-control').allowed() |
| control_conf_type = 'json' |
| endif |
| |
| # Monitor |
| conf.set( |
| 'NUM_MONITOR_LOG_ENTRIES', get_option('num-monitor-log-entries')) |
| conf.set_quoted( |
| 'FAN_MONITOR_YAML_FILE', get_option('fan-monitor-yaml-file')) |
| conf.set('DELAY_HOST_CONTROL', get_option('delay-host-control')) |
| if get_option('monitor-use-host-state').allowed() |
| conf.set('MONITOR_USE_HOST_STATE', '') |
| endif |
| |
| # JSON-or-YAML (all programs) |
| if get_option('json-config').allowed() |
| conf.set('PRESENCE_USE_JSON', '') |
| if control_conf_type == 'json' |
| conf.set('CONTROL_USE_JSON', '') |
| endif |
| conf.set('MONITOR_USE_JSON', '') |
| |
| conf_type = 'json' |
| else |
| conf_type = 'yaml' |
| endif |
| |
| # Sensor Monitor |
| conf.set_quoted('SENSOR_MONITOR_PERSIST_ROOT_PATH', |
| get_option('sensor-monitor-persist-root-path')) |
| |
| if get_option('use-host-power-state').allowed() |
| conf.set('ENABLE_HOST_STATE', '') |
| endif |
| |
| conf.set( |
| 'SHUTDOWN_ALARM_HARD_SHUTDOWN_DELAY_MS', get_option('sensor-monitor-hard-shutdown-delay')) |
| conf.set( |
| 'SHUTDOWN_ALARM_SOFT_SHUTDOWN_DELAY_MS', get_option('sensor-monitor-soft-shutdown-delay')) |
| |
| # Presence |
| conf.set( |
| 'NUM_PRESENCE_LOG_ENTRIES', get_option('num-presence-log-entries')) |
| conf.set_quoted( |
| 'PRESENCE_YAML_FILE', get_option('presence-config')) |
| |
| configure_file(output: 'config.h', configuration: conf) |
| |
| # Service: [name,[svcfiles]] |
| services = [] |
| |
| if get_option('control-service').allowed() |
| subdir('control') |
| service_files = ['phosphor-fan-control@.service'] |
| if control_conf_type == 'yaml' |
| service_files += 'phosphor-fan-control-init@.service' |
| endif |
| services += [['control', service_files]] |
| endif |
| |
| if get_option('monitor-service').allowed() |
| subdir('monitor') |
| service_files = ['phosphor-fan-monitor@.service'] |
| if not get_option('json-config').allowed() |
| service_files += 'phosphor-fan-monitor-init@.service' |
| endif |
| services += [['monitor', service_files]] |
| endif |
| |
| if get_option('cooling-type-service').allowed() |
| libevdev_dep = dependency('libevdev') |
| subdir('cooling-type') |
| endif |
| |
| if get_option('presence-service').allowed() |
| libevdev_dep = dependency('libevdev') |
| subdir('presence') |
| services += [['presence', ['phosphor-fan-presence-tach@.service']]] |
| endif |
| |
| if get_option('sensor-monitor-service').allowed() |
| subdir('sensor-monitor') |
| install_data('sensor-monitor/service_files/sensor-monitor.service', |
| install_dir: servicedir) |
| endif |
| |
| foreach service : services |
| this_conf_type = conf_type |
| |
| if service[0] == 'control' |
| this_conf_type = control_conf_type |
| endif |
| |
| foreach service_file : service[1] |
| install_data(service[0] / 'service_files' / this_conf_type / service_file, |
| install_dir: servicedir) |
| endforeach |
| |
| if this_conf_type == 'json' |
| fs = import('fs') |
| dir = meson.current_source_dir() / service[0] / 'config_files' / get_option('machine-name') |
| if fs.is_dir(dir) |
| install_subdir(service[0] / 'config_files' / get_option('machine-name'), |
| install_dir: usr_share_dir / service[0], |
| strip_directory: true) |
| endif |
| endif |
| endforeach |
| |