1project('phosphor-bmc-code-mgmt', 'cpp', 2 default_options: [ 3 'buildtype=debugoptimized', 4 'cpp_std=c++20', 5 'warning_level=3', 6 'werror=true' 7 ], 8 meson_version: '>= 0.57.0', 9 license: 'Apache-2.0', 10 version: '1.0') 11 12add_project_arguments( 13 '-DBOOST_SYSTEM_NO_DEPRECATED', 14 '-DBOOST_ERROR_CODE_HEADER_ONLY', 15 '-DBOOST_NO_RTTI', 16 '-DBOOST_NO_TYPEID', 17 '-DBOOST_ALL_NO_LIB', 18 '-DBOOST_ASIO_DISABLE_THREADS', 19 '-DBOOST_ASIO_NO_DEPRECATED', 20 language: 'cpp', 21) 22 23cpp = meson.get_compiler('cpp') 24 25conf = configuration_data() 26 27# DBus information 28conf.set_quoted('BMC_INVENTORY_INTERFACE', 'xyz.openbmc_project.Inventory.Item.Bmc') 29conf.set_quoted('BUSNAME_UPDATER', 'xyz.openbmc_project.Software.BMC.Updater') 30conf.set_quoted('DOWNLOAD_BUSNAME', 'xyz.openbmc_project.Software.Download') 31conf.set_quoted('FILEPATH_IFACE', 'xyz.openbmc_project.Common.FilePath') 32conf.set_quoted('INVENTORY_PATH', '/xyz/openbmc_project/inventory/') 33conf.set_quoted('MAPPER_BUSNAME', 'xyz.openbmc_project.ObjectMapper') 34conf.set_quoted('MAPPER_INTERFACE', 'xyz.openbmc_project.ObjectMapper') 35conf.set_quoted('MAPPER_PATH', '/xyz/openbmc_project/object_mapper') 36conf.set_quoted('SOFTWARE_OBJPATH', '/xyz/openbmc_project/software') 37conf.set_quoted('SYSTEMD_BUSNAME', 'org.freedesktop.systemd1') 38conf.set_quoted('SYSTEMD_PATH', '/org/freedesktop/systemd1') 39conf.set_quoted('SYSTEMD_INTERFACE', 'org.freedesktop.systemd1.Manager') 40conf.set_quoted('VERSION_BUSNAME', 'xyz.openbmc_project.Software.Version') 41conf.set_quoted('VERSION_IFACE', 'xyz.openbmc_project.Software.Version') 42conf.set_quoted('EXTENDED_VERSION_IFACE', 'xyz.openbmc_project.Software.ExtendedVersion') 43 44# Names of the forward and reverse associations 45conf.set_quoted('ACTIVATION_FWD_ASSOCIATION', 'inventory') 46conf.set_quoted('ACTIVATION_REV_ASSOCIATION', 'activation') 47conf.set_quoted('ACTIVE_FWD_ASSOCIATION', 'active') 48conf.set_quoted('ACTIVE_REV_ASSOCIATION', 'software_version') 49conf.set_quoted('FUNCTIONAL_FWD_ASSOCIATION', 'functional') 50conf.set_quoted('FUNCTIONAL_REV_ASSOCIATION', 'software_version') 51conf.set_quoted('UPDATEABLE_FWD_ASSOCIATION', 'updateable') 52conf.set_quoted('UPDATEABLE_REV_ASSOCIATION', 'software_version') 53 54# Filesystem files and directories 55# The path of the alt rwfs overlay 56conf.set_quoted('ALT_RWFS', '/media/alt/var/persist') 57# The prefix path for the versioned read-only bmc partitions 58conf.set_quoted('BMC_ROFS_PREFIX', get_option('media-dir') + '/rofs-') 59# The name of the BMC table of contents file 60conf.set_quoted('OS_RELEASE_FILE', '/etc/os-release') 61# The dir where activation data is stored in files 62conf.set_quoted('PERSIST_DIR', '/var/lib/phosphor-bmc-code-mgmt/') 63 64# Supported BMC layout types 65conf.set('STATIC_LAYOUT', get_option('bmc-layout').contains('static')) 66conf.set('UBIFS_LAYOUT', get_option('bmc-layout').contains('ubi')) 67conf.set('MMC_LAYOUT', get_option('bmc-layout').contains('mmc')) 68 69# Configurable features 70conf.set('HOST_BIOS_UPGRADE', get_option('host-bios-upgrade').enabled()) 71conf.set('WANT_SIGNATURE_VERIFY', \ 72 get_option('verify-signature').enabled() or \ 73 get_option('verify-full-signature').enabled()) 74conf.set('WANT_SIGNATURE_FULL_VERIFY', get_option('verify-full-signature').enabled()) 75 76# Configurable variables 77conf.set('ACTIVE_BMC_MAX_ALLOWED', get_option('active-bmc-max-allowed')) 78conf.set_quoted('HASH_FILE_NAME', get_option('hash-file-name')) 79conf.set_quoted('IMG_UPLOAD_DIR', get_option('img-upload-dir')) 80conf.set_quoted('MANIFEST_FILE_NAME', get_option('manifest-file-name')) 81conf.set_quoted('MEDIA_DIR', get_option('media-dir')) 82optional_array = get_option('optional-images') 83optional_images = '' 84foreach optiona_image : optional_array 85 optional_images = ' '.join([optional_images, optiona_image]) 86endforeach 87conf.set_quoted('OPTIONAL_IMAGES', optional_images) 88conf.set_quoted('PUBLICKEY_FILE_NAME', get_option('publickey-file-name')) 89conf.set_quoted('SIGNATURE_FILE_EXT', get_option('signature-file-ext')) 90conf.set_quoted('SIGNED_IMAGE_CONF_PATH', get_option('signed-image-conf-path')) 91conf.set_quoted('SYNC_LIST_DIR_PATH', get_option('sync-list-dir-path')) 92conf.set_quoted('SYNC_LIST_FILE_NAME', get_option('sync-list-file-name')) 93conf.set_quoted('BMC_MSL', get_option('bmc-msl')) 94conf.set_quoted('REGEX_BMC_MSL', get_option('regex-bmc-msl')) 95 96if get_option('host-bios-upgrade').enabled() 97 conf.set_quoted('BIOS_OBJPATH', get_option('bios-object-path')) 98endif 99 100configure_file(output: 'config.h', configuration: conf) 101 102sdbusplus_dep = dependency('sdbusplus', required: false) 103sdbusplus_proj = dependency('', required: false) 104if not sdbusplus_dep.found() or sdbusplus_dep.type_name() == 'internal' 105 sdbusplus_proj = subproject('sdbusplus') 106endif 107if not sdbusplus_dep.found() 108 sdbusplus_dep = sdbusplus_proj.get_variable('sdbusplus_dep') 109endif 110 111if sdbusplus_proj.found() 112 sdbusplusplus_prog = sdbusplus_proj.get_variable('sdbusplusplus_prog') 113 sdbuspp_gen_meson_prog = sdbusplus_proj.get_variable( 114 'sdbuspp_gen_meson_prog') 115else 116 sdbusplusplus_prog = find_program('sdbus++', native: true) 117 sdbuspp_gen_meson_prog = find_program('sdbus++-gen-meson', native: true) 118endif 119 120cereal_dep = dependency('cereal', required: false) 121has_cereal = cpp.has_header_symbol( 122 'cereal/cereal.hpp', 123 'cereal::specialize', 124 dependencies: cereal_dep, 125 required: false) 126if not has_cereal 127 cereal_opts = import('cmake').subproject_options() 128 cereal_opts.add_cmake_defines({'BUILD_TESTS': 'OFF'}) 129 cereal_proj = import('cmake').subproject( 130 'cereal', 131 options: cereal_opts, 132 required: false) 133 assert(cereal_proj.found(), 'cereal is required') 134 cereal_dep = cereal_proj.dependency('cereal') 135endif 136 137deps = [ 138 dependency( 139 'phosphor-dbus-interfaces', 140 fallback: ['phosphor-dbus-interfaces', 'phosphor_dbus_interfaces_dep'], 141 ), 142 dependency( 143 'phosphor-logging', 144 fallback: ['phosphor-logging', 'phosphor_logging_dep'], 145 ), 146 sdbusplus_dep, 147 cereal_dep, 148] 149 150ssl = dependency('openssl') 151 152systemd = dependency('systemd') 153systemd_system_unit_dir = systemd.get_pkgconfig_variable('systemdsystemunitdir') 154 155unit_files = [ 156 'obmc-flash-bmc-setenv@.service.in', 157 'reboot-guard-disable.service.in', 158 'reboot-guard-enable.service.in', 159 'force-reboot.service.in', 160 'usr-local.mount.in', 161 'xyz.openbmc_project.Software.BMC.Updater.service.in', 162 'xyz.openbmc_project.Software.Download.service.in', 163 'xyz.openbmc_project.Software.Sync.service.in', 164 'xyz.openbmc_project.Software.Version.service.in' 165] 166 167subdir('xyz/openbmc_project/Software/Image') 168 169image_updater_sources = files( 170 'activation.cpp', 171 'images.cpp', 172 'item_updater.cpp', 173 'item_updater_main.cpp', 174 'serialize.cpp', 175 'version.cpp', 176 'utils.cpp', 177 'msl_verify.cpp' 178) 179 180if get_option('bmc-layout').contains('static') 181 image_updater_sources += files( 182 'static/flash.cpp', 183 'static/item_updater_helper.cpp' 184 ) 185elif get_option('bmc-layout').contains('ubi') 186 image_updater_sources += files( 187 'ubi/flash.cpp', 188 'ubi/item_updater_helper.cpp' 189 ) 190 191 unit_files += [ 192 'ubi/obmc-flash-bmc-cleanup.service.in', 193 'ubi/obmc-flash-bmc-mirroruboot.service.in', 194 'ubi/obmc-flash-bmc-ubiremount.service.in', 195 'ubi/obmc-flash-bmc-ubiro@.service.in', 196 'ubi/obmc-flash-bmc-ubiro-remove@.service.in', 197 'ubi/obmc-flash-bmc-ubirw.service.in', 198 'ubi/obmc-flash-bmc-ubirw-remove.service.in', 199 'ubi/obmc-flash-bmc-updateubootvars@.service.in' 200 ] 201elif get_option('bmc-layout').contains('mmc') 202 image_updater_sources += files( 203 'mmc/flash.cpp', 204 'mmc/item_updater_helper.cpp' 205 ) 206 207 unit_files += [ 208 'mmc/obmc-flash-mmc@.service.in', 209 'mmc/obmc-flash-mmc-mount.service.in', 210 'mmc/obmc-flash-mmc-remove@.service.in', 211 'mmc/obmc-flash-mmc-setprimary@.service.in', 212 'mmc/obmc-flash-mmc-umount.service.in', 213 ] 214endif 215 216if get_option('host-bios-upgrade').enabled() 217 unit_files += 'obmc-flash-host-bios@.service.in' 218endif 219 220if get_option('sync-bmc-files').enabled() 221 executable( 222 'phosphor-sync-software-manager', 223 'sync_manager.cpp', 224 'sync_manager_main.cpp', 225 'sync_watch.cpp', 226 dependencies: deps, 227 install: true 228 ) 229 230 install_data('synclist', 231 install_dir: get_option('sysconfdir') 232 ) 233endif 234 235if (get_option('verify-signature').enabled() or \ 236 get_option('verify-full-signature').enabled()) 237 image_updater_sources += files( 238 'utils.cpp', 239 'image_verify.cpp', 240 'openssl_alloc.cpp' 241 ) 242endif 243 244executable( 245 'phosphor-download-manager', 246 'download_manager.cpp', 247 'download_manager_main.cpp', 248 dependencies: deps, 249 install: true 250) 251 252executable( 253 'phosphor-image-updater', 254 image_error_cpp, 255 image_error_hpp, 256 image_updater_sources, 257 dependencies: [deps, ssl], 258 install: true 259) 260 261executable( 262 'phosphor-version-software-manager', 263 image_error_cpp, 264 image_error_hpp, 265 'image_manager.cpp', 266 'image_manager_main.cpp', 267 'version.cpp', 268 'watch.cpp', 269 dependencies: [deps, ssl], 270 install: true 271) 272 273install_data('obmc-flash-bmc', 274 install_mode: 'rwxr-xr-x', 275 install_dir: get_option('bindir') 276) 277 278install_data('software.conf', 279 install_dir: '/usr/lib/tmpfiles.d/' 280) 281 282foreach u : unit_files 283 configure_file( 284 input: u, 285 output: '@BASENAME@', 286 configuration: conf, 287 install: true, 288 install_dir: systemd_system_unit_dir, 289 ) 290endforeach 291 292# If test coverage of source files within the root directory are wanted, 293# need to define and build the tests from here 294build_tests = get_option('tests') 295if not build_tests.disabled() 296 oe_sdk = get_option('oe-sdk') 297 if oe_sdk.enabled() 298 # Setup OE SYSROOT 299 OECORE_TARGET_SYSROOT = run_command('sh', '-c', 'echo $OECORE_TARGET_SYSROOT').stdout().strip() 300 if OECORE_TARGET_SYSROOT == '' 301 error('Unable to get $OECORE_TARGET_SYSROOT, check your environment.') 302 endif 303 message('OE_SYSROOT: ' + OECORE_TARGET_SYSROOT) 304 rpath = ':'.join([OECORE_TARGET_SYSROOT + '/lib', OECORE_TARGET_SYSROOT + '/usr/lib']) 305 ld_so = run_command('sh', '-c', 'find ' + OECORE_TARGET_SYSROOT + '/lib/ld-*.so | sort -r -n | head -n1').stdout().strip() 306 dynamic_linker = ['-Wl,-dynamic-linker,' + ld_so] 307 else 308 dynamic_linker = [] 309 endif 310 311 gtest = dependency('gtest', main: true, disabler: true, required: build_tests) 312 include_srcs = declare_dependency(sources: [ 313 'utils.cpp', 314 'image_verify.cpp', 315 'images.cpp', 316 'version.cpp'] 317 ) 318 319 test('utest', 320 executable( 321 'utest', 322 './test/utest.cpp', 323 link_args: dynamic_linker, 324 build_rpath: get_option('oe-sdk').enabled() ? rpath : '', 325 dependencies: [deps, gtest, include_srcs, ssl] 326 ) 327) 328endif 329 330if get_option('usb-code-update').enabled() 331 subdir('usb') 332endif 333