[master] Update dependencies from dotnet/corefx (#25564)
[platform/upstream/coreclr.git] / run-cppcheck.sh
1 #!/usr/bin/env bash
2
3 # This script automatically runs the basic cppcheck and sloccount tools to generate a static analysis report.
4
5 usage()
6 {
7     echo "Usage: run-cppcheck.sh [options] [files]"
8     echo "Option:                   Description"
9     echo "  --no-sloccount          Don't run sloccount"
10     echo "  --no-cppcheck           Don't run cppcheck"
11     echo "  --cppcheck-out <file>   Output file for cppcheck step.  Default cppcheck.xml"
12     echo "  --sloccount-out <file>  Output file for sloccount step.  Default sloccount.sc"
13     echo "Files:"
14     echo "  files                   Files to run cppcheck through.  Default src/**"
15 }
16
17 check_dependencies()
18 {
19     # Check presence of cppcheck on the path
20     if [ "$RunCppCheck" == true ]
21     then
22         hash cppcheck 2>/dev/null || { echo >&2 "Please install cppcheck before running this script"; exit 1; }
23     fi
24     
25     # Check presence of sloccount on the path
26     if [ "$RunSlocCount" == true ]
27     then
28         hash sloccount 2>/dev/null || { echo >&2 "Please install sloccount before running this script"; exit 1; }
29     fi
30 }
31
32 ProjectRoot="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
33 RunSlocCount=true
34 RunCppCheck=true
35 Files="$ProjectRoot/src/**"
36 FilesFromArgs=""
37 CppCheckOutput="cppcheck.xml"
38 SloccountOutput="sloccount.sc"
39 # Get the number of processors available to the scheduler
40 # Other techniques such as `nproc` only get the number of
41 # processors available to a single process.
42 if [ `uname` = "FreeBSD" ]; then
43 NumProc=`sysctl hw.ncpu | awk '{ print $2+1 }'`
44 elif [ `uname` = "NetBSD" ]; then
45 NumProc=$(($(getconf NPROCESSORS_ONLN)+1))
46 else
47 NumProc=$(($(getconf _NPROCESSORS_ONLN)+1))
48 fi
49
50 while [[ $# > 0 ]]
51 do
52     opt="$1"
53     shift
54     case $opt in
55         -?|-h|--help)
56         usage
57         exit 1
58         ;;
59         --no-sloccount)
60         RunSlocCount=false
61         ;;
62         --no-cppcheck)
63         RunCppCheck=false
64         ;;
65         --cppcheck-out)
66         CppCheckOutput=$1
67         shift
68         ;;
69         --sloccount-out)
70         SloccountOutput=$1
71         shift
72         ;;
73         --*)
74         echo "Unrecognized option: $opt"
75         usage
76         exit 1
77         ;;
78         *)
79         FilesFromArgs="$FilesFromArgs $opt"
80     esac
81 done
82
83 if [ "$FilesFromArgs" != "" ];
84 then
85     Files=$FilesFromArgs
86 fi
87
88 if [ "$CppCheckOutput" == "" ];
89 then
90     echo "Expected: file for cppcheck output"
91     usage
92     exit 1
93 fi
94
95 if [ "$SloccountOutput" == "" ];
96 then
97     echo "Expected: file for sloccount output"
98     usage
99     exit 1
100 fi
101
102 check_dependencies
103
104 if [ "$RunCppCheck" == true ]
105 then
106     echo "Running cppcheck for files: $Files"
107     cppcheck --enable=all -j $NumProc --xml --xml-version=2 --force $Files 2> $CppCheckOutput
108     CppCheckOutputs="$CppCheckOutput (cppcheck)"
109 fi
110
111 if [ "$RunSlocCount" == true ]
112 then
113     echo "Running sloccount for files: $Files"
114     sloccount --wide --details $Files > $SloccountOutput
115     SlocCountOutputs="$SloccountOutput (sloccount)"
116 fi
117
118 echo Check finished.  Results can be found in: $CppCheckOutputs $SlocCountOutputs
119 exit 0