blob: 518d43bdde2688c6ee5a4b2d0dbe5f0000705312 [file] [log] [blame]
#!/usr/bin/env bash
set -e
function show_usage {
echo "Usage: $0 [options] <dirs>+"
echo
echo "Generate the sdbus++ sources from a directory path."
echo
echo "Options:"
echo " --tool <path> - path to processing tool (default 'sdbus++')."
echo " --output <path> - directory to place output files (default '.')."
echo " --list-all - include all generated files in stdout list."
echo " --jobs <N> - number to run in parallel (default: $(nproc))."
echo " <dirs>+ - any number of subdirectories to generate."
echo
echo "The output on stdout is a list of generated files, which is intended"
echo "to be consumed by build systems, such as Meson."
echo
echo "This tool, by default, generates all files that are able to be"
echo "created by sdbus++. The output is a list of compilable sources that"
echo "were generated by the tool. The tool may generate outputs which are"
echo "not able to be compiled, such as documentation, but it does not put"
echo "them into stdout unless --list-all is given."
}
sdbuspp="sdbus++"
outputdir="."
listall="no"
parallel=$(nproc || cat /proc/cpuinfo | grep ^processor | wc -l)
options="$(getopt -o ho:t:j: --long help,list-all,output:,tool:,jobs: -- "$@")"
eval set -- "$options"
while true;
do
case "$1" in
-h | --help)
show_usage
exit
;;
-j | --jobs)
shift
parallel="$1"
shift
;;
--list-all)
listall="yes"
shift
;;
-o | --output)
shift
outputdir="$1"
shift
;;
-t | --tool)
shift
sdbuspp="$1"
shift
;;
--)
shift
break
;;
esac
done
if [ "x" == "x$@" ];
then
show_usage
exit 1
fi
# generate_single -- make a single call to sdbus++.
# $1: sdbus++ TYPE
# $2: sdbus++ PROCESS
# $3: sdbus++ ITEM
# $4: relative output file
# $5: 'append-mode' if present.
function generate_single {
if [ "xempty" == "x$1" ];
then
echo -n > $outputdir/$4
elif [ "x" == "x$5" ];
then
$sdbuspp $1 $2 $3 > $outputdir/$4 &
else
$sdbuspp $1 $2 $3 >> $outputdir/$4 &
fi
# Always emit generated file name for foo-cpp and foo-header.
# Conditionally emit for everything else depending on $listall.
case "$2" in
*-cpp | *-header)
echo $outputdir/$4
;;
*)
if [ "xyes" == "x$listall" ];
then
echo $outputdir/$4
fi
;;
esac
# Ensure that no more than ${parallel} jobs are running at a time and if so
# wait for at least one to finish.
while [[ $(jobs -r -p | wc -l) -ge $parallel ]];
do
wait -n
done
}
for d in $@;
do
interfaces="$(find $d -name '*.interface.yaml')"
errors="$(find $d -name '*.errors.yaml')"
# Some files are created from multiple YAML sources, but we don't know
# which YAML sources are present. For these files, we need to first
# create an empty file to ensure the file does not carry old data from
# a previous run.
for y in $interfaces $errors;
do
path="${y%.interface.yaml}"
path="${path%.errors.yaml}"
iface="${path//\//.}"
mkdir -p $outputdir/$path
generate_single empty markdown $iface $path.md
done
for i in $interfaces;
do
path="${i%.interface.yaml}"
iface="${path//\//.}"
generate_single interface server-header $iface $path/server.hpp
generate_single interface server-cpp $iface $path/server.cpp
generate_single interface client-header $iface $path/client.hpp
generate_single interface markdown $iface $path.md append
done
wait # finish all before continuing
for e in $errors;
do
path="${e%.errors.yaml}"
iface="${path//\//.}"
generate_single error exception-header $iface $path/error.hpp
generate_single error exception-cpp $iface $path/error.cpp
generate_single error markdown $iface $path.md append
done
wait # finish all before continuing
done