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