1project( 2 'phosphor-host-ipmid', 3 'cpp', 4 version: '0.1', 5 meson_version: '>=1.1.1', 6 default_options: [ 7 'werror=true', 8 'warning_level=3', 9 'cpp_std=c++23', 10 'b_lto=true', 11 ], 12) 13 14# Setting up config data 15conf_data = configuration_data() 16 17# The name of the callout's forward association 18conf_data.set_quoted('CALLOUT_FWD_ASSOCIATION', 'callout') 19conf_data.set_quoted('BOARD_SENSOR', get_option('board-sensor')) 20conf_data.set_quoted('SYSTEM_SENSOR', get_option('system-sensor')) 21conf_data.set( 22 'IPMI_SMS_ATN_ACK_TIMEOUT_SECS', 23 get_option('ipmi-sms-atn-ack-timeout-secs'), 24) 25 26# Soft Power off related. 27if get_option('softoff').allowed() 28 conf_data.set_quoted('SOFTOFF_BUSNAME', get_option('softoff-busname')) 29 conf_data.set_quoted('SOFTOFF_OBJPATH', get_option('softoff-objpath')) 30 conf_data.set( 31 'IPMI_HOST_SHUTDOWN_COMPLETE_TIMEOUT_SECS', 32 get_option('ipmi-host-shutdown-complete-timeout-secs'), 33 ) 34 conf_data.set_quoted( 35 'HOST_INBAND_REQUEST_DIR', 36 get_option('host-inband-request-dir'), 37 ) 38 conf_data.set_quoted( 39 'HOST_INBAND_REQUEST_FILE', 40 get_option('host-inband-request-file'), 41 ) 42endif 43 44conf_data.set_quoted('CONTROL_HOST_BUSNAME', get_option('control-host-busname')) 45conf_data.set_quoted('CONTROL_HOST_OBJ_MGR', get_option('control-host-obj-mgr')) 46conf_data.set_quoted('HOST_NAME', get_option('host-name')) 47conf_data.set_quoted('POWER_READING_SENSOR', get_option('power-reading-sensor')) 48conf_data.set_quoted('HOST_IPMI_LIB_PATH', get_option('host-ipmi-lib-path')) 49conf_data.set_quoted('FW_VER_REGEX', get_option('fw-ver-regex')) 50 51if get_option('shortname-remove-suffix').allowed() 52 conf_data.set_quoted('SHORTNAME_REMOVE_SUFFIX', '1') 53endif 54if get_option('shortname-replace-words').allowed() 55 conf_data.set_quoted('SHORTNAME_REPLACE_WORDS', '1') 56endif 57if get_option('open-power').allowed() 58 conf_data.set_quoted('OPEN_POWER_SUPPORT', '1') 59endif 60 61matches_map = get_option('matches-map') 62conf_data.set('MAJOR_MATCH_INDEX', matches_map[0]) 63conf_data.set('MINOR_MATCH_INDEX', matches_map[1]) 64conf_data.set('AUX_0_MATCH_INDEX', matches_map[2]) 65conf_data.set('AUX_1_MATCH_INDEX', matches_map[3]) 66conf_data.set('AUX_2_MATCH_INDEX', matches_map[4]) 67conf_data.set('AUX_3_MATCH_INDEX', matches_map[5]) 68 69conf_h = configure_file(output: 'config.h', configuration: conf_data) 70 71root = meson.current_source_dir() 72root_inc = include_directories('.', 'include') 73 74# Project Arguments 75cpp = meson.get_compiler('cpp') 76add_project_arguments( 77 cpp.get_supported_arguments( 78 [ 79 '-DBOOST_ERROR_CODE_HEADER_ONLY', 80 '-DBOOST_SYSTEM_NO_DEPRECATED', 81 '-DBOOST_COROUTINES_NO_DEPRECATION_WARNING', 82 '-DBOOST_ASIO_DISABLE_THREADS', 83 '-DBOOST_ALL_NO_LIB', 84 ], 85 ), 86 language: 'cpp', 87) 88 89if get_option('get-dbus-active-software').allowed() 90 add_project_arguments( 91 cpp.get_supported_arguments(['-DGET_DBUS_ACTIVE_SOFTWARE']), 92 language: 'cpp', 93 ) 94endif 95 96feature_map = { 97 'boot-flag-safe-mode-support': '-DENABLE_BOOT_FLAG_SAFE_MODE_SUPPORT', 98 'i2c-whitelist-check' : '-DENABLE_I2C_WHITELIST_CHECK', 99 'update-functional-on-fail' : '-DUPDATE_FUNCTIONAL_ON_FAIL', 100 'dynamic-sensors' : '-DFEATURE_DYNAMIC_SENSORS', 101 'dynamic-sensors-write' : '-DFEATURE_DYNAMIC_SENSORS_WRITE', 102 'entity-manager-decorators' : '-DUSING_ENTITY_MANAGER_DECORATORS', 103 'hybrid-sensors' : '-DFEATURE_HYBRID_SENSORS', 104 'sensors-cache' : '-DFEATURE_SENSORS_CACHE', 105 'dynamic-storages-only' : '-DFEATURE_DYNAMIC_STORAGES_ONLY', 106} 107 108foreach option_key, option_value : feature_map 109 if (get_option(option_key).allowed()) 110 summary(option_key, option_value, section: 'Enabled Features') 111 add_project_arguments(option_value, language: 'cpp') 112 endif 113endforeach 114 115add_project_arguments( 116 cpp.get_supported_arguments( 117 [ 118 '-Wno-psabi', 119 '-Wno-missing-field-initializers', 120 '-Wno-pedantic', 121 '-Wno-non-virtual-dtor', 122 ], 123 ), 124 language: 'cpp', 125) 126 127# Dependencies 128 129boost = dependency('boost', modules: ['coroutine'], required: false) 130 131if not boost.found() 132 cmake = import('cmake') 133 opt = cmake.subproject_options() 134 opt.add_cmake_defines( 135 { 136 'BOOST_INCLUDE_LIBRARIES': 'asio;bimap;callable_traits;context;coroutine;interprocess;multiprecision;process', 137 'CMAKE_POSITION_INDEPENDENT_CODE': true, 138 }, 139 ) 140 boost_cmake = cmake.subproject('boost', required: true, options: opt) 141 boost_asio = boost_cmake.dependency('boost_asio').as_system() 142 boost_bimap = boost_cmake.dependency('boost_bimap').as_system() 143 boost_callable_traits = boost_cmake.dependency('boost_callable_traits').as_system() 144 boost_context = boost_cmake.dependency('boost_context').as_system() 145 boost_coroutine = boost_cmake.dependency('boost_coroutine').as_system() 146 boost_interprocess = boost_cmake.dependency('boost_interprocess').as_system() 147 boost_multiprecision = boost_cmake.dependency('boost_multiprecision').as_system() 148 boost_process = boost_cmake.dependency('boost_process').as_system() 149 boost = [ 150 boost_asio, 151 boost_bimap, 152 boost_callable_traits, 153 boost_context, 154 boost_coroutine, 155 boost_interprocess, 156 boost_multiprecision, 157 boost_process, 158 ] 159endif 160 161phosphor_logging_dep = dependency('phosphor-logging') 162phosphor_dbus_interfaces_dep = dependency('phosphor-dbus-interfaces') 163sdeventplus_dep = dependency('sdeventplus') 164libsystemd_dep = dependency('libsystemd') 165crypto = dependency('libcrypto', version: '>=1.0.2g') 166pam = cpp.find_library('pam', required: true) 167sdbusplus_dep = dependency('sdbusplus') 168stdplus_dep = dependency('stdplus') 169 170nlohmann_json_dep = dependency('nlohmann_json', include_type: 'system') 171 172generated_src = [] 173 174# Subfolders 175subdir('libipmid') 176subdir('include') 177subdir('user_channel') 178subdir('scripts') 179 180if get_option('softoff').allowed() 181 subdir('xyz/openbmc_project/Ipmi/Internal/SoftPowerOff') 182 subdir('softoff') 183endif 184 185# whitelist 186if get_option('ipmi-whitelist').allowed() 187 generate_whitelist_script = files('generate_whitelist_create.sh') 188 189 whitelist_conf = get_option('whitelist-conf') 190 ipmiwhitelist = run_command( \ 191 'bash', \ 192 generate_whitelist_script, \ 193 whitelist_conf, 194 ) 195 196 whitelist_pre = declare_dependency( 197 include_directories: root_inc, 198 dependencies: [ 199 crypto, 200 ipmid_dep, 201 phosphor_dbus_interfaces_dep, 202 phosphor_logging_dep, 203 sdbusplus_dep, 204 ], 205 ) 206 207 whitelist_lib = library( 208 'whitelist', 209 'whitelist-filter.cpp', 210 'ipmiwhitelist.cpp', 211 implicit_include_directories: false, 212 dependencies: whitelist_pre, 213 version: meson.project_version(), 214 override_options: ['b_lundef=false'], 215 install: true, 216 install_dir: get_option('libdir') / 'ipmid-providers', 217 ) 218endif 219 220# libsysintfcmds 221sysintfcmds_pre = declare_dependency( 222 include_directories: root_inc, 223 dependencies: [ 224 channellayer_dep, 225 crypto, 226 nlohmann_json_dep, 227 phosphor_dbus_interfaces_dep, 228 phosphor_logging_dep, 229 sdbusplus_dep, 230 ipmid_dep, 231 ], 232) 233 234sysintfcmds_lib = library( 235 'sysintfcmds', 236 'systemintfcmds.cpp', 237 'host-interface.cpp', 238 implicit_include_directories: false, 239 dependencies: sysintfcmds_pre, 240 version: meson.project_version(), 241 override_options: ['b_lundef=false'], 242 install: true, 243 install_dir: get_option('libdir') / 'ipmid-providers', 244) 245 246# ipmid 247ipmid_pre = [ 248 sdbusplus_dep, 249 stdplus_dep, 250 phosphor_logging_dep, 251 phosphor_dbus_interfaces_dep, 252 boost, 253 crypto, 254 ipmid_dep, 255 channellayer_dep, 256] 257 258transportoem_src = [] 259if get_option('transport-oem').allowed() 260 transportoem_src = ['transporthandler_oem.cpp'] 261endif 262 263storage_cmds_src = [] 264if get_option('dynamic-sensors').disabled() and not get_option( 265 'dynamic-storages-only', 266).disabled() 267 storage_cmds_src = ['dbus-sdr/storagecommands.cpp', 'dbus-sdr/sdrutils.cpp'] 268endif 269 270openpower_cmds_src = [] 271if get_option('open-power').allowed() 272 openpower_cmds_src = ['storageaddsel.cpp'] 273endif 274 275libipmi20_src = [ 276 'app/channel.cpp', 277 'app/watchdog.cpp', 278 'app/watchdog_service.cpp', 279 'apphandler.cpp', 280 'sys_info_param.cpp', 281 'sensorhandler.cpp', 282 'storagehandler.cpp', 283 'chassishandler.cpp', 284 'dcmihandler.cpp', 285 'ipmisensor.cpp', 286 'transporthandler.cpp', 287 'globalhandler.cpp', 288 'groupext.cpp', 289 'selutility.cpp', 290 'ipmi_fru_info_area.cpp', 291 'read_fru_data.cpp', 292 'sensordatahandler.cpp', 293 'user_channel/channelcommands.cpp', 294 generated_src, 295 transportoem_src, 296 storage_cmds_src, 297 openpower_cmds_src, 298 conf_h, 299] 300 301ipmi20_lib = library( 302 'ipmi20', 303 libipmi20_src, 304 dependencies: [ipmid_pre, nlohmann_json_dep], 305 include_directories: root_inc, 306 install: true, 307 install_dir: get_option('libdir') / 'ipmid-providers', 308 version: meson.project_version(), 309 override_options: ['b_lundef=false'], 310) 311 312libipmi20_dep = declare_dependency( 313 dependencies: ipmid_pre, 314 include_directories: root_inc, 315 link_with: ipmi20_lib, 316) 317 318# ipmid binary 319executable( 320 'ipmid', 321 'ipmid-new.cpp', 322 'host-cmd-manager.cpp', 323 'settings.cpp', 324 implicit_include_directories: false, 325 dependencies: [libipmi20_dep], 326 include_directories: root_inc, 327 export_dynamic: true, 328 install: true, 329 install_dir: get_option('bindir'), 330) 331 332# Dynamic Sensor Stack 333subdir('dbus-sdr') 334 335if get_option('dynamic-sensors').disabled() or not get_option('tests').allowed() 336 library( 337 'dynamiccmds', 338 dbus_sdr_src, 339 implicit_include_directories: false, 340 dependencies: dbus_sdr_pre, 341 version: meson.project_version(), 342 override_options: ['b_lundef=false'], 343 install: true, 344 install_dir: get_option('libdir') / 'ipmid-providers', 345 ) 346endif 347 348if get_option('tests').allowed() 349 subdir('test') 350 subdir('transport/serialbridge') 351endif 352 353install_subdir( 354 'user_channel', 355 install_dir: get_option('includedir'), 356 strip_directory: false, 357 exclude_files: '*.cpp', 358) 359 360# HW Transport 361subdir('transport') 362