aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Ankarström <john@ankarstrom.se>2021-06-21 11:20:58 +0200
committerJohn Ankarström <john@ankarstrom.se>2021-06-21 11:21:17 +0200
commitd26f20ff4f4494c4dfe26793918edf9c42ecd47d (patch)
treee275b64928b85cd5ae13aeefa3b14764fb99cbbe
parentf4d044d4b6cbb2d2648a170cefa45befba3af3d5 (diff)
downloadxutil-d26f20ff4f4494c4dfe26793918edf9c42ecd47d.tar.gz
wpdf: Support implicit dependencies
-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);