mkdep: handle breakage from srcdir changes

The handling of "path" and "fullpath" was inconsistent, resulting in a
lot of missing dependencies regardless if a separate build directory
was in use.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
This commit is contained in:
H. Peter Anvin 2024-07-27 17:43:34 -07:00
parent 68d59933f7
commit 8ef2fa22a2

View File

@ -52,6 +52,7 @@ my $barrier =
"#-- Everything below is generated by mkdep.pl - do not edit --#\n";
# This converts from filenames to full pathnames for our dependencies
# These are arrays of [full path, Makefile path]
my %dep_path = ();
# List of files that cannot be found; these *must* be excluded
@ -73,16 +74,21 @@ my $debug = 0;
#
# Scan files for dependencies
# $path is the full filesystem path, $file Makefile name
#
sub scandeps {
# path is the filesystem path, file what the output should call it
my($path, $file) = @_;
my $line;
my %xdeps;
my %mdeps;
open(my $fh, '<', $path)
or return; # If not openable, assume generated
print STDERR "mkdep: scanning file: $path\n" if ( $debug );
my $fh;
if (!open($fh, '<', $path)) {
print STDERR " -> missing, assume generated\n" if ( $debug );
return;
}
while ( defined($line = <$fh>) ) {
chomp $line;
@ -90,35 +96,46 @@ sub scandeps {
$line =~ s://.*$::;
if ( $line =~ /^\s*\#\s*include\s+\"(.*)\"\s*$/ ) {
my $nf = $1;
if (!defined($dep_path{$nf})) {
my $dp = $dep_path{$nf};
if (!defined($dp)) {
push(@must_exclude, $nf);
print STDERR " -> $nf [missing]\n" if ( $debug );
next;
}
$nf = $dep_path{$nf};
$mdeps{$nf}++;
$xdeps{$nf}++ unless ( defined($deps{$nf}) );
my $dn = $dp->[1];
$mdeps{$dn}++;
$xdeps{$dn} = $dp unless ( defined($deps{$dn}) );
printf STDERR " -> %s (%s)\n", $nf, $dn if ( $debug );
}
}
close($fh);
$deps{$file} = [keys(%mdeps)];
foreach my $xf ( keys(%xdeps) ) {
scandeps($xf);
scandeps(@{$xdeps{$xf}});
}
}
# %deps contains direct dependencies. This subroutine resolves
# indirect dependencies that result.
sub alldeps($$) {
my($file, $level) = @_;
my %adeps;
sub _alldeps($$$) {
my($file, $level, $adeps) = @_;
return if ($adeps->{$file});
printf STDERR " %s-> %s\n", (' ' x $level), $file;
$adeps->{$file}++;
foreach my $dep ( @{$deps{$file}} ) {
$adeps{$dep} = 1;
foreach my $idep ( alldeps($dep, $level+1) ) {
$adeps{$idep} = 1;
}
_alldeps($dep, $level+1, $adeps);
}
}
sub alldeps($) {
my($file) = @_;
my %adeps;
_alldeps($file, 1, \%adeps);
return sort(keys(%adeps));
}
@ -177,7 +194,7 @@ sub insert_deps($) {
my $fpath = $1;
my $fbase = basename($fpath);
if (!defined($dep_path{$fbase})) {
$dep_path{$fbase} = $fpath;
$dep_path{$fbase} = [$fpath, $fpath];
print STDERR "Makefile: $fbase -> $fpath\n";
}
} elsif ( $line =~ /^\s*\#\s*@([a-z0-9-]+):\s*\"([^\"]*)\"/ ) {
@ -249,7 +266,8 @@ sub insert_deps($) {
@deps = sort(keys(%deps));
} elsif ( $dfile =~ /^(.*)\.[Cc]$/ ) {
$ofile = convert_file($1, $sep).$obj.':';
@deps = ($dfile,alldeps($dfile,1));
print STDERR "mkdep: dependencies for: $dfile\n";
@deps = alldeps($dfile);
}
if (defined($ofile)) {
@ -332,12 +350,15 @@ foreach my $fdir ( @files ) {
foreach my $sdir ( @searchdirs ) {
my $dir = mycatdir($sdir, $fdir);
if ($scanned{$dir}) {
# Have already been here
$found = 1;
next;
}
print STDERR "mkdep: scanning directory $dir\n" if ( $debug );
opendir(DIR, $dir) or next;
$scanned{$dir}++;
$found++;
@ -351,9 +372,12 @@ foreach my $fdir ( @files ) {
if ( $file =~ /\.[Cc]$/ ) {
push(@cfiles, [$fullpath, $path]);
} elsif ( $file =~ /\.[Hh]$/ ) {
print STDERR "Filesystem: $file -> $path\n" if ( $debug );
$dep_path{$file} = $path; # Allow the blank filename
$dep_path{$path} = $path; # Also allow the full pathname
print STDERR "mkdep: filesystem: $file -> $path\n" if ( $debug );
if (defined($dep_path{$file})) {
print STDERR "mkdep: warning: more than one instance of filename $file!\n";
}
$dep_path{$file} = [$fullpath, $path];
$dep_path{$path} = [$fullpath, $path];
}
}
closedir(DIR);