xref: /openbmc/sdbusplus/tools/sdbus++-gen-meson (revision 74eea5191eb7a37272ebfc68cc775fa6d289d7f5)
1847a0c37SPatrick Williams#!/usr/bin/env bash
2847a0c37SPatrick Williams
3847a0c37SPatrick Williamsset -e
4847a0c37SPatrick Williams
5a4c9edc1SPatrick Williams# Locale can change behavior of utilities like 'sort' but we want the output
6a4c9edc1SPatrick Williams# to be stable on all machines.  Force the locale to 'C' for consistency.
7a4c9edc1SPatrick Williamsexport LC_ALL=C
8a4c9edc1SPatrick Williams
9018b8ff1SPatrick Williamsfunction show_usage() {
10847a0c37SPatrick Williams    cat \
11847a0c37SPatrick Williams        << EOF
12847a0c37SPatrick WilliamsUsage: $(basename "$0") [options] <command-args>*
13847a0c37SPatrick Williams
14847a0c37SPatrick WilliamsGenerate meson.build files from a directory tree containing YAML files and
15847a0c37SPatrick Williamsfacilitate building the sdbus++ sources.
16847a0c37SPatrick Williams
17847a0c37SPatrick WilliamsOptions:
18847a0c37SPatrick Williams    --help              - Display this message
19847a0c37SPatrick Williams    --command <cmd>     - Command mode to execute (default 'meson').
20847a0c37SPatrick Williams    --directory <path>  - Root directory of the YAML source (default '.').
21847a0c37SPatrick Williams    --output <path>     - Root directory of the output (default '.').
22847a0c37SPatrick Williams    --tool <path>       - Path to the processing tool (default 'sdbus++').
23847a0c37SPatrick Williams    --version           - Display this tool's version string.
24847a0c37SPatrick Williams
25847a0c37SPatrick WilliamsCommands:
26847a0c37SPatrick Williams    meson               - Generate a tree of meson.build files corresponding
27847a0c37SPatrick Williams                          to the source YAML files.
28847a0c37SPatrick Williams    cpp <intf>          - Generate the source files from a YAML interface.
29847a0c37SPatrick Williams    markdown <intf>     - Generate the markdown files from a YAML interface.
3031607399SPatrick Williams    registry <intf>     - Generate the Redfish registry from a YAML interface.
31847a0c37SPatrick Williams    version             - Display this tool's version string.
32847a0c37SPatrick Williams
33847a0c37SPatrick WilliamsEOF
34847a0c37SPatrick Williams}
35847a0c37SPatrick Williams
36847a0c37SPatrick Williams## The version is somewhat arbitrary but is used to create a warning message
37847a0c37SPatrick Williams## if a repository contains old copies of the generated meson.build files and
38847a0c37SPatrick Williams## needs an update.  We should increment the version number whenever the
39847a0c37SPatrick Williams## resulting meson.build would change.
4031607399SPatrick Williamstool_version="sdbus++-gen-meson version 10"
41018b8ff1SPatrick Williamsfunction show_version() {
42d77548a1SPatrick Williams    echo "${tool_version}"
43847a0c37SPatrick Williams}
44847a0c37SPatrick Williams
45847a0c37SPatrick Williams# Set up defaults.
46847a0c37SPatrick Williamssdbuspp="sdbus++"
47847a0c37SPatrick Williamsoutputdir="."
48847a0c37SPatrick Williamscmd="meson"
49847a0c37SPatrick Williamsrootdir="."
50847a0c37SPatrick Williams
51847a0c37SPatrick Williams# Parse options.
52847a0c37SPatrick Williamsoptions="$(getopt -o hc:d:o:t:v --long help,command:,directory:,output:,tool:,version -- "$@")"
53d77548a1SPatrick Williamseval set -- "${options}"
54847a0c37SPatrick Williams
559ede18b4SPatrick Williamswhile true; do
56847a0c37SPatrick Williams    case "$1" in
57847a0c37SPatrick Williams        -h | --help)
58847a0c37SPatrick Williams            show_usage
59847a0c37SPatrick Williams            exit
60847a0c37SPatrick Williams            ;;
61847a0c37SPatrick Williams
62847a0c37SPatrick Williams        -c | --command)
63847a0c37SPatrick Williams            shift
64847a0c37SPatrick Williams            cmd="$1"
65847a0c37SPatrick Williams            shift
66847a0c37SPatrick Williams            ;;
67847a0c37SPatrick Williams
68847a0c37SPatrick Williams        -d | --directory)
69847a0c37SPatrick Williams            shift
70847a0c37SPatrick Williams            rootdir="$1"
71847a0c37SPatrick Williams            shift
72847a0c37SPatrick Williams            ;;
73847a0c37SPatrick Williams
74847a0c37SPatrick Williams        -o | --output)
75847a0c37SPatrick Williams            shift
76847a0c37SPatrick Williams            outputdir="$1"
77847a0c37SPatrick Williams            shift
78847a0c37SPatrick Williams            ;;
79847a0c37SPatrick Williams
80847a0c37SPatrick Williams        -t | --tool)
81847a0c37SPatrick Williams            shift
82847a0c37SPatrick Williams            sdbuspp="$1"
83847a0c37SPatrick Williams            shift
84847a0c37SPatrick Williams            ;;
85847a0c37SPatrick Williams
86847a0c37SPatrick Williams        -v | --version)
87847a0c37SPatrick Williams            show_version
88847a0c37SPatrick Williams            exit
89847a0c37SPatrick Williams            ;;
90847a0c37SPatrick Williams
91847a0c37SPatrick Williams        --)
92847a0c37SPatrick Williams            shift
93847a0c37SPatrick Williams            break
94847a0c37SPatrick Williams            ;;
95d77548a1SPatrick Williams
96d77548a1SPatrick Williams        *)
97d77548a1SPatrick Williams            echo "Invalid argument $1"
98d77548a1SPatrick Williams            exit 1
99d77548a1SPatrick Williams            ;;
100847a0c37SPatrick Williams    esac
101847a0c37SPatrick Williamsdone
102847a0c37SPatrick Williams
103847a0c37SPatrick Williams## Create an initially empty meson.build file.
104847a0c37SPatrick Williams## $1 - path to create meson.build at.
105018b8ff1SPatrick Williamsfunction meson_empty_file() {
106847a0c37SPatrick Williams    mkdir -p "$1"
107847a0c37SPatrick Williams    echo "# Generated file; do not modify." > "$1/meson.build"
108847a0c37SPatrick Williams}
109847a0c37SPatrick Williams
110847a0c37SPatrick Williams## Create the root-level meson.build
111847a0c37SPatrick Williams##
112847a0c37SPatrick Williams## Inserts rules to run the available version of this tool to ensure the
113847a0c37SPatrick Williams## version has not changed.
114018b8ff1SPatrick Williamsfunction meson_create_root() {
115d77548a1SPatrick Williams    meson_empty_file "${outputdir}"
116847a0c37SPatrick Williams
117d77548a1SPatrick Williams    cat >> "${outputdir}/meson.build" \
118847a0c37SPatrick Williams        << EOF
119847a0c37SPatrick Williamssdbuspp_gen_meson_ver = run_command(
120847a0c37SPatrick Williams    sdbuspp_gen_meson_prog,
121847a0c37SPatrick Williams    '--version',
12260a94305SEd Tanous    check: true,
123847a0c37SPatrick Williams).stdout().strip().split('\n')[0]
124847a0c37SPatrick Williams
125d77548a1SPatrick Williamsif sdbuspp_gen_meson_ver != '${tool_version}'
126847a0c37SPatrick Williams    warning('Generated meson files from wrong version of sdbus++-gen-meson.')
127847a0c37SPatrick Williams    warning(
128d77548a1SPatrick Williams        'Expected "${tool_version}", got:',
129847a0c37SPatrick Williams        sdbuspp_gen_meson_ver
130847a0c37SPatrick Williams    )
131847a0c37SPatrick Williamsendif
132847a0c37SPatrick Williams
133*74eea519SPatrick Williamsinst_markdown_dir = get_option('datadir') / 'doc' / meson.project_name()
134*74eea519SPatrick Williamsinst_registry_dir = get_option('datadir') / 'redfish-registry' / meson.project_name()
135*74eea519SPatrick Williams
136*74eea519SPatrick Williamsgenerated_sources = []
137*74eea519SPatrick Williamsgenerated_markdown = []
138*74eea519SPatrick Williamsgenerated_registry = []
139*74eea519SPatrick Williams
140*74eea519SPatrick Williamsforeach d : yaml_selected_subdirs
141*74eea519SPatrick Williams    subdir(d)
142*74eea519SPatrick Williamsendforeach
143*74eea519SPatrick Williams
144*74eea519SPatrick Williamsgenerated_headers = []
145*74eea519SPatrick Williamsforeach s : generated_sources
146*74eea519SPatrick Williams    foreach f : s.to_list()
147*74eea519SPatrick Williams        if f.full_path().endswith('.hpp')
148*74eea519SPatrick Williams            generated_headers += f
149*74eea519SPatrick Williams        endif
150*74eea519SPatrick Williams    endforeach
151*74eea519SPatrick Williamsendforeach
152*74eea519SPatrick Williams
153847a0c37SPatrick WilliamsEOF
154847a0c37SPatrick Williams}
155847a0c37SPatrick Williams
156847a0c37SPatrick Williams## hash-tables to store:
157847a0c37SPatrick Williams##      meson_paths - list of subdirectory paths for which an empty meson.build
158847a0c37SPatrick Williams##                    has already been created.
159847a0c37SPatrick Williams##      interfaces - list of interface paths which a YAML has been found and
160847a0c37SPatrick Williams##                   which YAML types (interface, errors, etc.).
161847a0c37SPatrick Williamsdeclare -A meson_paths
162847a0c37SPatrick Williamsdeclare -A interfaces
163847a0c37SPatrick Williams
164847a0c37SPatrick Williams## Ensure the meson.build files to a path have been created.
165847a0c37SPatrick Williams## $1 - The path requiring to be created.
166018b8ff1SPatrick Williamsfunction meson_create_path() {
167847a0c37SPatrick Williams
168d77548a1SPatrick Williams    meson_path="${outputdir}"
169847a0c37SPatrick Williams    prev_meson_path=""
170847a0c37SPatrick Williams
171847a0c37SPatrick Williams    # Split the path into segments.
1729ede18b4SPatrick Williams    for part in $(echo "$1" | tr '/' '\n'); do
173d77548a1SPatrick Williams        prev_meson_path="${meson_path}"
174d77548a1SPatrick Williams        meson_path="${meson_path}/${part}"
175847a0c37SPatrick Williams
176847a0c37SPatrick Williams        # Create the meson.build for this segment if it doesn't already exist.
177d77548a1SPatrick Williams        if [[ "" == "${meson_paths[${meson_path}]}" ]]; then
178d77548a1SPatrick Williams            meson_paths["${meson_path}"]="1"
179d77548a1SPatrick Williams            meson_empty_file "${meson_path}"
180847a0c37SPatrick Williams
181847a0c37SPatrick Williams            # Add the 'subdir' link into the parent's meson.build.
182847a0c37SPatrick Williams            # We need to skip adding the links into the 'root' meson.build
183847a0c37SPatrick Williams            # because most repositories want to selectively add TLDs based
184847a0c37SPatrick Williams            # on config flags.  Let them figure out their own logic for that.
185d77548a1SPatrick Williams            if [[ ${outputdir} != "${prev_meson_path}" ]]; then
186d77548a1SPatrick Williams                echo "subdir('${part}')" >> "${prev_meson_path}/meson.build"
187847a0c37SPatrick Williams            fi
188847a0c37SPatrick Williams        fi
189847a0c37SPatrick Williams    done
190847a0c37SPatrick Williams}
191847a0c37SPatrick Williams
192*74eea519SPatrick Williams## Add the 'sdbusplus_current_path' to the meson file.
193*74eea519SPatrick Williams##
194*74eea519SPatrick Williams## $1 - The path to insert into.
195*74eea519SPatrick Williams##
196*74eea519SPatrick Williams## This is done after the subdir processing because we need to leave
197*74eea519SPatrick Williams## the meson variable in this state for the install directives.
198*74eea519SPatrick Williamsfunction meson_insert_current_path() {
199*74eea519SPatrick Williams    meson_path="${outputdir}/${1}"
200*74eea519SPatrick Williams    current_path="${1}"
201*74eea519SPatrick Williams    cat >> "${meson_path}/meson.build" \
202*74eea519SPatrick Williams        << EOF
203*74eea519SPatrick Williams
204*74eea519SPatrick Williamssdbusplus_current_path = '${current_path}'
205*74eea519SPatrick Williams
206*74eea519SPatrick WilliamsEOF
207*74eea519SPatrick Williams}
208*74eea519SPatrick Williams
209847a0c37SPatrick Williams## Generate the meson target for the source files (.cpp/.hpp) from a YAML
210847a0c37SPatrick Williams## interface.
211847a0c37SPatrick Williams##
212847a0c37SPatrick Williams## $1 - The interface to generate a target for.
213018b8ff1SPatrick Williamsfunction meson_cpp_target() {
214d77548a1SPatrick Williams    mesondir="${outputdir}/$1"
215d77548a1SPatrick Williams    yamldir="$(realpath --relative-to="${mesondir}" "${rootdir}")"
216*74eea519SPatrick Williams    nl=$'\n'
217*74eea519SPatrick Williams    ind="        "
218847a0c37SPatrick Williams
219847a0c37SPatrick Williams    # Determine the source and output files based on the YAMLs present.
220847a0c37SPatrick Williams    sources=""
221847a0c37SPatrick Williams    outputs=""
222*74eea519SPatrick Williams    install=""
2239ede18b4SPatrick Williams    for s in ${interfaces[$1]}; do
224*74eea519SPatrick Williams        sources="${sources}${ind}'${yamldir}/$1.${s}',${nl}"
225847a0c37SPatrick Williams
226d77548a1SPatrick Williams        case "${s}" in
227847a0c37SPatrick Williams            errors.yaml)
228*74eea519SPatrick Williams                outputs="${outputs}${ind}'error.cpp',${nl}"
229*74eea519SPatrick Williams                install="${install}${ind}false,${nl}"
230*74eea519SPatrick Williams
231*74eea519SPatrick Williams                outputs="${outputs}${ind}'error.hpp',${nl}"
232*74eea519SPatrick Williams                install="${install}${ind}get_option('includedir') / sdbusplus_current_path,${nl}"
233847a0c37SPatrick Williams                ;;
234847a0c37SPatrick Williams
2350336a2fcSPatrick Williams            events.yaml)
236*74eea519SPatrick Williams                outputs="${outputs}${ind}'event.cpp',${nl}"
237*74eea519SPatrick Williams                install="${install}${ind}false,${nl}"
238*74eea519SPatrick Williams
239*74eea519SPatrick Williams                outputs="${outputs}${ind}'event.hpp',${nl}"
240*74eea519SPatrick Williams                install="${install}${ind}get_option('includedir') / sdbusplus_current_path,${nl}"
2410336a2fcSPatrick Williams                ;;
2420336a2fcSPatrick Williams
243847a0c37SPatrick Williams            interface.yaml)
244*74eea519SPatrick Williams                outputs="${outputs}${ind}'common.hpp',${nl}"
245*74eea519SPatrick Williams                install="${install}${ind}get_option('includedir') / sdbusplus_current_path,${nl}"
246*74eea519SPatrick Williams
247*74eea519SPatrick Williams                outputs="${outputs}${ind}'server.hpp',${nl}"
248*74eea519SPatrick Williams                install="${install}${ind}get_option('includedir') / sdbusplus_current_path,${nl}"
249*74eea519SPatrick Williams
250*74eea519SPatrick Williams                outputs="${outputs}${ind}'server.cpp',${nl}"
251*74eea519SPatrick Williams                install="${install}${ind}false,${nl}"
252*74eea519SPatrick Williams
253*74eea519SPatrick Williams                outputs="${outputs}${ind}'aserver.hpp',${nl}"
254*74eea519SPatrick Williams                install="${install}${ind}get_option('includedir') / sdbusplus_current_path,${nl}"
255*74eea519SPatrick Williams
256*74eea519SPatrick Williams                outputs="${outputs}${ind}'client.hpp',${nl}"
257*74eea519SPatrick Williams                install="${install}${ind}get_option('includedir') / sdbusplus_current_path,${nl}"
258847a0c37SPatrick Williams                ;;
259d77548a1SPatrick Williams
260d77548a1SPatrick Williams            *)
261d77548a1SPatrick Williams                echo "Unknown interface type: ${s}"
262d77548a1SPatrick Williams                exit 1
263d77548a1SPatrick Williams                ;;
264847a0c37SPatrick Williams        esac
265847a0c37SPatrick Williams    done
266847a0c37SPatrick Williams
267847a0c37SPatrick Williams    # Create the target to generate the 'outputs'.
268d77548a1SPatrick Williams    cat >> "${mesondir}/meson.build" \
269847a0c37SPatrick Williams        << EOF
270847a0c37SPatrick Williamsgenerated_sources += custom_target(
271847a0c37SPatrick Williams    '$1__cpp'.underscorify(),
272*74eea519SPatrick Williams    input: [
273*74eea519SPatrick Williams${sources}    ],
274*74eea519SPatrick Williams    output: [
275*74eea519SPatrick Williams${outputs}    ],
276293c8a26SWilliam A. Kennington III    depend_files: sdbusplusplus_depfiles,
277847a0c37SPatrick Williams    command: [
278847a0c37SPatrick Williams        sdbuspp_gen_meson_prog, '--command', 'cpp',
279847a0c37SPatrick Williams        '--output', meson.current_build_dir(),
280847a0c37SPatrick Williams        '--tool', sdbusplusplus_prog,
281d77548a1SPatrick Williams        '--directory', meson.current_source_dir() / '${yamldir}',
282847a0c37SPatrick Williams        '$1',
283847a0c37SPatrick Williams    ],
284*74eea519SPatrick Williams    install: should_generate_cpp,
285*74eea519SPatrick Williams    install_dir: [
286*74eea519SPatrick Williams${install}    ],
287*74eea519SPatrick Williams    build_by_default: should_generate_cpp,
288847a0c37SPatrick Williams)
289847a0c37SPatrick Williams
290847a0c37SPatrick WilliamsEOF
291847a0c37SPatrick Williams}
292847a0c37SPatrick Williams
293847a0c37SPatrick Williams## Generate the meson target for the markdown files from a YAML interface.
294847a0c37SPatrick Williams## $1 - The interface to generate a target for.
295018b8ff1SPatrick Williamsfunction meson_md_target() {
296d77548a1SPatrick Williams    mesondir="${outputdir}/$(dirname "$1")"
297d77548a1SPatrick Williams    yamldir="$(realpath --relative-to="${mesondir}" "${rootdir}")"
298847a0c37SPatrick Williams
299847a0c37SPatrick Williams    # Determine the source files based on the YAMLs present.
300847a0c37SPatrick Williams    sources=""
3019ede18b4SPatrick Williams    for s in ${interfaces[$1]}; do
3025800d079SPatrick Williams        sources="${sources}'${yamldir}/$1.${s}', "
303847a0c37SPatrick Williams    done
304847a0c37SPatrick Williams
305847a0c37SPatrick Williams    # Create the target to generate the interface.md file.
306d77548a1SPatrick Williams    cat >> "${mesondir}/meson.build" \
307847a0c37SPatrick Williams        << EOF
308*74eea519SPatrick Williamsgenerated_markdown += custom_target(
309847a0c37SPatrick Williams    '$1__markdown'.underscorify(),
310d77548a1SPatrick Williams    input: [ ${sources} ],
311847a0c37SPatrick Williams    output: [ '$(basename "$1").md' ],
312293c8a26SWilliam A. Kennington III    depend_files: sdbusplusplus_depfiles,
313847a0c37SPatrick Williams    command: [
314847a0c37SPatrick Williams        sdbuspp_gen_meson_prog, '--command', 'markdown',
315847a0c37SPatrick Williams        '--output', meson.current_build_dir(),
316847a0c37SPatrick Williams        '--tool', sdbusplusplus_prog,
317d77548a1SPatrick Williams        '--directory', meson.current_source_dir() / '${yamldir}',
318847a0c37SPatrick Williams        '$1',
319847a0c37SPatrick Williams    ],
320*74eea519SPatrick Williams    install: should_generate_markdown,
321*74eea519SPatrick Williams    install_dir: [inst_markdown_dir / sdbusplus_current_path],
322*74eea519SPatrick Williams    build_by_default: should_generate_markdown,
323847a0c37SPatrick Williams)
324847a0c37SPatrick Williams
325847a0c37SPatrick WilliamsEOF
326847a0c37SPatrick Williams}
327847a0c37SPatrick Williams
32831607399SPatrick Williams## Generate the meson target for the registry files from a YAML interface.
32931607399SPatrick Williams## $1 - The interface to generate a target for.
33031607399SPatrick Williamsfunction meson_registry_target() {
33131607399SPatrick Williams    mesondir="${outputdir}/$(dirname "$1")"
33231607399SPatrick Williams    yamldir="$(realpath --relative-to="${mesondir}" "${rootdir}")"
33331607399SPatrick Williams
33431607399SPatrick Williams    # Determine the source and output files based on the YAMLs present.
33531607399SPatrick Williams    sources=""
33631607399SPatrick Williams    outputs=""
33731607399SPatrick Williams    for s in ${interfaces[$1]}; do
33831607399SPatrick Williams        case "${s}" in
33931607399SPatrick Williams            errors.yaml)
34031607399SPatrick Williams                ;;
34131607399SPatrick Williams
34231607399SPatrick Williams            events.yaml)
34331607399SPatrick Williams                sources="${sources}'${yamldir}/$1.${s}', "
34431607399SPatrick Williams                outputs="${outputs}'event.cpp', 'event.hpp', "
34531607399SPatrick Williams                ;;
34631607399SPatrick Williams
34731607399SPatrick Williams            interface.yaml)
34831607399SPatrick Williams                ;;
34931607399SPatrick Williams
35031607399SPatrick Williams            *)
35131607399SPatrick Williams                echo "Unknown interface type: ${s}"
35231607399SPatrick Williams                exit 1
35331607399SPatrick Williams                ;;
35431607399SPatrick Williams        esac
35531607399SPatrick Williams    done
35631607399SPatrick Williams
35731607399SPatrick Williams    if [[ -z "${sources}" ]]; then
35831607399SPatrick Williams        return
35931607399SPatrick Williams    fi
36031607399SPatrick Williams
36131607399SPatrick Williams    # Create the target to generate the interface.md file.
36231607399SPatrick Williams    cat >> "${mesondir}/meson.build" \
36331607399SPatrick Williams        << EOF
364*74eea519SPatrick Williamsgenerated_registry += custom_target(
36531607399SPatrick Williams    '$1__registry'.underscorify(),
36631607399SPatrick Williams    input: [ ${sources} ],
36731607399SPatrick Williams    output: [ '$(basename "$1").json' ],
36831607399SPatrick Williams    depend_files: sdbusplusplus_depfiles,
36931607399SPatrick Williams    command: [
37031607399SPatrick Williams        sdbuspp_gen_meson_prog, '--command', 'registry',
37131607399SPatrick Williams        '--output', meson.current_build_dir(),
37231607399SPatrick Williams        '--tool', sdbusplusplus_prog,
37331607399SPatrick Williams        '--directory', meson.current_source_dir() / '${yamldir}',
37431607399SPatrick Williams        '$1',
37531607399SPatrick Williams    ],
376*74eea519SPatrick Williams    install: should_generate_registry,
377*74eea519SPatrick Williams    install_dir: [inst_registry_dir / sdbusplus_current_path],
378*74eea519SPatrick Williams    build_by_default: should_generate_registry,
37931607399SPatrick Williams)
38031607399SPatrick Williams
38131607399SPatrick WilliamsEOF
38231607399SPatrick Williams}
38331607399SPatrick Williams
38431607399SPatrick Williams
385847a0c37SPatrick Williams## Handle command=meson by generating the tree of meson.build files.
386018b8ff1SPatrick Williamsfunction cmd_meson() {
387ce8d16d9SWillam A. Kennington III    # Find and sort all the YAML files
3880336a2fcSPatrick Williams    yamls="$(find "${rootdir}" -name '*.interface.yaml' -o -name '*.errors.yaml' -o -name '*.events.yaml')"
389ce8d16d9SWillam A. Kennington III    yamls="$(echo "${yamls}" | sort)"
390847a0c37SPatrick Williams
391847a0c37SPatrick Williams    # Assign the YAML files into the hash-table by interface name.
392d77548a1SPatrick Williams    for y in ${yamls}; do
393d77548a1SPatrick Williams        rel="$(realpath "--relative-to=${rootdir}" "${y}")"
394d77548a1SPatrick Williams        dir="$(dirname "${rel}")"
395847a0c37SPatrick Williams        ext="${rel#*.}"
396d77548a1SPatrick Williams        base="$(basename "${rel}" ".${ext}")"
397d77548a1SPatrick Williams        key="${dir}/${base}"
398847a0c37SPatrick Williams
399d77548a1SPatrick Williams        interfaces["${key}"]="${interfaces[${key}]} ${ext}"
400847a0c37SPatrick Williams    done
401847a0c37SPatrick Williams
402847a0c37SPatrick Williams    # Create the meson.build files.
403847a0c37SPatrick Williams    meson_create_root
404d77548a1SPatrick Williams    # shellcheck disable=SC2312
405847a0c37SPatrick Williams    sorted_ifaces="$(echo "${!interfaces[@]}" | tr " " "\n" | sort)"
406*74eea519SPatrick Williams    iface_parent_dirs="$(echo "${sorted_ifaces}" | xargs -n1 dirname)"
407*74eea519SPatrick Williams    # shellcheck disable=SC2312
408*74eea519SPatrick Williams    sorted_dirs="$(echo "${sorted_ifaces} ${iface_parent_dirs}" | tr " " "\n" | sort | uniq)"
4099ede18b4SPatrick Williams    for i in ${sorted_ifaces}; do
410d77548a1SPatrick Williams        meson_create_path "${i}"
411*74eea519SPatrick Williams    done
412*74eea519SPatrick Williams    for i in ${sorted_dirs}; do
413*74eea519SPatrick Williams        meson_insert_current_path "${i}"
414*74eea519SPatrick Williams    done
415*74eea519SPatrick Williams    for i in ${sorted_ifaces}; do
416d77548a1SPatrick Williams        meson_cpp_target "${i}"
417d77548a1SPatrick Williams        meson_md_target "${i}"
41831607399SPatrick Williams        meson_registry_target "${i}"
419847a0c37SPatrick Williams    done
420847a0c37SPatrick Williams}
421847a0c37SPatrick Williams
422847a0c37SPatrick Williams## Handle command=cpp by calling sdbus++ as appropriate.
423847a0c37SPatrick Williams## $1 - interface to generate.
424847a0c37SPatrick Williams##
425847a0c37SPatrick Williams## For an interface foo/bar, the outputdir is expected to be foo/bar.
426018b8ff1SPatrick Williamsfunction cmd_cpp() {
427847a0c37SPatrick Williams
428d77548a1SPatrick Williams    if [[ "" == "$1" ]]; then
429847a0c37SPatrick Williams        show_usage
430847a0c37SPatrick Williams        exit 1
431847a0c37SPatrick Williams    fi
432847a0c37SPatrick Williams
433d77548a1SPatrick Williams    if [[ ! -e "${rootdir}/$1.interface.yaml" ]] &&
4340336a2fcSPatrick Williams    [[ ! -e "${rootdir}/$1.errors.yaml" ]] &&
4350336a2fcSPatrick Williams    [[ ! -e "${rootdir}/$1.events.yaml" ]]; then
436847a0c37SPatrick Williams        echo "Missing YAML for $1."
437847a0c37SPatrick Williams        exit 1
438847a0c37SPatrick Williams    fi
439847a0c37SPatrick Williams
440d77548a1SPatrick Williams    mkdir -p "${outputdir}"
441847a0c37SPatrick Williams
442d77548a1SPatrick Williams    sdbusppcmd="${sdbuspp} -r ${rootdir}"
443847a0c37SPatrick Williams    intf="${1//\//.}"
444847a0c37SPatrick Williams
445d77548a1SPatrick Williams    if [[ -e "${rootdir}/$1.interface.yaml" ]]; then
4461caa5e8aSPatrick Williams        ${sdbusppcmd} interface common-header "${intf}" > "${outputdir}/common.hpp"
447d77548a1SPatrick Williams        ${sdbusppcmd} interface server-header "${intf}" > "${outputdir}/server.hpp"
448d77548a1SPatrick Williams        ${sdbusppcmd} interface server-cpp "${intf}" > "${outputdir}/server.cpp"
449d77548a1SPatrick Williams        ${sdbusppcmd} interface client-header "${intf}" > "${outputdir}/client.hpp"
4506403d56fSPatrick Williams        ${sdbusppcmd} interface aserver-header "${intf}" > "${outputdir}/aserver.hpp"
451847a0c37SPatrick Williams    fi
452847a0c37SPatrick Williams
453d77548a1SPatrick Williams    if [[ -e "${rootdir}/$1.errors.yaml" ]]; then
454d77548a1SPatrick Williams        ${sdbusppcmd} error exception-header "${intf}" > "${outputdir}/error.hpp"
455d77548a1SPatrick Williams        ${sdbusppcmd} error exception-cpp "${intf}" > "${outputdir}/error.cpp"
456847a0c37SPatrick Williams    fi
4570336a2fcSPatrick Williams
4580336a2fcSPatrick Williams    if [[ -e "${rootdir}/$1.events.yaml" ]]; then
4590336a2fcSPatrick Williams        ${sdbusppcmd} event exception-header "${intf}" > "${outputdir}/event.hpp"
4600336a2fcSPatrick Williams        ${sdbusppcmd} event exception-cpp "${intf}" > "${outputdir}/event.cpp"
4610336a2fcSPatrick Williams    fi
462847a0c37SPatrick Williams}
463847a0c37SPatrick Williams
464847a0c37SPatrick Williams## Handle command=markdown by calling sdbus++ as appropriate.
465847a0c37SPatrick Williams## $1 - interface to generate.
466847a0c37SPatrick Williams##
467847a0c37SPatrick Williams## For an interface foo/bar, the outputdir is expected to be foo.
468018b8ff1SPatrick Williamsfunction cmd_markdown() {
469847a0c37SPatrick Williams
470d77548a1SPatrick Williams    if [[ "" == "$1" ]]; then
471847a0c37SPatrick Williams        show_usage
472847a0c37SPatrick Williams        exit 1
473847a0c37SPatrick Williams    fi
474847a0c37SPatrick Williams
475d77548a1SPatrick Williams    if [[ ! -e "${rootdir}/$1.interface.yaml" ]] &&
4760336a2fcSPatrick Williams    [[ ! -e "${rootdir}/$1.errors.yaml" ]] &&
4770336a2fcSPatrick Williams    [[ ! -e "${rootdir}/$1.events.yaml" ]]; then
478847a0c37SPatrick Williams        echo "Missing YAML for $1."
479847a0c37SPatrick Williams        exit 1
480847a0c37SPatrick Williams    fi
481847a0c37SPatrick Williams
482d77548a1SPatrick Williams    mkdir -p "${outputdir}"
483847a0c37SPatrick Williams
484d77548a1SPatrick Williams    sdbusppcmd="${sdbuspp} -r ${rootdir}"
485847a0c37SPatrick Williams    intf="${1//\//.}"
486847a0c37SPatrick Williams    base="$(basename "$1")"
487847a0c37SPatrick Williams
488d77548a1SPatrick Williams    echo -n > "${outputdir}/${base}.md"
489d77548a1SPatrick Williams    if [[ -e "${rootdir}/$1.interface.yaml" ]]; then
490d77548a1SPatrick Williams        ${sdbusppcmd} interface markdown "${intf}" >> "${outputdir}/${base}.md"
491847a0c37SPatrick Williams    fi
492847a0c37SPatrick Williams
493d77548a1SPatrick Williams    if [[ -e "${rootdir}/$1.errors.yaml" ]]; then
494d77548a1SPatrick Williams        ${sdbusppcmd} error markdown "${intf}" >> "${outputdir}/${base}.md"
495847a0c37SPatrick Williams    fi
4960336a2fcSPatrick Williams
4970336a2fcSPatrick Williams    if [[ -e "${rootdir}/$1.events.yaml" ]]; then
4980336a2fcSPatrick Williams        ${sdbusppcmd} event markdown "${intf}" >> "${outputdir}/${base}.md"
4990336a2fcSPatrick Williams    fi
500847a0c37SPatrick Williams}
501847a0c37SPatrick Williams
50231607399SPatrick Williams## Handle command=registry by calling sdbus++ as appropriate.
50331607399SPatrick Williams## $1 - interface to generate.
50431607399SPatrick Williams##
50531607399SPatrick Williams## For an interface foo/bar, the outputdir is expected to be foo.
50631607399SPatrick Williamsfunction cmd_registry() {
50731607399SPatrick Williams
50831607399SPatrick Williams    if [[ "" == "$1" ]]; then
50931607399SPatrick Williams        show_usage
51031607399SPatrick Williams        exit 1
51131607399SPatrick Williams    fi
51231607399SPatrick Williams
51331607399SPatrick Williams    if [[ ! -e "${rootdir}/$1.events.yaml" ]]; then
51431607399SPatrick Williams        echo "Missing YAML for $1."
51531607399SPatrick Williams        exit 1
51631607399SPatrick Williams    fi
51731607399SPatrick Williams
51831607399SPatrick Williams    mkdir -p "${outputdir}"
51931607399SPatrick Williams
52031607399SPatrick Williams    sdbusppcmd="${sdbuspp} -r ${rootdir}"
52131607399SPatrick Williams    intf="${1//\//.}"
52231607399SPatrick Williams    base="$(basename "$1")"
52331607399SPatrick Williams
52431607399SPatrick Williams    if [[ -e "${rootdir}/$1.events.yaml" ]]; then
52531607399SPatrick Williams        ${sdbusppcmd} event exception-registry "${intf}" > "${outputdir}/${base}.json"
52631607399SPatrick Williams    fi
52731607399SPatrick Williams}
52831607399SPatrick Williams
52931607399SPatrick Williams
530847a0c37SPatrick Williams## Handle command=version.
531018b8ff1SPatrick Williamsfunction cmd_version() {
532847a0c37SPatrick Williams    show_version
533847a0c37SPatrick Williams}
534847a0c37SPatrick Williams
535d77548a1SPatrick Williams"cmd_${cmd}" "$*"
536