1cb77f0d6SKamil Rytarowski#! /usr/bin/env perl 2b2441318SGreg Kroah-Hartman# SPDX-License-Identifier: GPL-2.0 31da177e4SLinus Torvalds# 4*54eacba0SRandy Dunlap# checkversion finds uses of all macros in <linux/version.h> 5*54eacba0SRandy Dunlap# where the source files do not #include <linux/version.h>; or cases 6*54eacba0SRandy Dunlap# of including <linux/version.h> where it is not needed. 7*54eacba0SRandy Dunlap# Copyright (C) 2003, Randy Dunlap <[email protected]> 81da177e4SLinus Torvalds 9a208868fSStephen Hemmingeruse strict; 10a208868fSStephen Hemminger 111da177e4SLinus Torvalds$| = 1; 121da177e4SLinus Torvalds 13a208868fSStephen Hemmingermy $debugging; 141da177e4SLinus Torvalds 15a208868fSStephen Hemmingerforeach my $file (@ARGV) { 16*54eacba0SRandy Dunlap next if $file =~ "include/generated/uapi/linux/version\.h"; 17*54eacba0SRandy Dunlap next if $file =~ "usr/include/linux/version\.h"; 181da177e4SLinus Torvalds # Open this file. 19a208868fSStephen Hemminger open( my $f, '<', $file ) 20a208868fSStephen Hemminger or die "Can't open $file: $!\n"; 211da177e4SLinus Torvalds 221da177e4SLinus Torvalds # Initialize variables. 23a208868fSStephen Hemminger my ($fInComment, $fInString, $fUseVersion); 241da177e4SLinus Torvalds my $iLinuxVersion = 0; 251da177e4SLinus Torvalds 26a208868fSStephen Hemminger while (<$f>) { 271da177e4SLinus Torvalds # Strip comments. 281da177e4SLinus Torvalds $fInComment && (s+^.*?\*/+ +o ? ($fInComment = 0) : next); 291da177e4SLinus Torvalds m+/\*+o && (s+/\*.*?\*/+ +go, (s+/\*.*$+ +o && ($fInComment = 1))); 301da177e4SLinus Torvalds 311da177e4SLinus Torvalds # Pick up definitions. 321da177e4SLinus Torvalds if ( m/^\s*#/o ) { 331da177e4SLinus Torvalds $iLinuxVersion = $. if m/^\s*#\s*include\s*"linux\/version\.h"/o; 341da177e4SLinus Torvalds } 351da177e4SLinus Torvalds 361da177e4SLinus Torvalds # Strip strings. 371da177e4SLinus Torvalds $fInString && (s+^.*?"+ +o ? ($fInString = 0) : next); 381da177e4SLinus Torvalds m+"+o && (s+".*?"+ +go, (s+".*$+ +o && ($fInString = 1))); 391da177e4SLinus Torvalds 401da177e4SLinus Torvalds # Pick up definitions. 411da177e4SLinus Torvalds if ( m/^\s*#/o ) { 421da177e4SLinus Torvalds $iLinuxVersion = $. if m/^\s*#\s*include\s*<linux\/version\.h>/o; 431da177e4SLinus Torvalds } 441da177e4SLinus Torvalds 45*54eacba0SRandy Dunlap # Look for uses: LINUX_VERSION_CODE, KERNEL_VERSION, 46*54eacba0SRandy Dunlap # LINUX_VERSION_MAJOR, LINUX_VERSION_PATCHLEVEL, LINUX_VERSION_SUBLEVEL 47*54eacba0SRandy Dunlap if (($_ =~ /LINUX_VERSION_CODE/) || ($_ =~ /\WKERNEL_VERSION/) || 48*54eacba0SRandy Dunlap ($_ =~ /LINUX_VERSION_MAJOR/) || ($_ =~ /LINUX_VERSION_PATCHLEVEL/) || 49*54eacba0SRandy Dunlap ($_ =~ /LINUX_VERSION_SUBLEVEL/)) { 501da177e4SLinus Torvalds $fUseVersion = 1; 51a208868fSStephen Hemminger last if $iLinuxVersion; 521da177e4SLinus Torvalds } 531da177e4SLinus Torvalds } 541da177e4SLinus Torvalds 551da177e4SLinus Torvalds # Report used version IDs without include? 561da177e4SLinus Torvalds if ($fUseVersion && ! $iLinuxVersion) { 571da177e4SLinus Torvalds print "$file: $.: need linux/version.h\n"; 581da177e4SLinus Torvalds } 591da177e4SLinus Torvalds 601da177e4SLinus Torvalds # Report superfluous includes. 611da177e4SLinus Torvalds if ($iLinuxVersion && ! $fUseVersion) { 621da177e4SLinus Torvalds print "$file: $iLinuxVersion linux/version.h not needed.\n"; 631da177e4SLinus Torvalds } 641da177e4SLinus Torvalds 651da177e4SLinus Torvalds # debug: report OK results: 661da177e4SLinus Torvalds if ($debugging) { 671da177e4SLinus Torvalds if ($iLinuxVersion && $fUseVersion) { 681da177e4SLinus Torvalds print "$file: version use is OK ($iLinuxVersion)\n"; 691da177e4SLinus Torvalds } 701da177e4SLinus Torvalds if (! $iLinuxVersion && ! $fUseVersion) { 711da177e4SLinus Torvalds print "$file: version use is OK (none)\n"; 721da177e4SLinus Torvalds } 731da177e4SLinus Torvalds } 741da177e4SLinus Torvalds 75a208868fSStephen Hemminger close($f); 761da177e4SLinus Torvalds} 77