Codebase list findbugs / debian/latest design / architecture / mkdep.pl
debian/latest

Tree @debian/latest (Download .tar.gz)

mkdep.pl @debian/latestraw · history · blame

#! /usr/bin/perl

use strict qw(refs vars);
use FileHandle;
use Getopt::Std;

my %opts = ();
if (!getopts("b", \%opts)) {
	Usage();
}

my @imageExtensionList = (
	".pdf", ".png"
);

foreach my $file (@ARGV) {
	my @depList = ();

	my @workList = ();
	push @workList, $file;

	my %seen = ();

	while (scalar(@workList) > 0) {
		my $src = shift @workList;

		my $fh = new FileHandle("<$src");
		(defined $fh) || die "Couldn't open $src: $!\n";

		while (<$fh>) {
			my $dep = undef;

			if (/^[^%]*\\(input|include)\{([^}]+)\}/) {
				$dep = $2;
				if (!($dep =~ /\.tex$/)) {
					$dep .= ".tex";
				}
			} elsif (/^[^%]*\\includegraphics(\[width=[^\]]+\])?\{([^}]+)\}/) {
				#print "Image: $2\n";
				$dep = Resolve_Image($2, $src);
			}

			if ((defined $dep) && (!$seen{$dep})) {
				push @depList, $dep;
				if ($dep =~ /\.tex$/) {
					push @workList, $dep;
				}
				$seen{$dep} = 1;
			}
		}

		$fh->close();
	}

	my $outfile = $file;
	$outfile =~ s,\.tex$,.pdf,;

	if ($opts{'b'} && $file =~ /^(.*)\.tex$/) {
		my $bibfile = "$1.bib";
		if (-r $bibfile) {
			push @depList, $bibfile;
		}
	}

	print "$outfile : $file ", join(' ', @depList), "\n\n";
}

sub Resolve_Image {
	my ($img, $src) = @_;
	my $found = 0;
	if (!($img =~ /\.[A-Za-z0-9]+$/)) {
		foreach my $ext (@imageExtensionList) {
			if (-r "$img$ext") {
				$img = "$img$ext";
				#print STDERR "Found $img referenced from $src\n";
				$found = 1;
				last;
			}
		}
	} else {
		$found = (-r $img);
	}
	die "Couldn't resolve image $img from $src\n" if (!$found);
	return $img;
}

sub Usage {
	print STDERR "Usage: mkdep.pl [-b] <tex sources...>\n";
	print STDERR "Options:\n";
	print STDERR "  -b    Check for .bib file matching main source file\n";
	exit 1
}

# vim:ts=4