project(
    'phosphor-objmgr',
    'c',
    'cpp',
    default_options: [
        'buildtype=debugoptimized',
        'cpp_std=c++23',
        'warning_level=3',
        'werror=true',
    ],
    license: 'Apache-2.0',
    meson_version: '>=1.1.1',
    version: '1.0',
)

cxx = meson.get_compiler('cpp')

if cxx.has_header('CLI/CLI.hpp')
    cli11_dep = declare_dependency()
else
    cli11_dep = dependency('cli11')
endif
phosphor_logging = dependency('phosphor-logging')
phosphor_dbus_interfaces = dependency('phosphor-dbus-interfaces')
sdbusplus = dependency('sdbusplus')
boost = dependency(
    'boost',
    version: '>=1.79.0',
    required: false,
    include_type: 'system',
)
if not boost.found()
    subproject('boost', required: false)
    boost_inc = include_directories('subprojects/boost_1_79_0/', is_system: true)
    boost = declare_dependency(include_directories: boost_inc)
    boost = boost.as_system('system')
endif
add_project_arguments(
    ['-DBOOST_ASIO_DISABLE_THREADS', '-DBOOST_ASIO_NO_DEPRECATED'],
    language: 'cpp',
)

if get_option('buildtype').startswith('debug')
    add_project_arguments('-DMAPPER_ENABLE_DEBUG', language: 'cpp')
endif

if get_option('tests').allowed()
    gtest = dependency('gtest', main: true, disabler: true, required: false)
    gmock = dependency('gmock', disabler: true, required: false)
    if not gtest.found() or not gmock.found()
        gtest_proj = import('cmake').subproject('googletest', required: false)
        if gtest_proj.found()
            gtest = declare_dependency(
                dependencies: [
                    dependency('threads'),
                    gtest_proj.dependency('gtest'),
                    gtest_proj.dependency('gtest_main'),
                ],
            )
            gmock = gtest_proj.dependency('gmock')
        else
            assert(
                not get_option('tests').allowed(),
                'Googletest is required if tests are enabled',
            )
        endif
    endif
    subdir('src/test')
    subdir('libmapper/test')
endif

install_headers('libmapper/mapper.h')

libmapper = library(
    'mapper',
    'libmapper/mapper.c',
    dependencies: [dependency('libsystemd')],
    gnu_symbol_visibility: 'hidden',
    version: meson.project_version(),
    install: true,
)

mapper_dep = declare_dependency(
    link_with: libmapper,
    include_directories: include_directories('libmapper'),
    dependencies: [dependency('libsystemd')],
)

import('pkgconfig').generate(
    name: 'libmapper',
    description: 'OpenBMC service discovery utility library',
    version: meson.project_version(),
    libraries: libmapper,
)

executable(
    'mapper',
    'libmapper/app.c',
    link_with: libmapper,
    dependencies: [dependency('libsystemd')],
    install: true,
)

mapperx = executable(
    'mapperx',
    [
        'src/main.cpp',
        'src/processing.cpp',
        'src/associations.cpp',
        'src/handler.cpp',
    ],
    dependencies: [
        boost,
        dependency('libsystemd'),
        phosphor_dbus_interfaces,
        phosphor_logging,
        sdbusplus,
        dependency('threads'),
        dependency('tinyxml2', default_options: ['tests=false']),
    ],
    install: true,
    install_dir: join_paths(
        get_option('prefix'),
        get_option('libexecdir'),
        meson.project_name(),
    ),
)
meson.override_find_program('mapperx', mapperx)

systemd_system_unit_dir = dependency('systemd').get_variable(
    'systemdsystemunitdir',
)

conf = configuration_data()
conf.set('BINDIR', join_paths(get_option('prefix'), get_option('bindir')))
conf.set(
    'LIBEXECDIR',
    join_paths(get_option('prefix'), get_option('libexecdir')),
)

unit_files = [
    'xyz.openbmc_project.ObjectMapper.service',
    'mapper-subtree-remove@.service',
    'mapper-wait@.service',
]

foreach u : unit_files
    configure_file(
        configuration: conf,
        input: join_paths('src/systemd', u) + '.in',
        install: true,
        install_dir: systemd_system_unit_dir,
        output: u,
    )
endforeach

dbus_system_bus_services_dir = dependency('dbus-1').get_variable(
    'system_bus_services_dir',
    pkgconfig_define: ['prefix', get_option('prefix')],
)

install_data(
    'src/dbus/xyz.openbmc_project.ObjectMapper.service',
    install_dir: dbus_system_bus_services_dir,
)

install_data(
    'src/dbus/xyz.openbmc_project.ObjectMapper.conf',
    install_dir: get_option('datadir') / 'dbus-1' / 'system.d',
)

if not get_option('unit-failure-monitor').disabled()
    executable(
        'phosphor-unit-failure-monitor',
        ['fail-monitor/main.cpp', 'fail-monitor/monitor.cpp'],
        dependencies: [cli11_dep, phosphor_logging],
        install: true,
    )
endif
