1project( 2 'phosphor-state-manager', 3 'cpp', 4 default_options: [ 5 'warning_level=3', 6 'werror=true', 7 'cpp_std=c++23' 8 ], 9 meson_version: '>=1.1.1', 10 license: 'Apache-2.0', 11 version: '0.1', 12) 13cpp = meson.get_compiler('cpp') 14 15build_host_gpios = get_option('host-gpios') 16 17conf = configuration_data() 18conf.set_quoted( 19 'HOST_BUSNAME', get_option('host-busname')) 20conf.set_quoted( 21 'HOST_OBJPATH', get_option('host-objpath')) 22conf.set_quoted( 23 'HOST_SCHED_OBJPATH', get_option('host-sched-objpath')) 24conf.set_quoted( 25 'HYPERVISOR_BUSNAME', get_option('hypervisor-busname')) 26conf.set_quoted( 27 'HYPERVISOR_OBJPATH', get_option('hypervisor-objpath')) 28conf.set_quoted( 29 'CHASSIS_BUSNAME', get_option('chassis-busname')) 30conf.set_quoted( 31 'CHASSIS_OBJPATH', get_option('chassis-objpath')) 32conf.set_quoted( 33 'BMC_BUSNAME', get_option('bmc-busname')) 34conf.set_quoted( 35 'BMC_OBJPATH', get_option('bmc-objpath')) 36conf.set_quoted( 37 'HOST_STATE_PERSIST_PATH', get_option('host-state-persist-path')) 38conf.set_quoted( 39 'POH_COUNTER_PERSIST_PATH', get_option('poh-counter-persist-path')) 40conf.set_quoted( 41 'CHASSIS_STATE_CHANGE_PERSIST_PATH', get_option('chassis-state-change-persist-path')) 42conf.set_quoted( 43 'SCHEDULED_HOST_TRANSITION_PERSIST_PATH', get_option('scheduled-host-transition-persist-path')) 44conf.set_quoted( 45 'SCHEDULED_HOST_TRANSITION_BUSNAME', get_option('scheduled-host-transition-busname')) 46conf.set( 47 'BOOT_COUNT_MAX_ALLOWED', get_option('boot-count-max-allowed')) 48conf.set( 49 'CLASS_VERSION', get_option('class-version')) 50conf.set_quoted( 51 'SYSFS_SECURE_BOOT_PATH', get_option('sysfs-secure-boot-path')) 52conf.set_quoted( 53 'SYSFS_ABR_IMAGE_PATH', get_option('sysfs-abr-image-path')) 54if build_host_gpios.enabled() 55 conf.set_quoted( 56 'HOST_GPIOS_BUSNAME', get_option('host-gpios-busname')) 57 conf.set_quoted( 58 'HOST_GPIOS_OBJPATH', get_option('host-gpios-objpath')) 59endif 60 61conf.set10( 62 'ONLY_RUN_APR_ON_POWER_LOSS', get_option('only-run-apr-on-power-loss')) 63 64conf.set_quoted( 65 'SYSFS_TPM_DEVICE_PATH', get_option('sysfs-tpm-device-path')) 66 67conf.set_quoted( 68 'SYSFS_TPM_MEASUREMENT_PATH', get_option('sysfs-tpm-measurement-path')) 69 70conf.set10( 71 'ONLY_ALLOW_BOOT_WHEN_BMC_READY', get_option('only-allow-boot-when-bmc-ready')) 72 73# globals shared across applications 74conf.set_quoted( 75 'BASE_FILE_DIR', '/run/openbmc/') 76 77conf.set_quoted( 78 'CHASSIS_LOST_POWER_FILE', '/run/openbmc/chassis@%d-lost-power') 79 80conf.set_quoted( 81 'HOST_RUNNING_FILE', '/run/openbmc/host@%d-on') 82 83conf.set_quoted( 84 'CHASSIS_ON_FILE', '/run/openbmc/chassis@%d-on') 85 86configure_file(output: 'config.h', configuration: conf) 87 88if(get_option('warm-reboot').enabled()) 89 add_project_arguments('-DENABLE_WARM_REBOOT',language:'cpp') 90endif 91 92sdbusplus = dependency('sdbusplus') 93sdeventplus = dependency('sdeventplus') 94phosphorlogging = dependency('phosphor-logging') 95phosphordbusinterfaces = dependency('phosphor-dbus-interfaces') 96libgpiod = dependency('libgpiod', version : '>=1.4.1') 97fmt = dependency('fmt') 98 99if cpp.has_header('nlohmann/json.hpp') 100 nlohmann_json = declare_dependency() 101else 102 subproject('nlohmann-json') 103 nlohmann_json = declare_dependency( 104 include_directories: [ 105 'subprojects/nlohmann-json/single_include', 106 'subprojects/nlohmann-json/single_include/nlohmann', 107 ] 108 ) 109endif 110 111if cpp.has_header('CLI/CLI.hpp') 112 CLI11 = declare_dependency() 113else 114 CLI11 = dependency('CLI11') 115endif 116 117# Get Cereal dependency. 118cereal = dependency('cereal', required: false) 119has_cereal = cpp.has_header_symbol( 120 'cereal/cereal.hpp', 121 'cereal::specialize', 122 dependencies: cereal, 123 required: false) 124if not has_cereal 125 cereal_opts = import('cmake').subproject_options() 126 cereal_opts.add_cmake_defines({'BUILD_TESTS': 'OFF'}) 127 cereal_proj = import('cmake').subproject( 128 'cereal', 129 options: cereal_opts, 130 required: false) 131 assert(cereal_proj.found(), 'cereal is required') 132 cereal = cereal_proj.dependency('cereal') 133endif 134 135executable('phosphor-host-state-manager', 136 'host_state_manager.cpp', 137 'host_state_manager_main.cpp', 138 'settings.cpp', 139 'host_check.cpp', 140 'utils.cpp', 141 dependencies: [ 142 cereal, 143 fmt, 144 libgpiod, 145 phosphordbusinterfaces, 146 phosphorlogging, 147 sdbusplus, 148 sdeventplus, 149 ], 150 implicit_include_directories: true, 151 install: true 152) 153 154executable('phosphor-hypervisor-state-manager', 155 'hypervisor_state_manager.cpp', 156 'hypervisor_state_manager_main.cpp', 157 'settings.cpp', 158 dependencies: [ 159 phosphordbusinterfaces, 160 phosphorlogging, 161 sdbusplus, 162 sdeventplus, 163 ], 164 implicit_include_directories: true, 165 install: true 166) 167 168executable('phosphor-chassis-state-manager', 169 'chassis_state_manager.cpp', 170 'chassis_state_manager_main.cpp', 171 'utils.cpp', 172 dependencies: [ 173 cereal, 174 fmt, 175 libgpiod, 176 nlohmann_json, 177 phosphordbusinterfaces, 178 phosphorlogging, 179 sdbusplus, 180 sdeventplus, 181 ], 182 implicit_include_directories: true, 183 install: true 184) 185 186executable('phosphor-chassis-check-power-status', 187 'chassis_check_power_status.cpp', 188 'utils.cpp', 189 dependencies: [ 190 fmt, 191 libgpiod, 192 phosphordbusinterfaces, 193 phosphorlogging, 194 sdbusplus, 195 ], 196 implicit_include_directories: true, 197 install: true 198) 199 200executable('phosphor-bmc-state-manager', 201 'bmc_state_manager.cpp', 202 'bmc_state_manager_main.cpp', 203 'utils.cpp', 204 dependencies: [ 205 fmt, 206 libgpiod, 207 phosphordbusinterfaces, 208 phosphorlogging, 209 sdbusplus, 210 sdeventplus, 211 ], 212 implicit_include_directories: true, 213 install: true 214) 215 216executable('phosphor-discover-system-state', 217 'discover_system_state.cpp', 218 'settings.cpp', 219 'utils.cpp', 220 dependencies: [ 221 cereal, 222 fmt, 223 libgpiod, 224 phosphorlogging, 225 sdbusplus, 226 ], 227 implicit_include_directories: true, 228 install: true 229) 230 231executable('phosphor-systemd-target-monitor', 232 'systemd_service_parser.cpp', 233 'systemd_target_monitor.cpp', 234 'systemd_target_parser.cpp', 235 'systemd_target_signal.cpp', 236 'utils.cpp', 237 dependencies: [ 238 CLI11, 239 libgpiod, 240 nlohmann_json, 241 phosphorlogging, 242 sdbusplus, 243 sdeventplus, 244 ], 245 implicit_include_directories: true, 246 install: true 247) 248 249executable('phosphor-scheduled-host-transition', 250 'scheduled_host_transition_main.cpp', 251 'scheduled_host_transition.cpp', 252 'utils.cpp', 253 dependencies: [ 254 cereal, 255 libgpiod, 256 phosphorlogging, 257 sdbusplus, 258 sdeventplus, 259 ], 260 implicit_include_directories: true, 261 install: true 262) 263 264executable('phosphor-host-reset-recovery', 265 'host_reset_recovery.cpp', 266 dependencies: [ 267 phosphorlogging, 268 sdbusplus, 269 ], 270 implicit_include_directories: true, 271 install: true 272) 273 274executable('phosphor-secure-boot-check', 275 'secure_boot_check.cpp', 276 'utils.cpp', 277 dependencies: [ 278 fmt, sdbusplus, 279 phosphorlogging, libgpiod 280 ], 281 implicit_include_directories: true, 282 install: true 283) 284 285install_data('obmcutil', 286 install_mode: 'rwxr-xr-x', 287 install_dir: get_option('bindir') 288) 289 290install_data('scripts/host-reboot', 291 install_mode: 'rwxr-xr-x', 292 install_dir: get_option('libexecdir') 293) 294 295systemd = dependency('systemd') 296systemd_system_unit_dir = systemd.get_variable( 297 'systemdsystemunitdir') 298subdir('service_files') 299subdir('target_files') 300 301if build_host_gpios.enabled() 302 subdir('host_condition_gpio') 303endif 304 305datadir = join_paths( 306 get_option('sysconfdir'), 307 'phosphor-systemd-target-monitor' 308) 309subdir('data') 310 311build_tests = get_option('tests') 312 313# If test coverage of source files within the root directory are wanted, 314# need to define and build the tests from here 315if not build_tests.disabled() 316gtest = dependency('gtest', main: true, disabler: true, required: build_tests) 317gmock = dependency('gmock', disabler: true, required: build_tests) 318 test( 319 'test_systemd_parser', 320 executable('test_systemd_parser', 321 './test/systemd_parser.cpp', 322 'systemd_target_parser.cpp', 323 dependencies: [ 324 gtest, 325 nlohmann_json, 326 ], 327 implicit_include_directories: true, 328 include_directories: '../' 329 ) 330 ) 331 332 test( 333 'test_systemd_signal', 334 executable('test_systemd_signal', 335 './test/systemd_signal.cpp', 336 'systemd_target_signal.cpp', 337 'utils.cpp', 338 dependencies: [ 339 gtest, 340 libgpiod, 341 nlohmann_json, 342 phosphorlogging, 343 sdbusplus, 344 sdeventplus, 345 ], 346 implicit_include_directories: true, 347 include_directories: '../' 348 ) 349 ) 350 351 test( 352 'test_scheduled_host_transition', 353 executable('test_scheduled_host_transition', 354 './test/test_scheduled_host_transition.cpp', 355 'scheduled_host_transition.cpp', 356 'utils.cpp', 357 dependencies: [ 358 cereal, 359 gmock, 360 gtest, 361 libgpiod, 362 phosphorlogging, 363 sdbusplus, 364 sdeventplus, 365 ], 366 implicit_include_directories: true, 367 include_directories: '../' 368 ) 369 ) 370 371 test( 372 'test_hypervisor_state', 373 executable('test_hypervisor_state', 374 './test/hypervisor_state.cpp', 375 'hypervisor_state_manager.cpp', 376 dependencies: [ 377 gtest, 378 phosphorlogging, 379 sdbusplus, 380 sdeventplus, 381 ], 382 implicit_include_directories: true, 383 include_directories: '../' 384 ) 385 ) 386endif 387