Michal Marek 411abb
#!/usr/bin/perl
Michal Marek 411abb
Shung-Hsi Yu 4161bf
use File::Spec;
Michal Marek 411abb
use Getopt::Long;
Michal Marek 411abb
use strict;
Michal Marek 411abb
Michal Marek 411abb
&main();
Michal Marek 411abb
sub main
Michal Marek 411abb
{
Michal Marek 411abb
	my($dev_output, $ndev_output, $loc) = ("-", "-", ".");
Michal Marek 411abb
	&Getopt::Long::Configure(qw(bundling));
Michal Marek 411abb
	&GetOptions(
Michal Marek 411abb
		"D=s" => \$dev_output,
Michal Marek 411abb
		"N=s" => \$ndev_output,
Michal Marek 411abb
		"L=s" => \$loc,
Michal Marek 411abb
	);
Michal Marek 411abb
Michal Marek 411abb
	my($dev, $ndev) = &scan($loc);
Michal Marek 411abb
	&output($dev, $ndev, $dev_output, $ndev_output);
Michal Marek 411abb
}
Michal Marek 411abb
Michal Marek 411abb
sub scan
Michal Marek 411abb
{
Shung-Hsi Yu 4161bf
	# Normalize file path, mainly to strip away the ending forward slash,
Shung-Hsi Yu 4161bf
	# or any double forward slashes.
Shung-Hsi Yu 4161bf
	my $loc = File::Spec->canonpath(shift @_);
Shung-Hsi Yu 4161bf
	# We cannot use an absolute path (e.g. /usr/src/linux-5.14.21-150500.41)
Shung-Hsi Yu 4161bf
	# during find because it's under build root, but rpm wants one later.
Shung-Hsi Yu 4161bf
	my $abs_loc = rpm_path($loc);
Michal Marek 411abb
	my(@dev, @ndev);
Michal Marek 411abb
Michal Marek 411abb
	foreach $_ (`find "$loc"`)
Michal Marek 411abb
	{
Michal Marek 411abb
		chomp $_;
Andreas Schwab af248e
		if (-d $_ && !-l $_) {
Michal Marek 411abb
			# Generate directory list later.
Michal Marek 411abb
			next;
Michal Marek 411abb
		}
Michal Marek 411abb
		my $is_devel =
Michal Marek 411abb
			m{^\Q$loc\E.*/Kconfig} ||
Michal Marek 411abb
			m{^\Q$loc\E.*/Kbuild} ||
Michal Marek 411abb
			m{^\Q$loc\E.*/Makefile} ||
Andreas Schwab af248e
			m{^\Q$loc\E/arch/[^/]+/boot/dts/include/dt-bindings\b} ||
Michal Marek 411abb
			m{^\Q$loc\E/arch/[^/]+/include\b} ||
Andreas Schwab ec6d35
			m{^\Q$loc\E/arch/.*/module\.lds\b} ||
882120
			m{^\Q$loc\E/arch/arm/[^/]+/include/mach\b} ||
882120
			m{^\Q$loc\E/arch/arm/[^/]+/include/plat\b} ||
Andreas Schwab aa3277
			m{^\Q$loc\E/arch/[^/]+/scripts\b} ||
Markos Chandras 5f1ff5
			m{^\Q$loc\E/arch/[^/]+/tools\b} ||
Michal Marek 411abb
			m{^\Q$loc\E/include/[^/]+\b} ||
Michal Marek 411abb
			m{^\Q$loc\E/scripts\b};
Shung-Hsi Yu 4161bf
		my $abs_path = rpm_path($_);
Shung-Hsi Yu 4161bf
		$is_devel ? push(@dev, $abs_path) : push(@ndev, $abs_path);
Michal Marek 411abb
	}
Michal Marek 411abb
Shung-Hsi Yu 4161bf
	push(@dev, &calc_dirs($abs_loc, \@dev));
Shung-Hsi Yu 4161bf
	push(@ndev, &calc_dirs($abs_loc, \@ndev));
Michal Marek 411abb
	return (\@dev, \@ndev);
Michal Marek 411abb
}
Michal Marek 411abb
Michal Marek 411abb
sub calc_dirs
Michal Marek 411abb
{
Michal Marek 411abb
	my($base, $files) = @_;
Michal Marek 411abb
	my %dirs;
Michal Marek 411abb
Michal Marek 411abb
	foreach my $file (@$files) {
Shung-Hsi Yu 4161bf
		my ($volume,$path,$basename) = File::Spec->splitpath($file);
Shung-Hsi Yu 4161bf
		my @dirs = File::Spec->splitdir($path);
Michal Marek 411abb
		do {
Shung-Hsi Yu 4161bf
			# Always create $path from catdir() to avoid ending forward slash
Shung-Hsi Yu 4161bf
			$path = File::Spec->catdir(@dirs);
Michal Marek 411abb
			$dirs{$path} = 1;
Shung-Hsi Yu 4161bf
			pop @dirs;
Shung-Hsi Yu 4161bf
		} while ($path ne $base);
Michal Marek 411abb
		# This loop also makes sure that $base itself is included.
Michal Marek 411abb
	}
Michal Marek 411abb
Michal Marek 411abb
	return map { "\%dir $_" } keys %dirs;
Michal Marek 411abb
}
Michal Marek 411abb
Michal Marek 411abb
sub output
Michal Marek 411abb
{
Michal Marek 411abb
	my($dev, $ndev, $dev_out, $ndev_out) = @_;
Michal Marek 411abb
	local *FH;
Michal Marek 411abb
Michal Marek 411abb
	open(FH, "> $dev_out") || warn "Error writing to $dev_out: $!";
Michal Marek 411abb
	print FH join("\n", @$dev), "\n";
Michal Marek 411abb
	close FH;
Michal Marek 411abb
Michal Marek 411abb
	open(FH, "> $ndev_out") || warn "Error writing to $ndev_out: $!";
Michal Marek 411abb
	print FH join("\n", @$ndev), "\n";
Michal Marek 411abb
	close FH;
Michal Marek 411abb
}
Shung-Hsi Yu 4161bf
Shung-Hsi Yu 4161bf
sub rpm_path
Shung-Hsi Yu 4161bf
{
Shung-Hsi Yu 4161bf
	my $path = shift @_;
Shung-Hsi Yu 4161bf
	# Always prepend forward slash and let canonpath take care of
Shung-Hsi Yu 4161bf
	# duplicate forward slashes.
Shung-Hsi Yu 4161bf
	return File::Spec->canonpath("/$path");
Shung-Hsi Yu 4161bf
}