diff options
author | Karl Berry <karl@freefriends.org> | 2011-12-11 22:30:30 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2011-12-11 22:30:30 +0000 |
commit | bca3b6017c5eda5d6c5d67bb266062fb7f363b5b (patch) | |
tree | 4982edcfc2080e1c96ac6d3d3a7b83655c273393 /Master/texmf-dist/scripts/latexmk | |
parent | 66913a012bff67aeac726ca83cbaffcafbae1118 (diff) |
latexmk 4.30a (10dec11)
git-svn-id: svn://tug.org/texlive/trunk@24819 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/scripts/latexmk')
-rwxr-xr-x | Master/texmf-dist/scripts/latexmk/latexmk.pl | 144 |
1 files changed, 125 insertions, 19 deletions
diff --git a/Master/texmf-dist/scripts/latexmk/latexmk.pl b/Master/texmf-dist/scripts/latexmk/latexmk.pl index 2d9bbcf9cab..ad28098a24a 100755 --- a/Master/texmf-dist/scripts/latexmk/latexmk.pl +++ b/Master/texmf-dist/scripts/latexmk/latexmk.pl @@ -109,9 +109,8 @@ use warnings; $my_name = 'latexmk'; $My_name = 'Latexmk'; -$version_num = '4.28c'; -$version_details = "$My_name, John Collins, 1 December 2011"; - +$version_num = '4.30a'; +$version_details = "$My_name, John Collins, 9 December 2011"; use Config; use File::Copy; @@ -179,6 +178,28 @@ else { ## ## Modification log from 1 Jan 2011 onwards in detail ## +## 9 Dec 2011, John Collins Use OS-dependent search path separator when +## when manipulating TEXINPUTS, etc. +## Correct treatment of current directory +## when modifying TEXINPUTS, etc +## 8 Dec 2011, John Collins V. 4.30 +## Fix use of bibtex so that it works correctly +## when $aux_dir and/or $out_dir is set. +## Correct dependencies of aux files when +## $aux_dir and/or $out_dir is set. +## 7 Dec 2011, John Collins Ensure preservation of test_kind for dvips, etc +## It was getting clobbered by rdb_read. +## 6 Dec 2011, John Collins Results of issues in using feynmp packages: +## 1. Set $ENV{TEXINPUTS} if $out_dir is set +## Hence dvips can find files that would +## normally be generated in the current +## directory, but that are actually +## generated in $out_dir. +## 2. Deal with missing file message from feynmp +## 3. In searching for cus-deps that can make a +## missing file, look in $out_dir +## 4. Now v. 4.29 +## 5 Dec 2011, John Collins Delete spurious print in force_directory ## 1 Dec 2011, John Collins Correct biber-no-bib problem ## (biber gives an error message, but latexmk ## should treat that only as a warning). @@ -383,6 +404,7 @@ $log_wrap = 79; '^LaTeX Warning: File `([^\\\']*)\\\' not found', '^Package .* [fF]ile `([^\\\']*)\\\' not found', 'Error: pdflatex \(file ([^\)]*)\): cannot find image file', + ': File (.*) not found:\s*$', ); ## Hash mapping file extension (w/o period, e.g., 'eps') to a single regexp, @@ -629,7 +651,7 @@ elsif ( $^O eq "cygwin" ) { # example). # Cygwin executables for tex and latex may only know cygwin # filenames. - # 4. The BIBINPUTS and TEXINPUTS environment variables may be + # 4. The BIBINPUTS environment variables may be # UNIX-style or MSWin-style depending on whether native NT or # cygwin executables are used. They are therefore parsed # differently. Here is the clash: @@ -994,16 +1016,13 @@ $bad_citation = 0; # Set them early so that they can be overridden $BIBINPUTS = $ENV{'BIBINPUTS'}; if (!$BIBINPUTS) { $BIBINPUTS = '.'; } -#?? OBSOLETE -$TEXINPUTS = $ENV{'TEXINPUTS'}; -if (!$TEXINPUTS) { $TEXINPUTS = '.'; } # Convert search paths to arrays: # If any of the paths end in '//' then recursively search the # directory. After these operations, @BIBINPUTS should # have all the directories that need to be searched -@BIBINPUTS = find_dirs1 ($BIBINPUTS); +@BIBINPUTS = find_dirs1( $BIBINPUTS ); ###################################################################### @@ -1752,6 +1771,22 @@ foreach (@generated_exts ) { $generated_exts_all{$_} = 1; } +if ($aux_dir) { + # Ensure $aux_dir is in TEXINPUTS search path. + # This is used by dvips for files generated by mpost. + if ( ! exists $ENV{TEXINPUTS} ) { + # Note the trailing ":" which ensures that the last item + # in the list of paths is the empty path, which actually + # means the default path, i.e., the following means that + # the TEXINPUTS search path is $aux_dir and the standard + # value. + $ENV{TEXINPUTS} = $aux_dir.$search_path_separator; + } + elsif ( $ENV{TEXINPUTS} !~ /$aux_dir$search_path_separator/ ) { + $ENV{TEXINPUTS} = $aux_dir.$search_path_separator.$ENV{TEXINPUTS}; + } +} + $quell_uptodate_msgs = $silent; # Whether to quell informational messages when files are uptodate # Will turn off in -pvc mode @@ -3177,6 +3212,41 @@ sub check_biber_log { #************************************************** +sub run_bibtex { + my $return = 999; + if ( $aux_dir ) { + if ( $$Psource =~ /^$aux_dir1/ ) { + # Run bibtex in $aux_dir, fixing input search path + # to allow for finding files in original directory + my ( $base, $path, $ext ) = fileparseA( $$Psource ); + my $cwd = good_cwd(); + foreach ( 'BIBINPUTS', 'BSTINPUTS' ) { + if ( exists $ENV{$_} ) { + $ENV{$_} = $cwd.$search_path_separator.$ENV{$_}; + } + else { + $ENV{$_} = $cwd.$search_path_separator; + } + } + pushd( $path ); + $return = &rdb_ext_cmd1( '', $base.$ext, '', $base ); + popd(); + } + else { + warn "$My_name: Directory in file name '$$Psource' for bibtex\n", + " but it is not the output directory '$aux_dir'\n"; + $return = rdb_ext_cmd(); + } + } + else { + $return = rdb_ext_cmd(); + } + return $return; +} + + +#************************************************** + sub check_bibtex_log { # Check for bibtex warnings: # Usage: check_bibtex_log( base_of_bibtex_run ) @@ -3252,7 +3322,6 @@ sub force_directory { my $filename = $_[1]; my ($base_name, $path ) = fileparse( $filename ); if ( $path ne '' ) { $filename = "$default_dir$filename"; } - print "$filename\n"; return $filename; } @@ -3566,9 +3635,20 @@ LINE: foreach my $pattern (@file_not_found) { if ( /$pattern/ ) { my $file = clean_file_name($1); + my ($base, $path) = fileparse( $file ); warn "$My_name: Missing input file: '$file' from line\n '$_'\n" unless $silent; $dependents{$file} = 0; + if ( $aux_dir && ( ($path eq './') || ($path eq '') ) ) { + # This allows for the possibility that latex generated + # a file in $aux_dir, from which the missing file can + # be created by a cusdep (or other) rule that puts + # the result in $out_dir. If the announced missing file + # has no path, then it would be effectively a missing + # file in $aux_dir, with a path. So give this alternate + # location. + $dependents{$aux_dir1.$file} = 0; + } next LINE; } } @@ -4007,7 +4087,7 @@ AUX_LINE: } elsif ( /^\\\@input\{(.*)\}/ ) { # \\@input{next_aux_file_name} - &parse_aux1( $1 ); + &parse_aux1( $aux_dir1.$1 ); } } close($aux_fh); @@ -4175,11 +4255,9 @@ LINE: } if ( rdb_rule_exists( $rule ) ) { rdb_one_rule( $rule, - sub{ $$Ptest_kind = 1; + sub{ + if ($$Ptest_kind == 3) { $$Ptest_kind = 1; } $$Prun_time = $run_time; - #??if ($source) { $$Psource = $source; } - #??if ($dest) { $$Pdest = $dest; } - #??if ($base) { $$Pbase = $base; } } ); } @@ -4206,6 +4284,7 @@ LINE: elsif ( $rule =~ /^(makeindex|bibtex|biber)\s*(.*)$/ ) { my $PA_extra_gen = []; my $rule_generic = $1; + my $int_cmd = ''; if ( ! $source ) { # If fdb_file was old-style (v. 1) $source = $2; @@ -4213,7 +4292,6 @@ LINE: my $ext = ''; ($base, $path, $ext) = fileparseA( $source ); $base = $path.$base; -# ?? MAY NEED TO FIX THE FOLLOWING IF $aux_dir IS SET. if ($rule_generic eq 'makeindex') { $dest = "$base.ind"; } @@ -4228,17 +4306,19 @@ LINE: } if ($rule =~ /^makeindex/) { $PA_extra_gen = [ "$base.ilg" ]; } if ($rule =~ /^(bibtex|biber)/) { $PA_extra_gen = [ "$base.blg" ]; } + if ($rule =~ /^bibtex/) { $int_cmd = "run_bibtex"; } warn "$My_name: File-database '$in_name': setting rule '$rule'\n" if $diagnostics; my $cmd_type = 'external'; my $ext_cmd = ${$rule_generic}; warn " Rule kind = '$rule_generic'; ext_cmd = '$ext_cmd';\n", + " int_cmd = '$int_cmd';\n", " source = '$source'; dest = '$dest'; base = '$base';\n" if $diagnostics; # Set source file as non-existent. # If it existed on last run, it will be in later # lines of the fdb file - rdb_create_rule( $rule, $cmd_type, $ext_cmd, '', 1, + rdb_create_rule( $rule, $cmd_type, $ext_cmd, $int_cmd, 1, $source, $dest, $base, 0, $run_time, 1, $PA_extra_gen ); } else { @@ -4484,7 +4564,6 @@ sub rdb_set_latex_deps { rdb_remove_rule( "bibtex $bbl_base" ); } else { -# ?? MAY NEED TO FIX IF $aux_dir IS SET: parse_aux( "$bbl_base.aux", \@new_bib_files, \@new_aux_files, \@new_bst_files ); # Remove OPPOSITE kind of bbl generation: rdb_remove_rule( "biber $bbl_base" ); @@ -4496,7 +4575,7 @@ sub rdb_set_latex_deps { "$bbl_base.bcf", $bbl_file, $bbl_base, 1, 0); } else { - rdb_create_rule( $from_rule, 'external', $bibtex, '', 1, + rdb_create_rule( $from_rule, 'external', $bibtex, 'run_bibtex', 1, "$bbl_base.aux", $bbl_file, $bbl_base, 1, 0); } } @@ -4919,7 +4998,6 @@ sub deps_list { sub{ $source{$file} = 1; } ); foreach (keys %generated_exts_all) { -# ?? MAY NEED TO FIX THE FOLLOWING IF $aux_dir or $out_dir IS SET. (my $name = /%R/ ? $_ : "%R.$_") =~ s/%R/$root_filename/; push @generated, $name; } @@ -7434,6 +7512,34 @@ sub find_process_id { #************************************************************ #************************************************************ +#============================================ + +sub good_cwd { + # Return cwd, but under cygwin, convert to MSWin path + # so that result can be used for input to MSWin programs + # as well as cygwin programs + my $cwd = cwd(); + if ( $^O eq "cygwin" ) { + my $cmd = "cygpath -w \"$cwd\""; + my $Win_cwd = `$cmd`; + chomp $Win_cwd; + if ( $Win_cwd ) { + $cwd = $Win_cwd; + } + else { + warn "$My_name: Could not correctly run command\n", + " '$cmd'\n", + " to get MSWin version of cygwin path\n", + " '$cwd'\n", + " The result was\n", + " 'Win_cwd'\n"; + } + } + return $cwd; +} + +#============================================ + # Directory stack routines sub pushd { |