1*4882a593Smuzhiyun#! /usr/bin/perl 2*4882a593Smuzhiyun# 3*4882a593Smuzhiyun# checkversion find uses of LINUX_VERSION_CODE or KERNEL_VERSION 4*4882a593Smuzhiyun# without including <linux/version.h>, or cases of 5*4882a593Smuzhiyun# including <linux/version.h> that don't need it. 6*4882a593Smuzhiyun# Copyright (C) 2003, Randy Dunlap <rdunlap@xenotime.net> 7*4882a593Smuzhiyun 8*4882a593Smuzhiyunuse strict; 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun$| = 1; 11*4882a593Smuzhiyun 12*4882a593Smuzhiyunmy $debugging; 13*4882a593Smuzhiyun 14*4882a593Smuzhiyunforeach my $file (@ARGV) { 15*4882a593Smuzhiyun next if $file =~ "include/linux/version\.h"; 16*4882a593Smuzhiyun # Open this file. 17*4882a593Smuzhiyun open( my $f, '<', $file ) 18*4882a593Smuzhiyun or die "Can't open $file: $!\n"; 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun # Initialize variables. 21*4882a593Smuzhiyun my ($fInComment, $fInString, $fUseVersion); 22*4882a593Smuzhiyun my $iLinuxVersion = 0; 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun while (<$f>) { 25*4882a593Smuzhiyun # Strip comments. 26*4882a593Smuzhiyun $fInComment && (s+^.*?\*/+ +o ? ($fInComment = 0) : next); 27*4882a593Smuzhiyun m+/\*+o && (s+/\*.*?\*/+ +go, (s+/\*.*$+ +o && ($fInComment = 1))); 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun # Pick up definitions. 30*4882a593Smuzhiyun if ( m/^\s*#/o ) { 31*4882a593Smuzhiyun $iLinuxVersion = $. if m/^\s*#\s*include\s*"linux\/version\.h"/o; 32*4882a593Smuzhiyun } 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun # Strip strings. 35*4882a593Smuzhiyun $fInString && (s+^.*?"+ +o ? ($fInString = 0) : next); 36*4882a593Smuzhiyun m+"+o && (s+".*?"+ +go, (s+".*$+ +o && ($fInString = 1))); 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun # Pick up definitions. 39*4882a593Smuzhiyun if ( m/^\s*#/o ) { 40*4882a593Smuzhiyun $iLinuxVersion = $. if m/^\s*#\s*include\s*<linux\/version\.h>/o; 41*4882a593Smuzhiyun } 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun # Look for uses: LINUX_VERSION_CODE, KERNEL_VERSION, UTS_RELEASE 44*4882a593Smuzhiyun if (($_ =~ /LINUX_VERSION_CODE/) || ($_ =~ /\WKERNEL_VERSION/)) { 45*4882a593Smuzhiyun $fUseVersion = 1; 46*4882a593Smuzhiyun last if $iLinuxVersion; 47*4882a593Smuzhiyun } 48*4882a593Smuzhiyun } 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun # Report used version IDs without include? 51*4882a593Smuzhiyun if ($fUseVersion && ! $iLinuxVersion) { 52*4882a593Smuzhiyun print "$file: $.: need linux/version.h\n"; 53*4882a593Smuzhiyun } 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun # Report superfluous includes. 56*4882a593Smuzhiyun if ($iLinuxVersion && ! $fUseVersion) { 57*4882a593Smuzhiyun print "$file: $iLinuxVersion linux/version.h not needed.\n"; 58*4882a593Smuzhiyun } 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun # debug: report OK results: 61*4882a593Smuzhiyun if ($debugging) { 62*4882a593Smuzhiyun if ($iLinuxVersion && $fUseVersion) { 63*4882a593Smuzhiyun print "$file: version use is OK ($iLinuxVersion)\n"; 64*4882a593Smuzhiyun } 65*4882a593Smuzhiyun if (! $iLinuxVersion && ! $fUseVersion) { 66*4882a593Smuzhiyun print "$file: version use is OK (none)\n"; 67*4882a593Smuzhiyun } 68*4882a593Smuzhiyun } 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun close($f); 71*4882a593Smuzhiyun} 72