blob: a38b5fdaf85e6d9a418b504bca01203a22fbf7d9 [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."
}
# Ensure that no more than ${parallel} jobs are running at a time and if so
# wait for at least one to finish.
function wait_n {
while true;
do
if [[ $(jobs -r -p | wc -l) -ge $parallel ]];
then
wait -n
else
break
fi
done
}
sdbuspp="sdbus++"
outputdir="."
listall="no"
parallel=$(nproc)
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
for d in $@;
do
interfaces="$(find $d -name '*.interface.yaml')"
for i in $interfaces;
do
path="${i%.interface.yaml}"
iface="${path//\//.}"
mkdir -p $outputdir/$path
$sdbuspp interface server-header $iface > $outputdir/$path/server.hpp &
echo $outputdir/$path/server.hpp
wait_n
$sdbuspp interface server-cpp $iface > $outputdir/$path/server.cpp &
echo $outputdir/$path/server.cpp
wait_n
$sdbuspp interface client-header $iface > $outputdir/$path/client.hpp &
echo $outputdir/$path/client.hpp
wait_n
$sdbuspp interface markdown $iface > $outputdir/$path.md &
# markdown files aren't recognized as source files by meson, so don't
# emit them by default.
if [ "xyes" == "x$listall" ];
then
echo $outputdir/$path.md
fi
wait_n
done
wait # finish all before continuing
errors="$(find $d -name '*.errors.yaml')"
for e in $errors;
do
path="${e%.errors.yaml}"
iface="${path//\//.}"
mkdir -p $outputdir/$path
$sdbuspp error exception-header $iface > $outputdir/$path/error.hpp &
echo $outputdir/$path/error.hpp
wait_n
$sdbuspp error exception-cpp $iface > $outputdir/$path/error.cpp &
echo $outputdir/$path/error.cpp
wait_n
$sdbuspp error markdown $iface >> $outputdir/$path.md &
# markdown files aren't recognized as source files by meson, so don't
# emit them by default.
if [ "xyes" == "x$listall" ];
then
echo $outputdir/$path.md
fi
wait_n
done
wait # finish all before continuing
done