xref: /linux-6.15/scripts/checkincludes.pl (revision b2441318)
1cb77f0d6SKamil Rytarowski#!/usr/bin/env perl
2*b2441318SGreg Kroah-Hartman# SPDX-License-Identifier: GPL-2.0
31da177e4SLinus Torvalds#
492f3f19cSLuis R. Rodriguez# checkincludes: find/remove files included more than once
592f3f19cSLuis R. Rodriguez#
61da177e4SLinus Torvalds# Copyright abandoned, 2000, Niels Kristian Bech Jensen <[email protected]>.
792f3f19cSLuis R. Rodriguez# Copyright 2009 Luis R. Rodriguez <[email protected]>
892f3f19cSLuis R. Rodriguez#
992f3f19cSLuis R. Rodriguez# This script checks for duplicate includes. It also has support
1092f3f19cSLuis R. Rodriguez# to remove them in place. Note that this will not take into
1192f3f19cSLuis R. Rodriguez# consideration macros so you should run this only if you know
1292f3f19cSLuis R. Rodriguez# you do have real dups and do not have them under #ifdef's. You
1392f3f19cSLuis R. Rodriguez# could also just review the results.
141da177e4SLinus Torvalds
153da27157SStephen Hemmingeruse strict;
163da27157SStephen Hemminger
17f9d490abSLuis R. Rodriguezsub usage {
1892f3f19cSLuis R. Rodriguez	print "Usage: checkincludes.pl [-r]\n";
1992f3f19cSLuis R. Rodriguez	print "By default we just warn of duplicates\n";
2092f3f19cSLuis R. Rodriguez	print "To remove duplicated includes in place use -r\n";
21f9d490abSLuis R. Rodriguez	exit 1;
22f9d490abSLuis R. Rodriguez}
23f9d490abSLuis R. Rodriguez
2492f3f19cSLuis R. Rodriguezmy $remove = 0;
2592f3f19cSLuis R. Rodriguez
26f9d490abSLuis R. Rodriguezif ($#ARGV < 0) {
27f9d490abSLuis R. Rodriguez	usage();
28f9d490abSLuis R. Rodriguez}
29f9d490abSLuis R. Rodriguez
3092f3f19cSLuis R. Rodriguezif ($#ARGV >= 1) {
3192f3f19cSLuis R. Rodriguez	if ($ARGV[0] =~ /^-/) {
3292f3f19cSLuis R. Rodriguez		if ($ARGV[0] eq "-r") {
3392f3f19cSLuis R. Rodriguez			$remove = 1;
3492f3f19cSLuis R. Rodriguez			shift;
3592f3f19cSLuis R. Rodriguez		} else {
3692f3f19cSLuis R. Rodriguez			usage();
3792f3f19cSLuis R. Rodriguez		}
3892f3f19cSLuis R. Rodriguez	}
3992f3f19cSLuis R. Rodriguez}
4092f3f19cSLuis R. Rodriguez
418087a560SCheah Kok Cheongmy $dup_counter = 0;
428087a560SCheah Kok Cheong
433da27157SStephen Hemmingerforeach my $file (@ARGV) {
443da27157SStephen Hemminger	open(my $f, '<', $file)
453da27157SStephen Hemminger	    or die "Cannot open $file: $!.\n";
461da177e4SLinus Torvalds
471da177e4SLinus Torvalds	my %includedfiles = ();
4892f3f19cSLuis R. Rodriguez	my @file_lines = ();
491da177e4SLinus Torvalds
503da27157SStephen Hemminger	while (<$f>) {
511da177e4SLinus Torvalds		if (m/^\s*#\s*include\s*[<"](\S*)[>"]/o) {
521da177e4SLinus Torvalds			++$includedfiles{$1};
531da177e4SLinus Torvalds		}
5492f3f19cSLuis R. Rodriguez		push(@file_lines, $_);
551da177e4SLinus Torvalds	}
561da177e4SLinus Torvalds
573da27157SStephen Hemminger	close($f);
58d9a7a2bdSLuis R. Rodriguez
5992f3f19cSLuis R. Rodriguez	if (!$remove) {
603da27157SStephen Hemminger		foreach my $filename (keys %includedfiles) {
611da177e4SLinus Torvalds			if ($includedfiles{$filename} > 1) {
621da177e4SLinus Torvalds				print "$file: $filename is included more than once.\n";
638087a560SCheah Kok Cheong				++$dup_counter;
641da177e4SLinus Torvalds			}
651da177e4SLinus Torvalds		}
6692f3f19cSLuis R. Rodriguez		next;
6792f3f19cSLuis R. Rodriguez	}
6892f3f19cSLuis R. Rodriguez
693da27157SStephen Hemminger	open($f, '>', $file)
703da27157SStephen Hemminger	    or die("Cannot write to $file: $!");
7192f3f19cSLuis R. Rodriguez
7292f3f19cSLuis R. Rodriguez	my $dups = 0;
7392f3f19cSLuis R. Rodriguez	foreach (@file_lines) {
7492f3f19cSLuis R. Rodriguez		if (m/^\s*#\s*include\s*[<"](\S*)[>"]/o) {
753da27157SStephen Hemminger			foreach my $filename (keys %includedfiles) {
7692f3f19cSLuis R. Rodriguez				if ($1 eq $filename) {
7792f3f19cSLuis R. Rodriguez					if ($includedfiles{$filename} > 1) {
7892f3f19cSLuis R. Rodriguez						$includedfiles{$filename}--;
7992f3f19cSLuis R. Rodriguez						$dups++;
808087a560SCheah Kok Cheong						++$dup_counter;
8192f3f19cSLuis R. Rodriguez					} else {
823da27157SStephen Hemminger						print {$f} $_;
8392f3f19cSLuis R. Rodriguez					}
8492f3f19cSLuis R. Rodriguez				}
8592f3f19cSLuis R. Rodriguez			}
8692f3f19cSLuis R. Rodriguez		} else {
873da27157SStephen Hemminger			print {$f} $_;
8892f3f19cSLuis R. Rodriguez		}
8992f3f19cSLuis R. Rodriguez	}
9092f3f19cSLuis R. Rodriguez	if ($dups > 0) {
9192f3f19cSLuis R. Rodriguez		print "$file: removed $dups duplicate includes\n";
9292f3f19cSLuis R. Rodriguez	}
933da27157SStephen Hemminger	close($f);
941da177e4SLinus Torvalds}
958087a560SCheah Kok Cheong
968087a560SCheah Kok Cheongif ($dup_counter == 0) {
978087a560SCheah Kok Cheong	print "No duplicate includes found.\n";
988087a560SCheah Kok Cheong}
99