Boost logo

Boost Users :

From: Robbie Morrison (robbie_at_[hidden])
Date: 2007-10-19 16:00:03


Hi all

Postings here often comment on the amount of compiler
output generated when using Boost libraries.

I found the following script quite useful when trying
to track down both bad practice and real errors in my
own code. It works something like this:

  $ callfilter -6 make

This script filters the compiler output based on the
options -0 thru -7. Option -- has no effect and is
provided for typing convenience. Options -5 and -6 are
typically the most useful. Some comments at the start
of the script provide more information.

I find g++ -Weffc++ often rather helpful, but its use
definitely requires some form of output screening.

Here is the usage message for this script:

    usage: callfilter [-01234567] <call> modified call with output filtering
           callfilter -- <call> straight call (provided for convenience)
           callfilter --help|-h display usage message and quit
  purpose: append selected filters to build calls to suppress Boost library output
 additive: 0 2>&1
             1 | grep -v 'boost::' | grep -v 'std::tr1::'
             2 | grep -v '/include/boost-1_34_1/' | grep -v '/include/c++/4.1.2/tr1/'
             4 | grep -v 'instantiated from'
 examples: $ callfilter -- make
           $ callfilter -7 g++ -Wall -Weffc++ usingboost.cc -o usingboost

If anyone has improvements, let me know. I will
endeavor to incorporate these and then repost in a
couple of weeks.

cheers
Robbie Morrison

---
[from IMAP client]
#! /bin/bash
#  Copyright: (c) 2007 Robbie Morrison. All rights reserved.
#  License: Unrestricted reuse in any form, for any purpose.
#  Version: $Id: callfilter,v 1.7 2007/10/19 11:26:41 robbie Exp $
#  Purpose: take a command-line build call and append some
#  selected 'grep' filters to reduce the amount of output
#  displayed.  A build call could be just 'make' or perhaps
#  g++ with a string of arguments.  The individual filters
#  are intended to suppress the screenfulls of warnings
#  generated by Boost library headers, while leaving the
#  compiler messages that relate more directly to your code.
#  The ability to mix different combinations of filters is
#  often useful.  The UNIX 'grep' utility does the filtering
#  and -v is the 'invert-match' option.  This script can be
#  particularly valuable in combination with the '-Weffc++'
#  option for g++.  In fact, the script was developed
#  because of a comment suggesting such an approach on the
#  g++ manpage.
#
#  See also: for a more sophisticated approach,
#  refer to: http://www.bdsoft.com/tools/stlfilt.html
# define some suitable filters -- please modify to suit your needs
FILTER_0="2>&1"                         # useful when capturing output
FILTER_1="| grep -v 'boost::' | grep -v 'std::tr1::'"
FILTER_2="| grep -v '/include/boost-1_34_1/' | grep -v '/include/c++/4.1.2/tr1/'"
FILTER_4="| grep -v 'instantiated from'"
# preamble
SCRIPT=$(basename "$0")                 # for console reporting
# script exit codes
E_SUCCESS=0
E_USAGE=2
E_NO_GREP=3
# functions
function display_help                   # using simple echo statements
{
echo
echo "    usage: $SCRIPT  [-01234567]  <call>    modified call with output filtering"
echo "           $SCRIPT   --          <call>    straight call (provided for convenience)"
echo "           $SCRIPT   --help|-h             display usage message and quit"
echo "  purpose: append selected filters to build calls to suppress Boost library output"
echo " additive:   0   $FILTER_0"
echo "             1   $FILTER_1"
echo "             2   $FILTER_2"
echo "             4   $FILTER_4"
echo " examples: \$ $SCRIPT -- make"
echo "           \$ $SCRIPT -7 g++ -Wall -Weffc++ usingboost.cc -o usingboost"
echo
}
function make_filter                    # with conventional rather than bitwise arithmetic
{
    local base=4                        # option range is from 0 to (2 ** base - 1)
    local num=${opt#-}                  # strip leading -
    while [ $base -gt 0 ]
      do
      if [ $num -ge $base ]
          then
          let "num = num % base"        # remainder operator
          case "$base" in
              1) filter="$FILTER_1 $filter" ;;
              2) filter="$FILTER_2 $filter" ;;
              4) filter="$FILTER_4 $filter" ;;
          esac
      fi
      let "base = base / 2"             # divide by two
    done
    filter="$FILTER_0 $filter"
}
# process our part of the command-line
case "$1" in
    --help|--hel|--he|--h|-help|-hel|-he|-h|-\?)
        display_help
        exit $E_SUCCESS
        ;;
    -[0-7])
        opt="$1"
        shift
        make_filter
        ;;
    --)
        shift
        ;;
    "")
        echo "$SCRIPT: try --help for usage"
        exit $E_USAGE
        ;;
esac
# confirm that grep is present on the system
if [ ! $(which grep) ]
    then
    echo "$SCRIPT: required utility not found: grep"
    echo "$SCRIPT: unable to continue"
    exit $E_NO_GREP
fi
# active code
echo "$SCRIPT: call   : $*"
echo "$SCRIPT: filter : $filter"
eval "$* $filter"                       # actual call
# housekeeping
exit $E_SUCCESS
# end of file

Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net