diff options
Diffstat (limited to 'Master/texmf-dist/scripts/latexmk')
-rwxr-xr-x | Master/texmf-dist/scripts/latexmk/latexmk.pl | 169 |
1 files changed, 139 insertions, 30 deletions
diff --git a/Master/texmf-dist/scripts/latexmk/latexmk.pl b/Master/texmf-dist/scripts/latexmk/latexmk.pl index 4d124a67893..acadd33c844 100755 --- a/Master/texmf-dist/scripts/latexmk/latexmk.pl +++ b/Master/texmf-dist/scripts/latexmk/latexmk.pl @@ -45,6 +45,12 @@ if 0; ## ?? Need to set dependence of extra bibtex rules on .bib file ## ?? Put $pass as variable in rule. +## ?? Issues with clean-up +## List of aux files deleted is those read, not those generated. +## Other files are generated by (pdf)latex; should they be deleted? +## (I have hooks for this). + + #======================================= @@ -142,8 +148,8 @@ if 0; $my_name = 'latexmk'; $My_name = 'Latexmk'; -$version_num = '4.01'; -$version_details = "$My_name, John Collins, 24 September 2008"; +$version_num = '4.02'; +$version_details = "$My_name, John Collins, 15 November 2008"; use Config; @@ -210,8 +216,34 @@ else { ## 5. Parsing of log file instead of source file is used to ## obtain dependencies, by default. ## -## Modification log for 28 Mar 2007 onwards in detail +## Modification log for 24 Sep 2008 onwards in detail ## +## 15 Nov 2008, John Collins Make version # 4.02, for release +## 12 Nov 2008, John Collins Deal with quoted filenames in log file +## (as with MikTeX) +## 10 Nov 2008, John Collins Start fixing bug about -ps -pdfps +## running ps2pdf before dvips +## 30 Sep 2008, John Collins V. 4.01a +## Correct problem that aux files not of +## same basename are not deleted on clean-up +## Primary problem: fdb file was deleted before +## being read +## ?? Remaining issues on this: +## List of aux files deleted is those read, +## not those generated +## Other files are generated by (pdf)latex +## should they be deleted? +## Solution of problem that if a source file +## for (pdf)latex disappears, that is treated +## as a change requiring a rerun. This gives +## an infinite loop of unnecessary runs in +## -pvc mode +## Cleanup can also apply to all files +## generated during (pdf)latex run, +## as diagnosed by \openout lines, +## and also to files generated from +## these. Controlling variable +## $cleanup_includes_generated. ## 24 Sep 2008, John Collins Release version 4.01. ## ## 1998-2008, John Collins. Many improvements and fixes. @@ -840,6 +872,9 @@ $cleanup_mode = 0; # No cleanup of nonessential LaTex-related files. # dviF, pdf, ps, & psF $cleanup_fdb = 0; # No removal of file for latexmk's file-database $cleanup_only = 0; # When doing cleanup, do not go-on to making files +$cleanup_includes_generated = 0; + # Determines whether cleanup deletes files generated by + # (pdf)latex (found from \openout lines in log file). $diagnostics = 0; $dvi_filter = ''; # DVI filter command $ps_filter = ''; # Postscript filter command @@ -1446,16 +1481,25 @@ if ( ! ( $dvi_mode || $pdf_mode || $postscript_mode || $printout_mode) ) { # Set new-style requested rules: if ( $dvi_mode ) { $requested_filerules{'latex'} = 1; } if ( $pdf_mode == 1 ) { $requested_filerules{'pdflatex'} = 1; } -elsif ( $pdf_mode == 2 ) { $requested_filerules{'ps2pdf'} = 1; } -elsif ( $pdf_mode == 3 ) { $requested_filerules{'dvipdf'} = 1; } -if ( $postscript_mode ) { $requested_filerules{'dvips'} = 1; } +elsif ( $pdf_mode == 2 ) { + $requested_filerules{'latex'} = 1; + $requested_filerules{'dvips'} = 1; + $requested_filerules{'ps2pdf'} = 1; +} +elsif ( $pdf_mode == 3 ) { + $requested_filerules{'latex'} = 1; + $requested_filerules{'dvipdf'} = 1; +} +if ( $postscript_mode ) { + $requested_filerules{'latex'} = 1; + $requested_filerules{'dvips'} = 1; +} if ( $printout_mode ) { $one_time{'print'} = 1; } if ( $preview_continuous_mode || $preview_mode ) { $one_time{'view'} = 1; } if ( length($dvi_filter) != 0 ) { $requested_filerules{'dvi_filter'} = 1; } if ( length($ps_filter) != 0 ) { $requested_filerules{'ps_filter'} = 1; } if ( $banner ) { $requested_filerules{'dvips'} = 1; } - %possible_primaries = (); foreach (&rdb_possible_primaries) { $possible_primaries{$_} = 1; @@ -1539,31 +1583,55 @@ foreach $filename ( @file_list ) $fdb_file = "$root_filename.$fdb_ext"; - if ($cleanup_fdb) { unlink $fdb_file; } if ( $cleanup_mode > 0 ) { - my @extra_generated = (); + # Use parse_logB to get names of generated files. + # It returns its results in the following variables: + local %dependents = (); # Maps files to status + local @bbl_files = (); + local %idx_files = (); # Maps idx_file to (ind_file, base) + local %generated_log = (); # Lists generated files + print "$My_name: Examining log file for generated files...\n"; + &parse_logB; + + my @index_bibtex_generated = (); my @aux_files = (); - rdb_read_generatedB( $fdb_file, \@extra_generated, \@aux_files ); + my %other_generated = %generated_log; + + rdb_read_generatedB( $fdb_file, \@index_bibtex_generated, \@aux_files, + \%other_generated ); if ( ($go_mode == 2) && !$silent ) { warn "$My_name: Removing all generated files\n" unless $silent; } + foreach (@index_bibtex_generated, @aux_files) { + delete( $other_generated{$_} ); + } if ($diagnostics) { - show_array( "For deletion:\n Extra_generated:", @extra_generated ); + show_array( "For deletion:\n" + ." Generated (from makeindex and bibtex):", + @index_bibtex_generated ); show_array( " Aux files:", @aux_files ); + show_array( "Other generated files:\n" + ." (only deleted if \$cleanup_includes_generated is set): ", + keys %other_generated ); } + # Add to the generated files, some log file and some backup # files used in previous versions of latexmk &cleanup1( 'blg', 'ilg', 'log', 'aux.bak', 'idx.bak', split(' ',$clean_ext), @generated_exts ); - unlink( 'texput.log', @extra_generated, "texput.aux", @aux_files ); + unlink( 'texput.log', @index_bibtex_generated, "texput.aux", @aux_files ); + if ($cleanup_includes_generated) { + unlink( keys %other_generated ); + } if ( $cleanup_mode == 1 ) { &cleanup1( 'dvi', 'dviF', 'ps', 'psF', 'pdf', split(' ', $clean_full_ext) ); } } + if ($cleanup_fdb) { unlink $fdb_file; } if ($cleanup_only) { next FILE; } # Initialize file and rule databases. @@ -2666,6 +2734,8 @@ sub parse_logB { # Treat the following specially, since they have special rules # @bbl_files to list of .bbl files. # %idx_files to map from .idx files to .ind files. +# %generated_log: keys give set of files written by (pdf)latex (e.g., aux, idx) +# as determined by \openout = ... lines in log file. # Also set # $reference_changed, $bad_reference, $bad_citation # Trivial or default values if log file does not exist/cannot be opened @@ -2686,6 +2756,7 @@ sub parse_logB { foreach (@default_includes) { $dependents{$_} = 4; } @bbl_files = (); %idx_files = (); # Maps idx_file to (ind_file, base) + %generated_log = (); $reference_changed = 0; $bad_reference = 0; @@ -2760,6 +2831,10 @@ LINE: # Latex error/warning, etc. next LINE; } + if ( /^\\openout\d+\s*=\s*\`([^\']+)\'\.$/ ) { + $generated_log{$1} = 1; + next LINE; + } # Test for writing of index file. The precise format of the message # depends on which package (makeidx.sty , multind.sty or index.sty) and # which version writes the message. @@ -2895,19 +2970,22 @@ LINE: # First step: replace $_ by whole of line after the '(' # Thus $_ is putative filename followed by other stuff. $_ = $1; - if ( /^([^\(^\)^\{]*?)\s\[/ ) { + if ( /^\"([^\(^\)^\"]+)\"/ ) { + # Quoted file name, as from MikTeX + } + elsif ( /^([^\(^\)]*?)\s\[/ ) { # Terminator: space then '[' # Use *? in condition: to pick up first ' [' as terminator # 'file [' should give good filename. } - elsif ( /^([^\(^\)^\{]*)\s(?=\()/ ) { + elsif ( /^([^\(^\)]*)\s(?=\()/ ) { # Terminator is ' (', but '(' isn't in matched string, # so we keep the '(' ready for the next match } - elsif ( /^([^\(^\)^\{]*)(\))/ ) { + elsif ( /^([^\(^\)]*)(\))/ ) { # Terminator is ')' } - elsif ( /^([^\(^\)^\{]*?)\s*\{/ ) { + elsif ( /^([^\(^\)]*?)\s*\{/ ) { # Terminator: arbitrary space then '{' # Use *? in condition: to pick up first ' [' as terminator # 'file [' should give good filename. @@ -2926,6 +3004,10 @@ LINE: # Part of font message next INCLUDE_CANDIDATE; } + # Remove quotes around filename, as for MikTeX. I've already + # treated this as a special case. For safety check here: + $include_candidate =~ s/^\"(.*)\"$/$1/; + # Make list of new include files; sometimes more than one. my @new_includes = ($include_candidate); if ( $include_candidate =~ /^(.+)\[([^\]]+)\]$/ ) { @@ -3053,6 +3135,11 @@ CANDIDATE: print "Apparent input files appearently from misunderstood lines in .log file:\n"; foreach ( @misparse ) { print " $_\n"; } } + print "Log file shows the following generated files: "; + foreach (keys %generated_log) { + print "'$_' "; + } + print "\n"; } return 1; @@ -3364,13 +3451,20 @@ LINE: #************************************************************ sub rdb_read_generatedB { - # Call: rdb_read_generatedB( $in_name, \@extra_generated, \@aux_files ) + # Call: rdb_read_generatedB( $in_name, \@generated1, \@aux_files. + # \%other_generated ) # From rule database in saved file, in format written by rdb_write, - # finds the non-basic generated files that are to be deleted by a cleanup. - # Returns an array of these files, or an empty array if the file - # does not exist or cannot be opened. - my ($in_name, $Pgenerated, $Paux_files) = @_; - @$Pgenerated = (); + # finds the non-trivial generated files that are to be deleted by a cleanup. + # On entry: + # Keys of %other_generated: any detected generated files, from \openout + # lines log file, usually. + # At exit: + # Array @generated1: files associated with makeindex and bibtex + # Array @aux_files: aux files + # Added to keys of %other_generated: any files that are destinations of rules + # whose source is in %other_generated. (One stage only.) + my ($in_name, $Pgenerated1, $Paux_files, $Pother_generated) = @_; + @$Pgenerated1 = (); @$Paux_files = (); my $in_handle = new FileHandle; @@ -3384,6 +3478,7 @@ sub rdb_read_generatedB { my $ext = ''; my $path = ''; my $state = 0; # Outside a section + my @other_additions = (); LINE: while ( <$in_handle> ) { # Remove leading and trailing white space. @@ -3405,12 +3500,15 @@ LINE: } else { next LINE; } if ( $rule =~ /^makeindex/ ) { - push @$Pgenerated, $source, $dest, "$base.ilg"; + push @$Pgenerated1, $source, $dest, "$base.ilg"; } elsif ( $rule =~ /^bibtex/ ) { - push @$Pgenerated, $dest, "$base.blg"; + push @$Pgenerated1, $dest, "$base.blg"; push @$Paux_files, $source; } + elsif ( exists ${$Pother_generated}{$source} ) { + push @other_additions, $dest; + } $state = 1; #Reading a section } elsif ( /^\"([^\"]*)\"\s+(\S+)\s+(\S+)\s+(\S+)\s+\"([^\"]*)\"/ ) { @@ -3433,7 +3531,9 @@ LINE: } } # LINE undef $in_handle; - + foreach (@other_additions) { + ${$Pother_generated}{$_} = 1; + } } # END rdb_read_generatedB #************************************************************ @@ -3496,9 +3596,10 @@ sub rdb_set_from_logB { # Parse log file to find relevant filenames # Result in the following variables: - local %dependents = (); # Maps files to status + local %dependents = (); # Maps files to status local @bbl_files = (); - local %idx_files = (); # Maps idx_file to (ind_file, base) + local %idx_files = (); # Maps idx_file to (ind_file, base) + local %generated_log = (); # Lists generated files found in log file # The following are also returned, but are global, to be used by caller # $reference_changed, $bad_reference $bad_citation @@ -4100,6 +4201,7 @@ sub rdb_makeB { print "MakeB: doing pre_primary and primary...\n"; } rdb_for_some( [@pre_primary, $primary], \&rdb_makeB1 ); + if ( ($runs > 0) && ! $too_many_runs ) { $retry_msg = 0; if ( $failure && $newrule_nofile ) { @@ -4607,12 +4709,19 @@ sub rdb_file_change1 { #?? " New $new_time, $new_size, $new_md5\n"; my $ext = ext( $file ); if ( ($new_size < 0) && ($$Psize >= 0) ) { - print "Disappeared '$file' in '$rule'\n"; + # print "Disappeared '$file' in '$rule'\n"; push @disappeared, $file; # No reaction is good. #$$Pout_of_date = 1; # ??? 1 Sep. 2008: I do NOT think so, for cusdep no-file-exists issue - $$Pout_of_date = 1; + # ??? 30 Sep 2008: I think I have this fixed. There were other changes + # needed. No-change-flagged is correct. The array @disappeared flags + # files that have disappeared, if I need to know. But having a source + # file disappear is not a reason for a remake unless I know how to + # make the file. If the file is a destination of a rule, that rule + # will be rerun. It may be that the user is changing another source + # in such a way that the disappeared file won't be needed. Before the + # change is applied we get a superfluous infinite loop. return; } if ( ($new_size < 0) && ($$Psize < 0) ) { @@ -4639,7 +4748,7 @@ sub rdb_file_change1 { #************************************************************ sub rdb_count_changes { - return $#changed + $#disappeared + $#no_dest + $#rules_to_apply + 4; + return $#changed + $#no_dest + $#rules_to_apply + 3; } #END rdb_count_changes #************************************************************ |