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