diff options
author | Karl Berry <karl@freefriends.org> | 2017-11-20 22:01:59 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2017-11-20 22:01:59 +0000 |
commit | 16db2735dd5c2cd2aa72643ed707730eb62e5bb1 (patch) | |
tree | 009a21f673192e806c3b4143d9ab932e371b5620 /Master/texmf-dist/scripts/latexmk | |
parent | 21337afd777f807a4932c5b0a106798dcfd9d626 (diff) |
latexmk (20nov17)
git-svn-id: svn://tug.org/texlive/trunk@45867 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/scripts/latexmk')
-rwxr-xr-x | Master/texmf-dist/scripts/latexmk/latexmk.pl | 221 |
1 files changed, 168 insertions, 53 deletions
diff --git a/Master/texmf-dist/scripts/latexmk/latexmk.pl b/Master/texmf-dist/scripts/latexmk/latexmk.pl index 0a84e0e647a..343fc01dc6e 100755 --- a/Master/texmf-dist/scripts/latexmk/latexmk.pl +++ b/Master/texmf-dist/scripts/latexmk/latexmk.pl @@ -1,5 +1,7 @@ #!/usr/bin/env perl +# SEE "POSSIBLE BUG" aournd line 2221 + # ?? Still need to fix bcf error issue. # Don't keep looping after error # pvc: Only re-run on USER FILE CHANGE. @@ -121,13 +123,13 @@ use warnings; $my_name = 'latexmk'; $My_name = 'Latexmk'; -$version_num = '4.52c'; -$version_details = "$My_name, John Collins, 19 Jan. 2017"; +$version_num = '4.54'; +$version_details = "$My_name, John Collins, 20 Nov. 2017"; use Config; use File::Basename; use File::Copy; -use File::Glob ':glob'; # Better glob. Does not use space as item separator. +use File::Glob ':bsd_glob'; # Better glob. Does not use space as item separator. use File::Path 2.08 qw( make_path ); use FileHandle; use File::Find; @@ -195,9 +197,43 @@ else { ## ## 12 Jan 2012 STILL NEED TO DOCUMENT some items below ## +## 20 Nov 2017 John Collins Ver. 4.54 +## 18 Nov 2017 John Collins Add item to @file_not_found for generic +## package warning about "No file", as produced +## by glossaries-extra. +## In run_bibtex, make change in environment +## be local, not global. +## 4 Sep 2017 John Collins Restore default of $analyze_input_log_always +## to 1. This restores the default detection +## of certain constructs for dependencies for +## input files in the .log file. See the +## comments on this variable. This corrects +## a problem caused by a change in the +## behavior of lualatex in TeXLive 2017. +## 2 Sep 2017 John Collins Remove insertion of name of deps file in +## list of targets in deps file. +## Don't print deps info in deps mode (unless +## diagnostics on). +## 1 Sep 2017 John Collins Customized default previewers for MSys +## 14 Jul 2017 John Collins Correct collection of timing information so +## that it works even in silent mode +## 14 Jun 2017 John Collins Extra value for $bibtex_use +## 12 Jun 2017 John Collins Change glob to bsd_glob, since +## File::Glob's glob is now deprecated. +## Remove unused glob_list. +## 16 May 2017 John Collins Optimize away current directory string in +## $out_dir and $aux_dir. +## 15 May 2017 John Collins Fix incorrect deletion of non-generated +## aux files. +## 13 May 2017 John Collins Correct ordering of list of options given +## by -help +## 6 Apr 2017 John Collins In deps_list, correct bug in identifying +## generated files. Otherwise, generated files +## may be identified as true source files. ## 19 Jan 2017 John Collins Make -jobname work with -pdfxe and -pdflua -## (v. 4.53c) -## 17 Jan 2017 John Collins Fix bbl file detection bug. +## 18 Jan 2017 John Collins Update to v. 4.53. +## 17 Jan 2017 John Collins Update to v. 4.52b (official release). +## Fix bbl file detection bug. ## Bbl files were previously only identified ## from occurrence as input files in log ## file rather than from fls as well. @@ -299,6 +335,7 @@ $log_wrap = 79; '.*?:\\d*: LaTeX Error: File `([^\\\']*)\\\' not found\\.', '^LaTeX Warning: File `([^\\\']*)\\\' not found', '^Package .* [fF]ile `([^\\\']*)\\\' not found', + '^Package .* No file `([^\\\']*)\\\'', 'Error: pdflatex \(file ([^\)]*)\): cannot find image file', ': File (.*) not found:\s*$', '! Unable to load picture or PDF file \\\'([^\\\']+)\\\'.', @@ -527,12 +564,22 @@ $bibtex = 'bibtex %O %B'; # Switch(es) to make biber & bibtex silent: $biber_silent_switch = '--onlylog'; $bibtex_silent_switch = '-terse'; -$bibtex_use = 1; # Whether to actually run bibtex to update bbl files - # 0: Never run bibtex +$bibtex_use = 1; # Whether to actually run bibtex to update bbl files. + # This variable is also used in deciding whether to + # delete bbl files in clean up operations. + # 0: Never run bibtex. + # Do NOT delete bbl files on clean up. # 1: Run bibtex only if the bibfiles exists # according to kpsewhich, and the bbl files - # appear to be out-of-date + # appear to be out-of-date. + # Do NOT delete bbl files on clean up. + # 1.5: Run bibtex only if the bibfiles exists + # according to kpsewhich, and the bbl files + # appear to be out-of-date. + # Only delete bbl files on clean up if bibfiles exist. # 2: Run bibtex when the bbl files are out-of-date + # Delete bbl files on clean up. + # # In any event bibtex is only run if the log file # indicates that the document uses bbl files. @@ -661,8 +708,8 @@ $MSWin_fudge_break = 1; # Give special treatment to ctrl/C and ctrl/break # System-dependent overrides: # Currently, the cases I have tests for are: MSWin32, cygwin, linux and -# darwin, with the main complications being for MSWin32 and cygwin. -# Special treatment may also be useful for MSYS (for which $^O reports +# darwin, msys, with the main complications being for MSWin32 and cygwin. +# Further special treatment may also be useful for MSYS (for which $^O reports # "msys"). This is another *nix-emulation/system for MSWindows. At # present it is treated as unix-like, but the environment variables # are those of Windows. (The test for USERNAME as well as USER was @@ -846,6 +893,13 @@ elsif ( $^O eq "cygwin" ) { $pid_position = -1; # offset of PID in output of pscmd. # Negative means I cannot use ps } +elsif ( $^O eq "msys" ) { + $pdf_previewer = q[sh -c 'start %S']; + $ps_previewer = q[sh -c 'start %S']; + $dvi_previewer = q[sh -c 'start %S']; + $ps_previewer_landscape = $ps_previewer; + $dvi_previewer_landscape = "$dvi_previewer"; +} else { # Assume anything else is UNIX or clone @@ -1049,10 +1103,26 @@ $silent = 0; # Silence latex's messages? $silence_logfile_warnings = 0; # Do list warnings in log file $kpsewhich_show = 0; # Show calls to and results from kpsewhich $landscape_mode = 0; # default to portrait mode -$analyze_input_log_always = 0; # Always analyze .log for input files in the +$analyze_input_log_always = 1; # Always analyze .log for input files in the # <...> and (...) constructions. Otherwise, only # do the analysis when fls file doesn't exist or is # out of date. + # Under normal circumstances, the data in the fls file + # is reliable, and the test of the log file gets lots + # of false positives; usually $analyze_input_log_always + # is best set to zero. But the test of the log file + # is needed at least in the following situation: + # When a user needs to persuade latexmk that a certain + # file is a source file, and latexmk doesn't otherwise + # find it. User code causes line with (...) to be + # written to log file. One important case is for + # lualatex, which doesn't always generate lines in the + # .fls file for input lua files. (The situation with + # lualatex is HIGHLY version dependent, e.g., between + # 2016 and 2017.) + # To keep backward compatibility with older versions + # of latexmk, the default is to set + # $analyze_input_log_always to 1. # The following two arrays contain lists of extensions (without # period) for files that are read in during a (pdf)LaTeX run but that @@ -1522,6 +1592,7 @@ while ($_ = $ARGV[0]) elsif (/^-bibtex-$/) { $bibtex_use = 0; } elsif (/^-nobibtex$/) { $bibtex_use = 0; } elsif (/^-bibtex-cond$/) { $bibtex_use = 1; } + elsif (/^-bibtex-cond1$/) { $bibtex_use = 1.5; } elsif (/^-c$/) { $cleanup_mode = 2; $cleanup_fdb = 1; $cleanup_only = 1; } elsif (/^-C$/ || /^-CA$/ ) { $cleanup_mode = 1; $cleanup_fdb = 1; $cleanup_only = 1; } elsif (/^-CF$/) { $cleanup_fdb = 1; } @@ -1753,17 +1824,20 @@ if ( $bad_options > 0 ) { warn "$My_name: This is $version_details, version: $version_num.\n", unless $silent; + if ( ($out_dir ne '') && ($aux_dir eq '') ){ $aux_dir = $out_dir; } -# Versions terminating in directory/path separator +# Normalize versions terminating in directory/path separator +# and versions referring to current directory $out_dir1 = $out_dir; $aux_dir1 = $aux_dir; foreach ( $aux_dir1, $out_dir1 ) { if ( ($_ ne '') && ! m([\\/\:]$) ) { $_ .= '/'; } + while ( s[^\.\/][] ) {} } # At least one widely package (revtex4-1) generates a bib file @@ -2190,6 +2264,8 @@ foreach $filename ( @file_list ) my %other_generated = (); my @index_bibtex_generated = (); my @aux_files = (); + my @missing_bib_files = (); + my $bibs_all_exist = 0; $have_fdb = 0; if ( -e $fdb_name ) { print "$My_name: Examining fdb file '$fdb_name' for rules ...\n" @@ -2207,15 +2283,29 @@ foreach $filename ( @file_list ) elsif ( $rule =~ /^(bibtex|biber)/ ) { push @index_bibtex_generated, $$Pdest, "$base.blg"; push @aux_files, $$Psource; - } + if ( $bibtex_use == 1.5) { + foreach ( keys %$PHsource ) { + if ( ( /\.bib$/ ) && (! -e $_) ) { + push @missing_bib_files, $_; + } + } + } + } elsif ( exists $other_generated{$$Psource} ) { - $other_generated{$$Pdest}; +# print "=========== CHECKING: source file of rule '$rule', '$$Psource'\n", +# " is a generated file.\n"; + ## OLD with apparent bug: + #$other_generated{$$Pdest}; } + foreach my $key (keys %$PHdest) { + $other_generated{$key} = 1; + } }, sub { # Find generated files at source file level if ( $file =~ /\.aux$/ ) { push @aux_files, $file; } } - ); + ); + if ($#missing_bib_files == -1) { $bibs_all_exist = 1; } } elsif ( -e $log_name ) { # No fdb file, but log file exists, so do inferior job by parse_log @@ -2242,21 +2332,34 @@ foreach $filename ( @file_list ) if ( ($go_mode == 2) && !$silent ) { warn "$My_name: Removing all generated files\n" unless $silent; } - if ($bibtex_use < 2) { - delete $generated_exts_all{'bbl'}; + my $keep_bbl = 1; + if ( ($bibtex_use > 1.6) + || + ( ($bibtex_use == 1.5) && ($bibs_all_exist) ) + ) { + $keep_bbl = 0; + } + if ($keep_bbl) { + delete $generated_exts_all{'bbl'}; } # Convert two arrays to hashes: my %index_bibtex_generated = (); my %aux_files = (); + my %aux_files_to_save = (); foreach (@index_bibtex_generated) { $index_bibtex_generated{$_} = 1 - unless ( /\.bbl$/ && ($bibtex_use < 2) ); + unless ( /\.bbl$/ && ($keep_bbl) ); delete( $other_generated{$_} ); } foreach (@aux_files) { - $aux_files{$_} = 1; - delete( $other_generated{$_} ); + if (exists $other_generated{$_} ) { + $aux_files{$_} = 1; + } + else { + $aux_files_to_save{$_} = 1; + } } + if ($diagnostics) { show_array( "For deletion, the following were determined from fdb file or log file:\n" ." Generated (from makeindex and bibtex):", @@ -2265,9 +2368,12 @@ foreach $filename ( @file_list ) show_array( " Other generated files:\n" ." (only deleted if \$cleanup_includes_generated is set): ", keys %other_generated ); - show_array( " Yet other generated files:\n", + show_array( " Yet other generated files are specified by patterns:\n". + " Explicit pattern with %R or root-filename.extension:", keys %generated_exts_all ); + show_array( " Aux files to SAVE and not delete:", keys %aux_files_to_save ); } + &cleanup1( $aux_dir1, $fdb_ext, 'blg', 'ilg', 'log', 'aux.bak', 'idx.bak', split('\s+',$clean_ext), keys %generated_exts_all @@ -3249,8 +3355,8 @@ sub cleanup1 { my $dir = fix_pattern( shift ); my $root_fixed = fix_pattern( $root_filename ); foreach (@_) { - (my $name = /%R/ ? $_ : "%R.$_") =~ s/%R/$dir$root_fixed/; - unlink_or_move( glob( "$name" ) ); + (my $name = /%R/ ? $_ : "%R.$_") =~ s/%R/${dir}${root_fixed}/; + unlink_or_move( bsd_glob( "$name" ) ); } } #END cleanup1 @@ -3370,7 +3476,9 @@ sub print_help " - Currently this only works with MiKTeX\n", " -bibtex - use bibtex when needed (default)\n", " -bibtex- - never use bibtex\n", - " -bibtex-cond - use bibtex when needed, but only if the bib files exist\n", + " -bibtex-cond - use bibtex when needed, but only if the bib file exists\n", + " -bibtex-cond1 - use bibtex when needed, but only if the bib file exists;\n", + " on cleanup delete bbl file only if bib file exists\n", " -bm <message> - Print message across the page when converting to postscript\n", " -bi <intensity> - Set contrast or intensity of banner\n", " -bs <scale> - Set scale for banner\n", @@ -3416,6 +3524,8 @@ sub print_help " give list of warnings after run of (pdf)latex\n", " -logfilewarninglist- or -logfilewarnings- \n", " do not give list of warnings after run of (pdf)latex\n", + " -lualatex - use lualatex for processing files to pdf\n", + " and turn dvi/ps modes off\n", " -M - Show list of dependent files after processing\n", " -MF file - Specifies name of file to receives list dependent files\n", " -MP - List of dependent files includes phony target for each source file.\n", @@ -3472,8 +3582,6 @@ sub print_help " -view=none - no viewer is used\n", " -view=ps - viewer is for ps\n", " -view=pdf - viewer is for pdf\n", - " -lualatex - use lualatex for processing files to pdf\n", - " and turn dvi/ps modes off\n", " -xelatex - use xelatex for processing files to pdf\n", " and turn dvi/ps modes off\n", "\n", @@ -3665,6 +3773,8 @@ sub check_biber_log { sub run_bibtex { my $return = 999; + # Prevent changes we make to environment becoming global: + local %ENV = %ENV; if ( $aux_dir ) { # Use \Q and \E round directory name in regex to avoid interpretation # of metacharacters in directory name: @@ -5919,7 +6029,7 @@ sub deps_list { # Call: deps_list(fh) # List dependent files to file open on fh my $fh = $_[0]; - print $fh "#===Dependents for $filename:\n"; + print $fh "#===Dependents, and related info, for $filename:\n"; my @dest_exts = (); if ($pdf_mode) {push @dest_exts, '.pdf';} if ($dvi_mode) {push @dest_exts, '.dvi';} @@ -5929,25 +6039,35 @@ sub deps_list { my @accessible_all = rdb_accessible( keys %requested_filerules ); rdb_for_some( \@accessible_all, - sub{ + sub{ # foreach (keys %$PHdest) { print "----- $_\n"; } push @generated, keys %$PHdest; }, sub{ $source{$file} = 1; } ); foreach (keys %generated_exts_all) { - (my $name = /%R/ ? $_ : "%R.$_") =~ s/%R/$root_filename/; + (my $name = /%R/ ? $_ : "%R.$_") =~ s/%R/${aux_dir1}${root_filename}/; push @generated, $name; } + show_array( "Generated:", @generated ) if $diagnostics; foreach (@generated) { delete $source{$_}; } + show_array( "Sources:", keys %source ) if $diagnostics; foreach my $ext (@dest_exts) { - if ($deps_file eq '-' ) { - print $fh "${out_dir1}${root_filename}${ext} :"; - } else { - print $fh "${out_dir1}${root_filename}${ext} $deps_file :"; - } + # Don't insert name of deps file in targets. + # The previous behavior of inserting the name of the deps file + # matched the method recommended by GNU make for automatically + # generated prerequisites -- see Sec. "Generating Prerequisites + # Automatically" of GNU make manual (v. 4.2). But this can + # cause problems in complicated cases, and as far as I can see, + # it doesn't actually help, despite the reasoning given. + # The only purpose of the deps file is to to determine source + # files for a particular rule. The files whose changes make the + # deps file out-of-date are the same as those that make the real + # target file (e.g., .pdf) out-of-date. So the GNU method seems + # completely unnecessary. + print $fh "${out_dir1}${root_filename}${ext} :"; foreach (sort keys %source) { print $fh "\\\n $_"; } @@ -6328,7 +6448,7 @@ sub rdb_make1 { if ($bibtex_use == 0) { $bibtex_not_run = 2; } - elsif ($bibtex_use == 1) { + elsif ( ($bibtex_use == 1) || ($bibtex_use == 1.5) ) { foreach ( keys %$PHsource ) { if ( ( /\.bib$/ ) && (! -e $_) ) { push @missing_bib_files, $_; @@ -6474,7 +6594,7 @@ sub rdb_make1 { # Missing output file was reported to be NOT an error $$Pout_of_date = 0; } - elsif ( ($bibtex_use <= 1) && ($bibtex_not_run > 0) ) { + elsif ( ($bibtex_use <= 1.5) && ($bibtex_not_run > 0) ) { # Lack of destination file is not to be treated as an error # for a bibtex rule when latexmk is configured not to treat # this as an error, and the lack of a destination file is the @@ -7769,18 +7889,6 @@ sub Parray { #************************************************************ -sub glob_list { - # Glob a collection of filenames. Sort and eliminate duplicates - # Usage: e.g., @globbed = glob_list(string, ...); - my @globbed = (); - foreach (@_) { - push @globbed, glob; - } - return uniqs( @globbed ); -} - -#================================================== - sub glob_list1 { # Glob a collection of filenames. # But no sorting or elimination of duplicates @@ -7803,7 +7911,7 @@ sub glob_list1 { } else { # This glob fails to work as desired, if the pattern contains spaces. - push @globbed, glob( "$file_spec" ); + push @globbed, bsd_glob( "$file_spec" ); } } return @globbed; @@ -8463,8 +8571,15 @@ sub tempfile1 { sub Run_msg { # Same as Run, but give message about my running warn_running( "Running '$_[0]'" ); + return Run($_[0]); +} #END Run_msg + +#================== + +sub Run { + # This is wrapper around Run_no_time to capture timing information my $time1 = processing_time(); - my ($pid, $return) = Run($_[0]); + my ($pid, $return) = Run_no_time($_[0]); my $time = processing_time() - $time1; push @timings, "'$_[0]': time = $time\n"; return ($pid, $return); @@ -8472,9 +8587,9 @@ sub Run_msg { #================== -sub Run { -# Usage: Run ("command string"); -# or Run ("one-or-more keywords command string"); +sub Run_no_time { +# Usage: Run_no_time ("command string"); +# or Run_no_time ("one-or-more keywords command string"); # Possible keywords: internal, NONE, start, nostart. # # A command string not started by keywords just gives a call to system with |