blob: 1b757cce6d107fab05d3b2f893535c3e616a8b58 [file] [log] [blame]
#!/bin/bash
#
# Copyright (c) 2020, The OpenThread Authors.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# 3. Neither the name of the copyright holder nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
set -euxo pipefail
OT_MERGED_PROFILES=merged_profiles
readonly OT_MERGED_PROFILES
OT_GCOV_PREFIX_BASE=ot-run
readonly OT_GCOV_PREFIX_BASE
merge_profiles()
{
local profile_current="$1"
local profile_merged="$2"
[[ -d ${profile_current} ]] || return 0
local profile_temporary="${profile_merged}.tmp"
gcov-tool merge "${profile_current}" "${profile_merged}" -o "${profile_temporary}" || return 0
cp -r "${profile_temporary}"/* "${profile_merged}"
rm -rf "${profile_temporary}"
}
do_clean()
{
rm -rfv "${OT_MERGED_PROFILES}" "${OT_GCOV_PREFIX_BASE}" || sudo rm -rfv "${OT_MERGED_PROFILES}" "${OT_GCOV_PREFIX_BASE}"
}
do_collect()
{
[[ -d ${OT_GCOV_PREFIX_BASE} ]] || return 0
sudo chown -R "$USER" "${OT_GCOV_PREFIX_BASE}"
while read -r node_gcda; do
while read -r build_name; do
local profile_current="${node_gcda}/$PWD/build/${build_name}"
local profile_merged="${OT_MERGED_PROFILES}/build/${build_name}"
if [[ -d ${profile_merged} ]]; then
merge_profiles "${profile_current}" "${profile_merged}"
rm -rf "${profile_current}"
else
mkdir -p "$(dirname "${profile_merged}")"
mv "${profile_current}" "${profile_merged}"
fi
done < <(ls "${node_gcda}/$PWD/build")
done < <(find "${OT_GCOV_PREFIX_BASE}" -type d -name 'ot-gcda.*')
}
do_install()
{
[[ -d ${OT_MERGED_PROFILES} ]] || return 0
while read -r build_name; do
local profile_current="build/${build_name}"
local profile_merged="${OT_MERGED_PROFILES}/build/${build_name}"
merge_profiles "${profile_current}" "${profile_merged}"
done < <(ls "build")
sudo chown -R "$USER" build
cp -r "${OT_MERGED_PROFILES}"/build/* build
rm -rf "${OT_MERGED_PROFILES}" "${OT_GCOV_PREFIX_BASE}"
}
main()
{
case $1 in
collect)
do_collect
;;
install)
do_install
;;
clean)
do_clean
;;
*)
false
;;
esac
}
main "$@"