Home | History | Annotate | Download | only in utils
      1 #!/bin/sh
      2 ##===- utils/llvmdo - Counts Lines Of Code -------------------*- Script -*-===##
      3 # 
      4 #                     The LLVM Compiler Infrastructure
      5 #
      6 # This file is distributed under the University of Illinois Open Source
      7 # License. See LICENSE.TXT for details.
      8 # 
      9 ##===----------------------------------------------------------------------===##
     10 #
     11 # This script is a general purpose "apply" function for the source files in LLVM
     12 # It uses "find" to locate all the source files and then applies the user's 
     13 # command to them. As such, this command is often not used by itself much but
     14 # the other find related tools (countloc.sh,llvmgrep,getsrcs.sh,userloc.sh) are
     15 # all based on this script.  This script defines "what is a source file" in 
     16 # LLVM and so should be maintained if new directories, new file extensions, 
     17 # etc. are used in LLVM as it progresses.
     18 #
     19 # Usage:
     20 #  llvmdo [-topdir DIR] [-dirs "DIRNAMES..."] [-code-only] PROGRAM ARGS...
     21 #
     22 # The -topdir option allows you to specify the llvm source root directly. If it
     23 # is not specified then it will be obtained with llvm-config which must be built
     24 # and in your path.
     25 #
     26 # The -dirs argument allows you to specify the set of directories that are 
     27 # searched. The default list of directories searched is:
     28 #   include lib tools utils runtime autoconf docs test examples projects
     29 # Note that you must use quotes around the list of directory names. 
     30 #
     31 # The -code-only option specifies that only those files that are considered 
     32 # "code" should be visited. HTML documentation is considered code, but things 
     33 # like README files, etc. are not.
     34 #
     35 # Finally, you simply specify whatever program you want to run against each 
     36 # file and the arguments to give it. The PROGRAM will be given the file name 
     37 # as its last argument.
     38 ##===----------------------------------------------------------------------===##
     39 
     40 if test $# -lt 1 ; then
     41   echo "Usage: llvmdo [-topdir DIR] [-dirs "DIRNAMES..."] [-code-only] PROGRAM ARGS..."
     42   exit 1
     43 fi
     44 
     45 if test "$1" = "-topdir" ; then
     46   TOPDIR="$2"
     47   shift; shift;
     48 else
     49   TOPDIR=`llvm-config --src-root`
     50 fi
     51 
     52 if test "$1" = "-dirs" ; then
     53   LLVMDO_DIRS="$2"
     54   shift ; shift
     55 elif test -z "$LLVMDO_DIRS" ; then
     56   LLVMDO_DIRS="include lib tools utils runtime autoconf docs test examples projects cmake"
     57 fi
     58 
     59 if test "$1" = "-code-only" ; then
     60   CODE_ONLY="set"
     61   shift
     62 else
     63   CODE_ONLY=""
     64 fi
     65 
     66 if test "$1" = "" ; then
     67   echo "Missing program name to run"
     68   exit 1
     69 fi
     70 
     71 PROGRAM=`which $1`
     72 if test ! -x "$PROGRAM" ; then
     73   echo "Can't execute $1"
     74   exit 1
     75 fi
     76 shift;
     77 
     78 paths_to_ignore="\
     79   -path */.svn/ -o \
     80   -path */.svn/* -o \
     81   -path docs/doxygen/* -o \
     82   -path docs/CommandGuide/html/* -o \
     83   -path docs/CommandGuide/man/* -o \
     84   -path docs/CommandGuide/ps/* -o \
     85   -path docs/CommandGuide/man/* -o \
     86   -path docs/HistoricalNotes/* -o \
     87   -path docs/img/* -o \
     88   -path */.libs/* -o \
     89   -path lib/Support/bzip2/* -o \
     90   -path projects/llvm-test/* \
     91 "
     92 files_to_match="\
     93      -name *.ac \
     94   -o -name *.b \
     95   -o -name *.c \
     96   -o -name *.cc \
     97   -o -name *.cfg \
     98   -o -name *.cpp \
     99   -o -name *.css \
    100   -o -name *.def \
    101   -o -name *.el \
    102   -o -name *.exp \
    103   -o -name *.footer \
    104   -o -name *.gnuplot' \
    105   -o -name *.h \
    106   -o -name *.header \
    107   -o -name *.html \
    108   -o -name *.in \
    109   -o -name *.inc \
    110   -o -name *.intro \
    111   -o -name *.l \
    112   -o -name *.ll \
    113   -o -name *.lst \
    114   -o -name *.m4 \
    115   -o -name *.pod \
    116   -o -name *.pl \
    117   -o -name *.py \
    118   -o -name *.sh \
    119   -o -name *.schema \
    120   -o -name *.st \
    121   -o -name *.tcl \
    122   -o -name *.td \
    123   -o -name *.tr \
    124   -o -name *.y \
    125   -o -name Make* \
    126   -o -name *.cmake \
    127   -o -name llvmdo \
    128   -o -name llvmgrep \
    129   -o -name check-each-file \
    130   -o -name codgen-diff \
    131   -o -name llvm-native-gcc \
    132   -o -name llvm-native-gxx \
    133   -o -name makellvm \
    134   -o -path include/llvm/ADT/ilist \
    135   -o -path test/\*.ll \
    136   -o -path test/Scripts/not \
    137   -o -path runtime/\*.ll \
    138 "
    139 if test -z "$CODE_ONLY" ; then
    140   files_to_match="$files_to_match \
    141     -o -name *.txt \
    142     -o -name *.TXT \
    143     -o -name *.vim \
    144     -o -name vimrc \
    145     -o -name README \
    146     -o -name COPYING.LIB \
    147     -o -name LICENSE* "
    148 fi
    149 files_to_ignore="\
    150      -name \.* \
    151   -o -name *~ \
    152   -o -name #* \
    153   -o -name configure \
    154   -o -name slow.ll \
    155   -o -name *libtool* \
    156   -o -name ltdl* \
    157   -o -name ltdl.m4 \
    158   -o -name ltmain.m4 \
    159   -o -name ltmain.sh \
    160   -o -name aclocal.m4 \
    161   -o -name acinclude.m4 \
    162   -o -name *LoopSimplifyCrash.ll \
    163   -o -name *AST-Remove.ll \
    164   -o -name PPCPerfectShuffle.h \
    165 "
    166 
    167 if test -d "$TOPDIR" ; then
    168   cd $TOPDIR
    169   # Have to use the right "find" on a per-platform basis. Most platforms have
    170   # Gnu find as "find", but Solaris does not.
    171   case `uname -s` in
    172     SunOS) find_prog=gfind ;;
    173     *) find_prog=find ;;
    174   esac
    175   # Turn off file name generation (globbing) so that substitution of the
    176   # variables doesn't cause the shell to create lists of file names
    177   set -f
    178   $find_prog $LLVMDO_DIRS -type f \
    179     \( $paths_to_ignore \) -prune \
    180     -o \( \( $files_to_match \) \! \( $files_to_ignore \) \
    181     -exec $PROGRAM "$@" {} \; \)
    182 else
    183   echo "Can't find LLVM top directory in $TOPDIR"
    184 fi
    185