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.allowed()
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').allowed())
89    add_project_arguments('-DENABLE_WARM_REBOOT',language:'cpp')
90endif
91
92nlohmann_json_dep = dependency('nlohmann_json', include_type: 'system')
93sdbusplus = dependency('sdbusplus')
94sdeventplus = dependency('sdeventplus')
95phosphorlogging = dependency('phosphor-logging')
96phosphordbusinterfaces = dependency('phosphor-dbus-interfaces')
97libgpiod = dependency('libgpiod', version : '>=1.4.1')
98fmt = dependency('fmt')
99
100if cpp.has_header('CLI/CLI.hpp')
101    CLI11 = declare_dependency()
102else
103    CLI11 = dependency('CLI11')
104endif
105
106# Get Cereal dependency.
107cereal = dependency('cereal', required: false)
108has_cereal = cpp.has_header_symbol(
109    'cereal/cereal.hpp',
110    'cereal::specialize',
111    dependencies: cereal,
112    required: false)
113if not has_cereal
114    cereal_opts = import('cmake').subproject_options()
115    cereal_opts.add_cmake_defines({'BUILD_TESTS': 'OFF'})
116    cereal_proj = import('cmake').subproject(
117        'cereal',
118        options: cereal_opts,
119        required: false)
120    assert(cereal_proj.found(), 'cereal is required')
121    cereal = cereal_proj.dependency('cereal')
122endif
123
124executable('phosphor-host-state-manager',
125            'host_state_manager.cpp',
126            'host_state_manager_main.cpp',
127            'settings.cpp',
128            'host_check.cpp',
129            'utils.cpp',
130            dependencies: [
131                cereal,
132                fmt,
133                libgpiod,
134                phosphordbusinterfaces,
135                phosphorlogging,
136                sdbusplus,
137                sdeventplus,
138            ],
139    implicit_include_directories: true,
140    install: true
141)
142
143executable('phosphor-hypervisor-state-manager',
144            'hypervisor_state_manager.cpp',
145            'hypervisor_state_manager_main.cpp',
146            'settings.cpp',
147            dependencies: [
148                phosphordbusinterfaces,
149                phosphorlogging,
150                sdbusplus,
151                sdeventplus,
152            ],
153    implicit_include_directories: true,
154    install: true
155)
156
157executable('phosphor-chassis-state-manager',
158            'chassis_state_manager.cpp',
159            'chassis_state_manager_main.cpp',
160            'utils.cpp',
161            dependencies: [
162                cereal,
163                fmt,
164                libgpiod,
165                nlohmann_json_dep,
166                phosphordbusinterfaces,
167                phosphorlogging,
168                sdbusplus,
169                sdeventplus,
170            ],
171    implicit_include_directories: true,
172    install: true
173)
174
175executable('phosphor-chassis-check-power-status',
176            'chassis_check_power_status.cpp',
177            'utils.cpp',
178            dependencies: [
179                fmt,
180                libgpiod,
181                phosphordbusinterfaces,
182                phosphorlogging,
183                sdbusplus,
184            ],
185    implicit_include_directories: true,
186    install: true
187)
188
189executable('phosphor-bmc-state-manager',
190            'bmc_state_manager.cpp',
191            'bmc_state_manager_main.cpp',
192            'utils.cpp',
193            dependencies: [
194                fmt,
195                libgpiod,
196                phosphordbusinterfaces,
197                phosphorlogging,
198                sdbusplus,
199                sdeventplus,
200            ],
201    implicit_include_directories: true,
202    install: true
203)
204
205executable('phosphor-discover-system-state',
206            'discover_system_state.cpp',
207            'settings.cpp',
208            'utils.cpp',
209            dependencies: [
210                cereal,
211                fmt,
212                libgpiod,
213                phosphorlogging,
214                sdbusplus,
215            ],
216    implicit_include_directories: true,
217    install: true
218)
219
220executable('phosphor-systemd-target-monitor',
221            'systemd_service_parser.cpp',
222            'systemd_target_monitor.cpp',
223            'systemd_target_parser.cpp',
224            'systemd_target_signal.cpp',
225            'utils.cpp',
226            dependencies: [
227                CLI11,
228                libgpiod,
229                nlohmann_json_dep,
230                phosphorlogging,
231                sdbusplus,
232                sdeventplus,
233            ],
234    implicit_include_directories: true,
235    install: true
236)
237
238executable('phosphor-scheduled-host-transition',
239            'scheduled_host_transition_main.cpp',
240            'scheduled_host_transition.cpp',
241            'utils.cpp',
242            dependencies: [
243                cereal,
244                libgpiod,
245                phosphorlogging,
246                sdbusplus,
247                sdeventplus,
248            ],
249    implicit_include_directories: true,
250    install: true
251)
252
253executable('phosphor-host-reset-recovery',
254            'host_reset_recovery.cpp',
255            dependencies: [
256                phosphorlogging,
257                sdbusplus,
258            ],
259    implicit_include_directories: true,
260    install: true
261)
262
263executable('phosphor-secure-boot-check',
264            'secure_boot_check.cpp',
265            'utils.cpp',
266            dependencies: [
267            fmt, sdbusplus,
268            phosphorlogging, libgpiod
269            ],
270    implicit_include_directories: true,
271    install: true
272)
273
274install_data('obmcutil',
275        install_mode: 'rwxr-xr-x',
276        install_dir: get_option('bindir')
277)
278
279install_data('scripts/host-reboot',
280        install_mode: 'rwxr-xr-x',
281        install_dir: get_option('libexecdir')
282)
283
284systemd = dependency('systemd')
285systemd_system_unit_dir = systemd.get_variable(
286    'systemdsystemunitdir')
287subdir('service_files')
288subdir('target_files')
289
290if build_host_gpios.allowed()
291    subdir('host_condition_gpio')
292endif
293
294datadir = join_paths(
295    get_option('sysconfdir'),
296    'phosphor-systemd-target-monitor'
297)
298subdir('data')
299
300build_tests = get_option('tests')
301
302# If test coverage of source files within the root directory are wanted,
303# need to define and build the tests from here
304if not build_tests.disabled()
305gtest = dependency('gtest', main: true, disabler: true, required: build_tests)
306gmock = dependency('gmock', disabler: true, required: build_tests)
307  test(
308      'test_systemd_parser',
309      executable('test_systemd_parser',
310          './test/systemd_parser.cpp',
311          'systemd_target_parser.cpp',
312          dependencies: [
313              gtest,
314              nlohmann_json_dep,
315          ],
316          implicit_include_directories: true,
317          include_directories: '../'
318      )
319  )
320
321  test(
322      'test_systemd_signal',
323      executable('test_systemd_signal',
324          './test/systemd_signal.cpp',
325          'systemd_target_signal.cpp',
326          'utils.cpp',
327          dependencies: [
328              gtest,
329              libgpiod,
330              nlohmann_json_dep,
331              phosphorlogging,
332              sdbusplus,
333              sdeventplus,
334          ],
335          implicit_include_directories: true,
336          include_directories: '../'
337      )
338  )
339
340  test(
341      'test_scheduled_host_transition',
342      executable('test_scheduled_host_transition',
343          './test/test_scheduled_host_transition.cpp',
344          'scheduled_host_transition.cpp',
345          'utils.cpp',
346          dependencies: [
347              cereal,
348              gmock,
349              gtest,
350              libgpiod,
351              phosphorlogging,
352              sdbusplus,
353              sdeventplus,
354          ],
355          implicit_include_directories: true,
356          include_directories: '../'
357      )
358  )
359
360  test(
361      'test_hypervisor_state',
362      executable('test_hypervisor_state',
363          './test/hypervisor_state.cpp',
364          'hypervisor_state_manager.cpp',
365          dependencies: [
366              gtest,
367              phosphorlogging,
368              sdbusplus,
369              sdeventplus,
370          ],
371          implicit_include_directories: true,
372          include_directories: '../'
373      )
374  )
375endif
376