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