#!/bin/bash # # Run Valgrind, condensing logged reports into an exit code. # # Copyright (C) 2014 Red Hat # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . set -o nounset -o pipefail -o errexit shopt -s extglob function usage() { cat <&2 usage >&2 exit 1 fi declare error_exitcode="$1"; shift declare -a path_pattern_list=() declare arg declare got_dash_dash declare program_path declare path_pattern declare match declare program_name declare status=0 # Extract path patterns while [[ $# != 0 ]]; do arg="$1" shift if [[ "$arg" == "--" ]]; then break else path_pattern_list+=("$arg") fi done # Find program path argument got_dash_dash=false for arg in "$@"; do if [[ "$arg" == "--" ]]; then got_dash_dash=true elif "$got_dash_dash" || [[ "$arg" != -* ]]; then program_path="$arg" break fi done if [[ -z "${program_path+set}" ]]; then echo "Program path not specified." >&2 usage >&2 exit 1 fi # Match against path patterns, if any if [[ ${#path_pattern_list[@]} != 0 ]]; then match=false for path_pattern in "${path_pattern_list[@]}"; do if [[ "$program_path" == $path_pattern ]]; then match=true fi done if ! $match; then exit 0 fi fi # Generate original path from libtool path program_path=`sed -e 's/^\(.*\/\)\?\.libs\/lt-\([^\/]\+\)$/\1\2/' \ <<<"$program_path"` program_name=`basename "$program_path"` rm -f "$program_name".*.valgrind.log valgrind --log-file="$program_name.%p.valgrind.log" "$@" || status=$? if grep -q '^==[0-9]\+== *ERROR SUMMARY: *[1-9]' \ "$program_name".*.valgrind.log; then exit "$error_exitcode" else exit "$status" fi