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