project( 'openpower-vpd-parser', 'c', 'cpp', default_options: [ 'warning_level=3', 'werror=true', 'cpp_std=c++23', 'buildtype=debugoptimized' ], version: '1.0', meson_version: '>=1.1.1', ) add_global_arguments('-Wno-psabi', language : ['c', 'cpp']) # Disable FORTIFY_SOURCE when compiling with no optimization if(get_option('optimization') == '0') add_project_arguments('-U_FORTIFY_SOURCE',language:['cpp','c']) message('Disabling FORTIFY_SOURCE as optimization is set to 0') endif # Setup googletest before we import any projects that also depend on it to make # sure we have control over its configuration build_tests = get_option('tests') if not build_tests.disabled() gtest_dep = dependency('gtest', main: true, disabler: true, required: false) gmock_dep = dependency('gmock', disabler: true, required: false) if not gtest_dep.found() or not gmock_dep.found() cmake = import('cmake') gtest_opts = cmake.subproject_options() gtest_opts.set_override_option('warning_level', '1') gtest_opts.set_override_option('werror', 'false') gtest_proj = cmake.subproject('googletest', options: gtest_opts, required: false) if gtest_proj.found() gtest_dep = declare_dependency( dependencies: [ dependency('threads'), gtest_proj.dependency('gtest'), gtest_proj.dependency('gtest_main'), ] ) gmock_dep = gtest_proj.dependency('gmock') else assert(not get_option('tests').enabled(), 'Googletest is required if tests are enabled') endif endif endif phosphor_dbus_interfaces = dependency('phosphor-dbus-interfaces', default_options: [ 'data_com_ibm=true', 'data_org_open_power=true' ], fallback: ['phosphor-dbus-interfaces', 'phosphor_dbus_interfaces_dep']) phosphor_logging = dependency('phosphor-logging', default_options: [ 'openpower-pel-extension=enabled' ], fallback: ['phosphor-logging', 'phosphor_logging_dep']) sdbusplus = dependency('sdbusplus', fallback: [ 'sdbusplus', 'sdbusplus_dep' ]) libvpdecc_src = files( 'vpdecc/vpdecc.c', 'vpdecc/vpdecc_support.c' ) libvpdecc = shared_library( 'vpdecc', libvpdecc_src, version: meson.project_version(), install: true, ) compiler = meson.get_compiler('cpp') python = find_program('python3', required:true) if compiler.has_header('CLI/CLI.hpp') CLI11_dep = declare_dependency() else CLI11_dep = dependency('CLI11') endif if compiler.has_header('nlohmann/json.hpp') nlohmann_json_dep = declare_dependency() else nlohmann_json_dep = dependency('nlohmann-json') endif if not build_tests.disabled() subdir('test') endif configure_file(output: 'config.h', configuration :{ 'INVENTORY_JSON_DEFAULT': '"'+get_option('INVENTORY_JSON_DEFAULT')+'"', 'VPD_FILES_PATH': '"'+get_option('VPD_FILES_PATH')+'"', 'INVENTORY_PATH': '"'+get_option('INVENTORY_PATH')+'"', 'IPZ_INTERFACE': '"'+get_option('IPZ_INTERFACE')+'"', 'INVENTORY_MANAGER_SERVICE': '"'+get_option('INVENTORY_MANAGER_SERVICE')+'"', 'BUSNAME' : '"' + get_option('BUSNAME') + '"', 'OBJPATH' : '"' + get_option('OBJPATH') + '"', 'IFACE' : '"' + get_option('IFACE') + '"', 'OBJECT_MAPPER_SERVICE' : '"'+get_option('OBJECT_MAPPER_SERVICE')+'"', 'OBJECT_MAPPER_OBJECT' : '"'+get_option('OBJECT_MAPPER_OBJECT')+'"', 'POWER_SUPPLY_TYPE_INTERFACE' : '"'+get_option('POWER_SUPPLY_TYPE_INTERFACE')+'"', 'INVENTORY_MANAGER_CACHE' : '"'+get_option('INVENTORY_MANAGER_CACHE')+'"', 'INVENTORY_JSON_SYM_LINK': '"'+get_option('INVENTORY_JSON_SYM_LINK')+'"', 'INVENTORY_JSON_2U': '"'+get_option('INVENTORY_JSON_2U')+'"', 'INVENTORY_JSON_4U': '"'+get_option('INVENTORY_JSON_4U')+'"', 'INVENTORY_JSON_EVEREST': '"'+get_option('INVENTORY_JSON_EVEREST')+'"', 'DBUS_PROP_JSON': '"'+get_option('DBUS_PROP_JSON')+'"', 'SYSTEM_JSON' : '"'+get_option('SYSTEM_JSON')+'"', 'BAD_VPD_DIR': '"'+get_option('BAD_VPD_DIR')+'"', 'FAN_INTERFACE': '"'+get_option('FAN_INTERFACE')+'"' } ) common_SOURCES =['common_utility.cpp', 'vpd-parser/parser_factory.cpp', 'vpd-parser/memory_vpd_parser.cpp', 'vpd-parser/isdimm_vpd_parser.cpp', 'vpd-parser/keyword_vpd_parser.cpp', 'vpd-parser/ipz_parser.cpp', 'impl.cpp', 'ibm_vpd_utils.cpp', ] if get_option('ibm-parser').allowed() libgpiodcxx = dependency( 'libgpiodcxx', default_options: ['bindings=cxx'], ) ibm_read_vpd_SOURCES = ['ibm_vpd_app.cpp', 'vpd-manager/editor_impl.cpp', ]+common_SOURCES vpd_tool_INCLUDE = include_directories('vpd-parser/', 'vpd-manager') ibm_vpd_exe = executable( 'ibm-read-vpd', ibm_read_vpd_SOURCES, dependencies: [ sdbusplus, phosphor_logging, libgpiodcxx, nlohmann_json_dep, CLI11_dep, ], link_with : libvpdecc, include_directories : vpd_tool_INCLUDE, install: true, cpp_args : '-DIPZ_PARSER' ) vpd_tool_SOURCES = ['vpd_tool.cpp', 'vpd_tool_impl.cpp', 'vpd-manager/editor_impl.cpp', ]+common_SOURCES vpd_tool_exe = executable( 'vpd-tool', vpd_tool_SOURCES, dependencies: [ CLI11_dep, libgpiodcxx, nlohmann_json_dep, phosphor_logging, sdbusplus, ], link_with : libvpdecc, install: true, include_directories : vpd_tool_INCLUDE, cpp_args : '-DIPZ_PARSER' ) if get_option('vpd-manager').allowed() subdir('vpd-manager') endif systemd_system_unit_dir = dependency('systemd').get_variable( 'systemdsystemunitdir') udev_dir = dependency('udev').get_variable( 'udev_dir') install_data( 'ibm_vpd/system-vpd.service', install_dir: systemd_system_unit_dir) install_data( 'ibm_vpd/ibm-vpd-parser@.service', install_dir: systemd_system_unit_dir) install_data( 'ibm_vpd/com.ibm.VPD.Manager.service', install_dir: systemd_system_unit_dir) install_data( 'ibm_vpd/wait-vpd-parsers.service', install_dir: systemd_system_unit_dir) install_data( 'ibm_vpd/wait-vpd-parsers.sh', install_mode: 'rwxr-xr-x', install_dir: get_option('bindir')) install_data( ['ibm_vpd/70-ibm-vpd-parser.rules'], install_dir: udev_dir / 'rules.d') package_datadir = join_paths('share', 'vpd') install_subdir('ibm_vpd/fru/', install_dir: package_datadir, strip_directory: true) else FRUGEN = '$srcdir/extra-properties.py -e' + get_option('FRU_YAML') PROPGEN = '$srcdir/extra-properties.py -e' + get_option('PROP_YAML') src_dir = meson.project_source_root() FRU_GEN_SCRIPT = src_dir + '/writefru.py' FRU_GEN_SCRIPT_FILES = src_dir + '/writefru.yaml' PROP_GEN_SCRIPT = src_dir + '/extra-properties.py' PROP_GEN_SCRIPT_FILES = src_dir + '/extra-properties-example.yaml' writefru_hpp = custom_target('writefru.hpp', command:[python, FRU_GEN_SCRIPT, '-i', get_option('FRU_YAML') ], depend_files :['writefru.mako.hpp', 'writefru.py', get_option('FRU_YAML') ], output:'writefru.hpp' ) extra_properties_gen_hpp = custom_target( 'extra-properties-gen.hpp', command:[ python, PROP_GEN_SCRIPT, '-e', get_option('PROP_YAML') ], depend_files : ['extra-properties.mako.hpp', 'extra-properties.py', get_option('PROP_YAML') ], output:'extra-properties-gen.hpp' ) openpower_read_vpd_SOURCES = ['app.cpp', 'args.cpp', 'impl.cpp', 'vpd-parser/ipz_parser.cpp', 'write.cpp', 'common_utility.cpp', writefru_hpp, extra_properties_gen_hpp ] openpower_read_vpd_exe= executable( 'openpower-read-vpd', openpower_read_vpd_SOURCES, dependencies: [ sdbusplus, phosphor_logging, nlohmann_json_dep, ], include_directories : 'vpd-parser/', install: true, ) endif