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