aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xwpdf38
1 files changed, 25 insertions, 13 deletions
diff --git a/wpdf b/wpdf
index 58409db..304f687 100755
--- a/wpdf
+++ b/wpdf
@@ -5,34 +5,46 @@
use strict;
use warnings;
-my %deps;
+my %deptarget; # dependency => target
# collect dependencies for given pdf files
-for (@ARGV) {
- if (/\.pdf$/) {
- (my $name = $_) =~ s/\.pdf$//;
+for my $target (@ARGV) {
+ if ($target =~ /\.pdf$/) {
+ # try to directly parse out dependencies
open my $f, '<', 'Makefile'
or die "could not open Makefile: $!\n";
while (<$f>) {
- if (/^\Q$name.pdf\E:\s*(.*)/) {
- $deps{$_} = $name for split /\s/, $1;
- last;
- }
+ next if not /^\Q$target\E:\s*(.*)/;
+ $deptarget{$_} = $target for split /\s/, $1;
+ goto found;
}
- close $f;
- exec('xpdf', '-remote', "wpdf-$name", "$name.pdf") if fork == 0;
+
+ # try to get implicit dependencies
+ (my $esc = $target) =~ s/'/'"'"'/g;
+ open my $p, "make -ndv 2>&1 '$esc' |"
+ or die "could not run make: $!\n";
+ while (<$p>) {
+ next if not /^\Q$target\E:< = (.*)/;
+ $deptarget{$_} = $target for split /\s/, $1;
+ last;
+ }
+
+ close $p;
+found: close $f;
+ exec('xpdf', '-remote', "wpdf-$target", $target) if fork == 0;
+ next;
} else {
warn "skipping $_: not a pdf\n";
}
}
# make pdf on demand
-open my $p, '-|', 'watch', keys %deps
+open my $p, '-|', 'watch', keys %deptarget
or die "could not start watch: $!\n";
while (<$p>) {
chomp;
- system('make', "$deps{$_}.pdf") == 0
- && system('xpdf', '-remote', "wpdf-$deps{$_}", '-reload');
+ system('make', "$deptarget{$_}") == 0
+ && system('xpdf', '-remote', "wpdf-$deptarget{$_}", '-reload');
}
close $p;
exit($? != 0);