1project('phosphor-dbus-interfaces', 'cpp',
2    meson_version: '>= 0.54.1',
3    default_options: [
4        'buildtype=debugoptimized',
5        'cpp_std=c++17',
6        'warning_level=3',
7        'werror=true',
8    ],
9    version: '1.0.0',
10)
11# meson_version >= 0.54.1 is necessary because that is the first place meson
12# generates unique object filenames for two files with the same `basename`.
13# Many sdbus++ generated files have `basename` collisions because they are
14# named like `.../server.cpp`.  Prior to this version, meson would create a
15# ninja recipe for a single `server.o` file.
16
17# Get sdbusplus dependency.
18sdbusplus_dep = dependency('sdbusplus', required: false)
19if sdbusplus_dep.found()
20    sdbusplusplus_prog = find_program('sdbus++')
21    sdbusgen_prog = find_program('sdbus++-gendir')
22else
23    sdbusplus_proj = subproject('sdbusplus', required: true)
24    sdbusplus_dep = sdbusplus_proj.get_variable('sdbusplus_dep')
25    sdbusplusplus_prog = sdbusplus_proj.get_variable('sdbusplusplus_prog')
26    sdbusgen_prog = sdbusplus_proj.get_variable('sdbusgen_prog')
27endif
28
29realpath_prog = find_program('realpath')
30
31# Parse options to determine appropriate subdirectories to support.
32selected_subdirs = []
33if get_option('data_com_ibm')
34    selected_subdirs += 'com/ibm'
35endif
36if get_option('data_org_open_power')
37    selected_subdirs += 'org/open_power'
38endif
39if get_option('data_xyz_openbmc_project')
40    selected_subdirs += 'xyz/openbmc_project'
41endif
42
43# Install the selected YAML files.
44foreach d : selected_subdirs
45    install_subdir(
46        d,
47        install_dir: get_option('datadir') / 'phosphor-dbus-yaml/yaml' / d,
48        strip_directory: true,
49    )
50endforeach
51
52# If libphosphor_dbus was not enabled, exit out from here.  We installed
53# the YAML which is all we are asked to do.
54if not get_option('libphosphor_dbus')
55    subdir_done()
56endif
57
58# Generate all the sdbus++ files from the selected subdirectories.
59generated_root = meson.current_build_dir() / 'gen-out'
60generated_files = run_command(
61        sdbusgen_prog,
62        '--list-all',
63        '--tool', sdbusplusplus_prog,
64        '--output', generated_root,
65        selected_subdirs,
66        check: true,
67).stdout().strip().split('\n')
68
69# Parse through the list from sdbus++-gendir and put into sets.
70generated_headers = []
71generated_cpp = []
72generated_cpp_fullpath = []
73generated_others = []
74
75foreach f : generated_files
76    rel_path = run_command(
77        realpath_prog,
78        '--relative-to', generated_root,
79        f,
80    ).stdout().strip().split('\n')[-1]
81
82    if f.endswith('.hpp')
83        generated_headers += rel_path
84    elif f.endswith('.cpp')
85        generated_cpp += rel_path
86        generated_cpp_fullpath += f
87    else
88        generated_others += rel_path
89    endif
90endforeach
91
92# Install the generated header files.
93install_subdir(
94    generated_root,
95    exclude_files: [ generated_cpp, generated_others ],
96    install_dir: get_option('includedir'),
97    strip_directory: true,
98)
99
100# Install the generated markdown files.
101install_subdir(
102    generated_root,
103    exclude_files: [ generated_headers, generated_cpp ],
104    install_dir: get_option('datadir') / meson.project_name(),
105    strip_directory: true,
106)
107
108# Define and build libphosphor_dbus.so from the C++ files.
109libphosphor_dbus = library(
110    'phosphor_dbus',
111    files(generated_cpp_fullpath),
112    include_directories: include_directories('gen-out'),
113    dependencies: sdbusplus_dep,
114    version: meson.project_version(),
115    install: true,
116)
117
118import('pkgconfig').generate(
119    libraries: libphosphor_dbus,
120    name: meson.project_name(),
121    version: meson.project_version(),
122    description: 'Generated sdbusplus bindings for phosphor-dbus-interfaces'
123)
124