#!/usr/bin/perl # wpdf -- view, watch and remake pdf based on Makefile use strict; use warnings; my %deptarget; # dependency => target # collect dependencies for given pdf files for my $target (@ARGV) { if ($target =~ /\.pdf$/) { (my $basename = $target) =~ s/\.pdf$//; open my $f, '<', 'Makefile' or die "could not open Makefile: $!\n"; while (<$f>) { # explicit if (/^\Q$target\E:\s*(.*)/) { $deptarget{$_} = $target for split /\s/, $1; last; } # implicit if (/^\.([^ .]+)\.pdf\s*:\s*(.*)/) { $deptarget{"$basename.$1"} = $target; $deptarget{$_} = $target for split /\s/, $2; last; } } 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 %deptarget or die "could not start watch: $!\n"; while (<$p>) { chomp; system('make', "$deptarget{$_}") == 0 && system('xpdf', '-remote', "wpdf-$deptarget{$_}", '-reload'); } close $p; exit($? != 0);