1# SPDX-License-Identifier: Apache-2.0
2
3project('phosphor-debug-collector',
4        'cpp',
5        meson_version: '>=1.1.1',
6        default_options: [
7                          'cpp_std=c++23',
8                          'warning_level=3',
9                          'werror=true',
10                          'buildtype=debugoptimized'
11                         ],
12        version: '1.0',
13        license: 'Apache-2.0'
14       )
15
16cpp = meson.get_compiler('cpp')
17
18# list of unit files, the path as input and service name
19# as output
20# eg: unit_file += {'input:'<path>, 'output':<service name>}
21unit_files = []
22
23# Checking dependency external library
24
25libsystemd = dependency('libsystemd', version : '>=221')
26
27sdbusplus_dep = dependency('sdbusplus')
28sdbusplusplus_prog = find_program('sdbus++')
29sdbuspp_gen_meson_prog = find_program('sdbus++-gen-meson')
30sdeventplus_dep = dependency('sdeventplus')
31
32phosphor_dbus_interfaces_dep = dependency('phosphor-dbus-interfaces')
33phosphor_logging_dep = dependency('phosphor-logging')
34
35# Get Cereal dependency.
36cereal_dep = dependency('cereal', required: false)
37has_cereal = cpp.has_header_symbol(
38    'cereal/cereal.hpp',
39    'cereal::specialize',
40    dependencies: cereal_dep,
41    required: false)
42if not has_cereal
43    cereal_opts = import('cmake').subproject_options()
44    cereal_opts.add_cmake_defines({'BUILD_TESTS': 'OFF'})
45    cereal_proj = import('cmake').subproject(
46        'cereal',
47        options: cereal_opts,
48        required: false)
49    assert(cereal_proj.found(), 'cereal is required')
50    cereal_dep = cereal_proj.dependency('cereal')
51endif
52
53# Disable FORTIFY_SOURCE when compiling with no optimization
54if(get_option('optimization') == '0')
55  add_project_arguments('-U_FORTIFY_SOURCE',language:['cpp','c'])
56  message('Disabling FORTIFY_SOURCE as optimization is set to 0')
57endif
58
59# Configuration header file(config.h) generation
60
61conf_data = configuration_data()
62
63conf_data.set_quoted('DUMP_BUSNAME', get_option('DUMP_BUSNAME'),
64                      description : 'The Dbus busname to own'
65                    )
66conf_data.set_quoted('DUMP_OBJPATH', get_option('DUMP_OBJPATH'),
67                      description : 'The Dump manager Dbus root'
68                    )
69conf_data.set_quoted('BMC_DUMP_OBJPATH', get_option('BMC_DUMP_OBJPATH'),
70                      description : 'The BMC Dump manager Dbus path'
71                    )
72conf_data.set_quoted('CORE_FILE_DIR', get_option('CORE_FILE_DIR'),
73                      description : 'Directory where core dumps are placed'
74                    )
75conf_data.set_quoted('OBJ_INTERNAL', get_option('OBJ_INTERNAL'),
76                      description : 'Internal Dump manager Dbus object path'
77                    )
78conf_data.set_quoted('BMC_DUMP_OBJ_ENTRY', get_option('BMC_DUMP_OBJ_ENTRY'),
79                      description : 'The BMC dump entry DBus object path'
80                    )
81conf_data.set_quoted('BMC_DUMP_PATH', get_option('BMC_DUMP_PATH'),
82                     description : 'Directory where bmc dumps are placed')
83conf_data.set_quoted('SYSTEMD_PSTORE_PATH', get_option('SYSTEMD_PSTORE_PATH'),
84                     description : 'Path to the systemd pstore directory')
85conf_data.set('BMC_DUMP_MAX_SIZE', get_option('BMC_DUMP_MAX_SIZE'),
86               description : 'Maximum size of one bmc dump in kilo bytes'
87             )
88conf_data.set('BMC_DUMP_MIN_SPACE_REQD', get_option('BMC_DUMP_MIN_SPACE_REQD'),
89               description : 'Minimum space required for one bmc dump in kilo bytes'
90             )
91conf_data.set('BMC_DUMP_TOTAL_SIZE', get_option('BMC_DUMP_TOTAL_SIZE'),
92               description : 'Total size of the dump in kilo bytes'
93             )
94conf_data.set_quoted('OBJ_LOGGING', '/xyz/openbmc_project/logging',
95                      description : 'The log manager DBus object path'
96                    )
97conf_data.set_quoted('ELOG_ID_PERSIST_PATH', get_option('ELOG_ID_PERSIST_PATH'),
98                      description : 'Path of file for storing elog id\'s, which have associated dumps'
99                    )
100conf_data.set('CLASS_VERSION', get_option('CLASS_VERSION'),
101               description : 'Class version to register with Cereal'
102             )
103conf_data.set('ERROR_MAP_YAML', get_option('ERROR_MAP_YAML'),
104               description : 'YAML filepath containing error object paths'
105             )
106conf_data.set('JFFS_CORE_FILE_WORKAROUND', get_option('jffs-workaround').enabled(),
107               description : 'Turn on jffs workaround for core file'
108             )
109conf_data.set_quoted('FAULTLOG_DUMP_OBJ_ENTRY', get_option('FAULTLOG_DUMP_OBJ_ENTRY'),
110                      description : 'The Fault Log dump entry DBus object path'
111                    )
112conf_data.set_quoted('FAULTLOG_DUMP_OBJPATH', get_option('FAULTLOG_DUMP_OBJPATH'),
113                      description : 'The Fault Log Dump manager Dbus path'
114                    )
115conf_data.set_quoted('FAULTLOG_DUMP_PATH', get_option('FAULTLOG_DUMP_PATH'),
116                      description : 'Directory where fault logs are placed'
117                    )
118conf_data.set('BMC_DUMP_ROTATE_CONFIG', get_option('dump_rotate_config').enabled(),
119               description : 'Turn on rotate config for bmc dump'
120             )
121
122configure_file(configuration : conf_data,
123               output : 'config.h'
124              )
125subdir('xyz/openbmc_project/Dump/Internal/Create')
126
127python = find_program('python3')
128errors_map_gen_file_loc = meson.project_source_root()
129errors_map_gen_file_loc += '/errors_map_gen.py'
130
131errors_map_cpp = custom_target(
132                    'errors_map.cpp',
133                    command : [
134                        python,
135                        errors_map_gen_file_loc,
136                        '-i',
137                        get_option('ERROR_MAP_YAML')
138                    ],
139                    depend_files : [ 'errors_map.mako.cpp',
140                                     'errors_map_gen.py',
141                                     get_option('ERROR_MAP_YAML')
142                                   ],
143                    output : 'errors_map.cpp'
144                 )
145
146phosphor_dump_manager_sources = [
147        'dump_entry.cpp',
148        'dump_manager.cpp',
149        'dump_manager_bmc.cpp',
150        'dump_manager_main.cpp',
151        'dump_serialize.cpp',
152        'elog_watch.cpp',
153        errors_map_cpp,
154        common_hpp,
155        server_hpp,
156        server_cpp,
157        'watch.cpp',
158        'bmc_dump_entry.cpp',
159        'dump_utils.cpp',
160        'dump_offload.cpp',
161        'dump_manager_faultlog.cpp',
162        'faultlog_dump_entry.cpp',
163        'dump_types.cpp'
164    ]
165
166phosphor_dump_manager_dependency = [
167        phosphor_dbus_interfaces_dep,
168        sdbusplus_dep,
169        sdeventplus_dep,
170        phosphor_logging_dep,
171        cereal_dep,
172    ]
173
174phosphor_dump_manager_install = true
175
176phosphor_dump_manager_incdir = []
177
178# To get host transport based interface to take respective host
179# dump actions. It will contain required sources and dependency
180# list for phosphor_dump_manager.
181subdir('host-transport-extensions')
182
183#pick any architecture specific dumps
184subdir('dump-extensions')
185
186phosphor_dump_monitor_sources = [
187        'core_manager.cpp',
188        'core_manager_main.cpp',
189        'watch.cpp'
190    ]
191
192phosphor_dump_monitor_dependency = [
193        phosphor_dbus_interfaces_dep,
194        phosphor_logging_dep
195    ]
196
197phosphor_dump_monitor_install = true
198
199phosphor_dump_monitor_incdir = []
200
201phosphor_ramoops_monitor_sources = [
202        'ramoops_manager.cpp',
203        'ramoops_manager_main.cpp',
204        'watch.cpp'
205    ]
206
207phosphor_ramoops_monitor_dependency = [
208        phosphor_dbus_interfaces_dep,
209        phosphor_logging_dep
210    ]
211
212phosphor_ramoops_monitor_install = true
213
214phosphor_ramoops_monitor_incdir = []
215
216executables = [[ 'phosphor-dump-manager',
217                  phosphor_dump_manager_sources,
218                  phosphor_dump_manager_dependency,
219                  phosphor_dump_manager_install,
220                  phosphor_dump_manager_incdir
221               ],
222               [ 'phosphor-dump-monitor',
223                  phosphor_dump_monitor_sources,
224                  phosphor_dump_monitor_dependency,
225                  phosphor_dump_monitor_install,
226                  phosphor_dump_monitor_incdir
227               ],
228               [ 'phosphor-ramoops-monitor',
229                  phosphor_ramoops_monitor_sources,
230                  phosphor_ramoops_monitor_dependency,
231                  phosphor_ramoops_monitor_install,
232                  phosphor_ramoops_monitor_incdir
233               ]
234              ]
235
236foreach executable : executables
237    binary = executable(
238                        executable[0],
239                        executable[1],
240                        dependencies: executable[2],
241                        install : executable[3],
242                        include_directories : executable[4]
243                       )
244endforeach
245
246unit_subs = configuration_data()
247unit_subs.set('bindir', join_paths(get_option('prefix'), get_option('bindir')))
248systemd_system_unit_dir = dependency('systemd').get_variable(
249    'systemdsystemunitdir',
250    pkgconfig_define: ['prefix', get_option('prefix')])
251foreach u : unit_files
252    configure_file(
253        configuration: unit_subs,
254        input: u.get('input'),
255        install: true,
256        install_dir: systemd_system_unit_dir,
257        output: u.get('output')
258    )
259endforeach
260
261if get_option('tests').enabled()
262  subdir('test')
263endif
264