xref: /OK3568_Linux_fs/device/rockchip/common/linux-kbuild/armhf/linux-kbuild-4.19/scripts/checkversion.pl (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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