| #!/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 "$@" |