blob: 921645b843c1893d432f4fdeb1ce387168ca3edc [file] [log] [blame]
Patrick Williams185d2792020-05-19 16:41:45 -05001#!/usr/bin/env bash
2
3set -e
4
5function show_usage {
6 echo "Usage: $0 [options] <dirs>+"
7 echo
8 echo "Generate the sdbus++ sources from a directory path."
9 echo
10 echo "Options:"
11 echo " --tool <path> - path to processing tool (default 'sdbus++')."
12 echo " --output <path> - directory to place output files (default '.')."
13 echo " --list-all - include all generated files in stdout list."
Patrick Williamsbb140d12020-06-05 16:29:10 -050014 echo " --jobs <N> - number to run in parallel (default: $(nproc))."
Patrick Williams185d2792020-05-19 16:41:45 -050015 echo " <dirs>+ - any number of subdirectories to generate."
16 echo
17 echo "The output on stdout is a list of generated files, which is intended"
18 echo "to be consumed by build systems, such as Meson."
19 echo
20 echo "This tool, by default, generates all files that are able to be"
21 echo "created by sdbus++. The output is a list of compilable sources that"
22 echo "were generated by the tool. The tool may generate outputs which are"
23 echo "not able to be compiled, such as documentation, but it does not put"
24 echo "them into stdout unless --list-all is given."
25}
26
27sdbuspp="sdbus++"
28outputdir="."
29listall="no"
Patrick Williamse113b202020-06-09 14:10:22 -050030parallel=$(nproc || cat /proc/cpuinfo | grep ^processor | wc -l)
Patrick Williams185d2792020-05-19 16:41:45 -050031
Patrick Williamsbb140d12020-06-05 16:29:10 -050032options="$(getopt -o ho:t:j: --long help,list-all,output:,tool:,jobs: -- "$@")"
Patrick Williams185d2792020-05-19 16:41:45 -050033eval set -- "$options"
34
Patrick Williamsbb140d12020-06-05 16:29:10 -050035while true;
36do
Patrick Williams185d2792020-05-19 16:41:45 -050037 case "$1" in
38 -h | --help)
39 show_usage
40 exit
41 ;;
42
Patrick Williamsbb140d12020-06-05 16:29:10 -050043 -j | --jobs)
44 shift
45 parallel="$1"
46 shift
47 ;;
48
Patrick Williams185d2792020-05-19 16:41:45 -050049 --list-all)
50 listall="yes"
51 shift
52 ;;
53
54 -o | --output)
55 shift
Patrick Williamsbb140d12020-06-05 16:29:10 -050056 outputdir="$1"
Patrick Williams185d2792020-05-19 16:41:45 -050057 shift
58 ;;
59
60 -t | --tool)
61 shift
Patrick Williamsbb140d12020-06-05 16:29:10 -050062 sdbuspp="$1"
Patrick Williams185d2792020-05-19 16:41:45 -050063 shift
64 ;;
65
66 --)
67 shift
68 break
69 ;;
Patrick Williams185d2792020-05-19 16:41:45 -050070 esac
71done
72
73if [ "x" == "x$@" ];
74then
75 show_usage
76 exit 1
77fi
78
Patrick Williamsb2bc0c72020-06-19 09:52:50 -050079declare -A emitted_file_names
Patrick Williams0b2e48e2020-06-09 14:49:06 -050080# generate_single -- make a single call to sdbus++.
81# $1: sdbus++ TYPE
82# $2: sdbus++ PROCESS
83# $3: sdbus++ ITEM
84# $4: relative output file
85# $5: 'append-mode' if present.
86function generate_single {
Patrick Williams0b731e02020-06-19 09:49:50 -050087
88 if [ "xempty" == "x$1" ];
89 then
90 echo -n > $outputdir/$4
91 elif [ "x" == "x$5" ];
Patrick Williams0b2e48e2020-06-09 14:49:06 -050092 then
93 $sdbuspp $1 $2 $3 > $outputdir/$4 &
94 else
95 $sdbuspp $1 $2 $3 >> $outputdir/$4 &
96 fi
97
Patrick Williamsb2bc0c72020-06-19 09:52:50 -050098 # Emit filename as needed.
99 filename=$outputdir/$4
100 if [ "x1" != "x${emitted_file_names[$filename]}" ];
101 then
102 emitted_file_names[$filename]="1"
Patrick Williams0b2e48e2020-06-09 14:49:06 -0500103
Patrick Williamsb2bc0c72020-06-19 09:52:50 -0500104 # Always emit generated file name for foo-cpp and foo-header.
105 # Conditionally emit for everything else depending on $listall.
106 case "$2" in
107 *-cpp | *-header)
108 echo $filename
109 ;;
110
111 *)
112 if [ "xyes" == "x$listall" ];
113 then
114 echo $filename
115 fi
116 ;;
117 esac
118 fi
Patrick Williams0b2e48e2020-06-09 14:49:06 -0500119
120 # Ensure that no more than ${parallel} jobs are running at a time and if so
121 # wait for at least one to finish.
122 while [[ $(jobs -r -p | wc -l) -ge $parallel ]];
123 do
124 wait -n
125 done
126}
127
Patrick Williams185d2792020-05-19 16:41:45 -0500128for d in $@;
129do
130 interfaces="$(find $d -name '*.interface.yaml')"
Patrick Williams0b731e02020-06-19 09:49:50 -0500131 errors="$(find $d -name '*.errors.yaml')"
132
133 # Some files are created from multiple YAML sources, but we don't know
134 # which YAML sources are present. For these files, we need to first
135 # create an empty file to ensure the file does not carry old data from
136 # a previous run.
137 for y in $interfaces $errors;
138 do
139 path="${y%.interface.yaml}"
140 path="${path%.errors.yaml}"
141 iface="${path//\//.}"
142
143 mkdir -p $outputdir/$path
144 generate_single empty markdown $iface $path.md
145 done
Patrick Williams185d2792020-05-19 16:41:45 -0500146
147 for i in $interfaces;
148 do
149 path="${i%.interface.yaml}"
150 iface="${path//\//.}"
151
Patrick Williams0b2e48e2020-06-09 14:49:06 -0500152 generate_single interface server-header $iface $path/server.hpp
153 generate_single interface server-cpp $iface $path/server.cpp
154 generate_single interface client-header $iface $path/client.hpp
Patrick Williams0b731e02020-06-19 09:49:50 -0500155 generate_single interface markdown $iface $path.md append
Patrick Williams185d2792020-05-19 16:41:45 -0500156
Patrick Williams185d2792020-05-19 16:41:45 -0500157 done
Patrick Williamsbb140d12020-06-05 16:29:10 -0500158 wait # finish all before continuing
Patrick Williams185d2792020-05-19 16:41:45 -0500159
Patrick Williams185d2792020-05-19 16:41:45 -0500160
161 for e in $errors;
162 do
163 path="${e%.errors.yaml}"
164 iface="${path//\//.}"
165
Patrick Williams0b2e48e2020-06-09 14:49:06 -0500166 generate_single error exception-header $iface $path/error.hpp
167 generate_single error exception-cpp $iface $path/error.cpp
168 generate_single error markdown $iface $path.md append
Patrick Williams185d2792020-05-19 16:41:45 -0500169
Patrick Williams185d2792020-05-19 16:41:45 -0500170 done
Patrick Williamsbb140d12020-06-05 16:29:10 -0500171 wait # finish all before continuing
Patrick Williams185d2792020-05-19 16:41:45 -0500172done