build: add support for meson

Mostly a direct port from the current autotools implementation, except
configurability for several variables is dropped because they are
unused:

SOFTWARE_OBJPATH, IMG_DIR, MANIFEST_FILE, PUBLICKEY_FILE_NAME,
HASH_FILE_NAME, PNOR_SIGNED_IMAGE_CONF_PATH, SIGNATURE_FILE_EXT,
ACTIVE_PNOR_MAX_ALLOWED, PNOR_VERSION_PARTITION

Change-Id: I3929518b786600435ae48484f63633c52a65d1f9
Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
diff --git a/meson.build b/meson.build
new file mode 100644
index 0000000..85911b4
--- /dev/null
+++ b/meson.build
@@ -0,0 +1,250 @@
+project(
+    'openpower-pnor-code-mgmt',
+    'cpp',
+    default_options: [
+        'warning_level=3',
+        'werror=true',
+        'cpp_std=c++17',
+        'buildtype=debugoptimized',
+        'b_ndebug=if-release',
+        'b_lto=true',
+    ],
+    license: 'Apache-2.0',
+    version: '1.0',
+)
+
+if get_option('cpp_std') != 'c++17'
+    error('This project requires c++17')
+endif
+
+if(get_option('buildtype') == 'minsize')
+    add_project_arguments('-DNDEBUG', language : 'cpp')
+endif
+
+# Disable lto when compiling with no optimization
+if(get_option('optimization') == '0')
+    add_project_arguments('-fno-lto', language: 'cpp')
+    message('Disabling lto because optimization is disabled')
+endif
+
+extra_sources = []
+extra_unit_files = []
+extra_scripts = []
+
+build_vpnor = get_option('vpnor').enabled()
+build_verify_signature = get_option('verify-signature').enabled()
+
+summary('building for device type', '@0@'.format(get_option('device-type')))
+summary('building vpnor', build_vpnor)
+summary('building signature verify', build_verify_signature)
+
+subs = configuration_data()
+subs.set_quoted('ACTIVATION_FWD_ASSOCIATION', 'inventory')
+subs.set_quoted('ACTIVATION_REV_ASSOCIATION', 'activation')
+subs.set_quoted('ACTIVE_FWD_ASSOCIATION', 'active')
+subs.set('ACTIVE_PNOR_MAX_ALLOWED', 2)
+subs.set_quoted('ACTIVE_REV_ASSOCIATION', 'software_version')
+subs.set_quoted('ASSOCIATIONS_INTERFACE', 'xyz.openbmc_project.Association.Definitions')
+subs.set_quoted('BUSNAME_UPDATER', 'xyz.openbmc_project.Software.Host.Updater')
+subs.set_quoted('CHASSIS_STATE_OBJ', 'xyz.openbmc_project.State.Chassis')
+subs.set_quoted('CHASSIS_STATE_OFF', 'xyz.openbmc_project.State.Chassis.PowerState.Off')
+subs.set_quoted('CHASSIS_STATE_PATH', '/xyz/openbmc_project/state/chassis0')
+subs.set_quoted('FILEPATH_IFACE', 'xyz.openbmc_project.Common.FilePath')
+subs.set_quoted('FUNCTIONAL_FWD_ASSOCIATION', 'functional')
+subs.set_quoted('FUNCTIONAL_REV_ASSOCIATION', 'software_version')
+subs.set_quoted('HASH_FILE_NAME', 'hashfunc')
+subs.set_quoted('HOST_INVENTORY_PATH', '/xyz/openbmc_project/inventory/system/chassis')
+subs.set_quoted('IMG_DIR', '/tmp/images')
+subs.set_quoted('MANIFEST_FILE', 'MANIFEST')
+subs.set_quoted('MAPPER_BUSNAME', 'xyz.openbmc_project.ObjectMapper')
+subs.set_quoted('MAPPER_INTERFACE', 'xyz.openbmc_project.ObjectMapper')
+subs.set_quoted('MAPPER_PATH', '/xyz/openbmc_project/object_mapper')
+subs.set_quoted('MEDIA_DIR', '/media/')
+subs.set('MMC_LAYOUT', get_option('device-type') == 'mmc')
+subs.set_quoted('PERSIST_DIR', '/var/lib/obmc/openpower-pnor-code-mgmt/')
+subs.set_quoted('PNOR_ACTIVE_PATH', '/var/lib/phosphor-software-manager/pnor/')
+subs.set_quoted('PNOR_MSL', get_option('msl'))
+subs.set_quoted('PNOR_PRSV', '/media/pnor-prsv')
+subs.set_quoted('PNOR_PRSV_ACTIVE_PATH', '/var/lib/phosphor-software-manager/pnor/prsv')
+subs.set_quoted('PNOR_RO_ACTIVE_PATH', '/var/lib/phosphor-software-manager/pnor/ro')
+subs.set_quoted('PNOR_RO_PREFIX', '/media/pnor-ro-')
+subs.set_quoted('PNOR_RW_ACTIVE_PATH', '/var/lib/phosphor-software-manager/pnor/rw')
+subs.set_quoted('PNOR_RW_PREFIX', '/media/pnor-rw-')
+subs.set_quoted('PNOR_SIGNED_IMAGE_CONF_PATH', '/etc/activationdata/')
+subs.set_quoted('PNOR_TOC_FILE', 'pnor.toc')
+subs.set_quoted('PNOR_VERSION_PARTITION', 'VERSION')
+subs.set_quoted('PUBLICKEY_FILE_NAME', 'publickey')
+subs.set_quoted('SIGNATURE_FILE_EXT', '.sig')
+subs.set_quoted('SOFTWARE_OBJPATH', '/xyz/openbmc_project/software')
+subs.set_quoted('SYSTEMD_BUSNAME', 'org.freedesktop.systemd1')
+subs.set_quoted('SYSTEMD_INTERFACE', 'org.freedesktop.systemd1.Manager')
+subs.set_quoted('SYSTEMD_PATH', '/org/freedesktop/systemd1')
+subs.set_quoted('SYSTEMD_PROPERTY_INTERFACE', 'org.freedesktop.DBus.Properties')
+subs.set('UBIFS_LAYOUT', get_option('device-type') == 'ubi')
+subs.set_quoted('UPDATEABLE_FWD_ASSOCIATION', 'updateable')
+subs.set_quoted('UPDATEABLE_REV_ASSOCIATION', 'software_version')
+subs.set_quoted('VERSION_IFACE', 'xyz.openbmc_project.Software.Version')
+subs.set('WANT_SIGNATURE_VERIFY', build_verify_signature)
+configure_file(
+    output: 'config.h',
+    configuration: subs)
+
+if get_option('device-type') == 'ubi'
+    extra_sources += [
+        'ubi/activation_ubi.cpp',
+        'ubi/item_updater_ubi.cpp',
+        'ubi/serialize.cpp',
+        'ubi/watch.cpp',
+    ]
+    extra_scripts += [
+        'ubi/obmc-flash-bios',
+    ]
+    extra_unit_files += [
+        'ubi/obmc-flash-bios-cleanup.service',
+        'ubi/obmc-flash-bios-ubiattach.service',
+        'ubi/obmc-flash-bios-ubimount@.service',
+        'ubi/obmc-flash-bios-ubipatch.service',
+        'ubi/obmc-flash-bios-ubiremount.service',
+        'ubi/obmc-flash-bios-ubiumount-ro@.service',
+        'ubi/obmc-flash-bios-ubiumount-rw@.service',
+    ]
+endif
+
+if get_option('device-type') == 'mmc'
+    extra_sources += [
+        'mmc/activation_mmc.cpp',
+        'mmc/item_updater_mmc.cpp',
+    ]
+    extra_scripts += [
+        'mmc/obmc-flash-bios',
+    ]
+    extra_unit_files += [
+        'mmc/obmc-flash-bios-init.service',
+        'mmc/obmc-flash-bios-patch.service',
+    ]
+endif
+
+if get_option('device-type') == 'static'
+    extra_sources += [
+        'static/item_updater_static.cpp',
+        'static/activation_static.cpp',
+    ]
+    extra_unit_files += [
+        'openpower-pnor-update@.service',
+    ]
+endif
+
+if build_verify_signature
+    extra_sources += [
+        'image_verify.cpp'
+    ]
+endif
+
+if build_vpnor
+    extra_scripts += [
+        'vpnor/obmc-vpnor-util',
+    ]
+    extra_unit_files += [
+        'vpnor/obmc-vpnor-check-clearvolatile@.service',
+        'vpnor/obmc-vpnor-enable-clearvolatile@.service',
+        'vpnor/obmc-vpnor-updatesymlinks.service',
+    ]
+endif
+
+executable(
+    'openpower-update-manager',
+    [
+        'activation.cpp',
+        'version.cpp',
+        'item_updater.cpp',
+        'item_updater_main.cpp',
+        'utils.cpp',
+    ] + extra_sources,
+    dependencies: [
+        dependency('libcrypto'),
+        dependency('libsystemd'),
+        dependency('openssl'),
+        dependency('phosphor-dbus-interfaces'),
+        dependency('phosphor-logging'),
+        dependency('sdbusplus'),
+    ],
+    install: true
+)
+
+executable(
+    'openpower-pnor-msl',
+    [
+        'msl_verify.cpp',
+        'msl_verify_main.cpp',
+    ],
+    dependencies: [
+        dependency('libsystemd'),
+        dependency('phosphor-dbus-interfaces'),
+        dependency('phosphor-logging'),
+        dependency('sdbusplus'),
+    ],
+    install: true
+)
+
+foreach s : extra_scripts
+    configure_file(
+        input: s,
+        copy: true,
+        install: true,
+        install_mode: 'rwxr-xr-x',
+        install_dir: get_option('bindir'),
+        output: '@BASENAME@'
+    )
+endforeach
+
+unit_files = [
+    'op-pnor-msl.service',
+    'org.open_power.Software.Host.Updater.service',
+] + extra_unit_files
+
+systemd_system_unit_dir = dependency('systemd').get_pkgconfig_variable(
+    'systemdsystemunitdir',
+    define_variable: ['prefix', get_option('prefix')])
+foreach u : unit_files
+    configure_file(
+        input: u,
+        copy: true,
+        install: true,
+        install_dir: systemd_system_unit_dir,
+        output: '@BASENAME@.service'
+    )
+endforeach
+
+if not get_option('tests').disabled()
+    test(
+        'utest',
+        executable(
+            'utest',
+            'activation.cpp',
+            'version.cpp',
+            'item_updater.cpp',
+            'image_verify.cpp',
+            'utils.cpp',
+            'msl_verify.cpp',
+            'ubi/activation_ubi.cpp',
+            'ubi/item_updater_ubi.cpp',
+            'ubi/serialize.cpp',
+            'ubi/watch.cpp',
+            'static/item_updater_static.cpp',
+            'static/activation_static.cpp',
+            'test/test_signature.cpp',
+            'test/test_version.cpp',
+            'test/test_item_updater_static.cpp',
+            'msl_verify.cpp',
+            dependencies: [
+                dependency('libcrypto'),
+                dependency('gtest', main: true),
+                dependency('openssl'),
+                dependency('phosphor-logging'),
+                dependency('phosphor-dbus-interfaces'),
+            ],
+            implicit_include_directories: false,
+            include_directories: '.',
+        )
+    )
+endif
diff --git a/meson_options.txt b/meson_options.txt
new file mode 100644
index 0000000..c6a640a
--- /dev/null
+++ b/meson_options.txt
@@ -0,0 +1,5 @@
+option('tests', type: 'feature', description: 'Build tests.')
+option('device-type', type: 'combo', choices: ['static', 'ubi', 'mmc'], description: 'Select which device type to support')
+option('vpnor', type: 'feature', description: 'Enable virtual PNOR support')
+option('verify-signature', type: 'feature', description: 'Enable image signature validation')
+option('msl', type: 'string', description: 'Minimum Ship Level')