diff options
author | Karl Berry <karl@freefriends.org> | 2024-04-10 20:22:17 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2024-04-10 20:22:17 +0000 |
commit | 1dfbccb2c396ae5432344380d4bcd0e3a3ec0b52 (patch) | |
tree | 0f8ee534a233ed2be4984a20be9d9321fd7a5f9f /Master/texmf-dist/scripts/latexmk | |
parent | cea6d378de5db0333ac4f0fd7d1a7b9dfbaf5a2f (diff) |
latexmk (10apr24)
git-svn-id: svn://tug.org/texlive/trunk@70909 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/scripts/latexmk')
-rwxr-xr-x | Master/texmf-dist/scripts/latexmk/latexmk.pl | 350 |
1 files changed, 271 insertions, 79 deletions
diff --git a/Master/texmf-dist/scripts/latexmk/latexmk.pl b/Master/texmf-dist/scripts/latexmk/latexmk.pl index 44ee6a05a73..4e7b8a9d55d 100755 --- a/Master/texmf-dist/scripts/latexmk/latexmk.pl +++ b/Master/texmf-dist/scripts/latexmk/latexmk.pl @@ -47,8 +47,8 @@ BEGIN { # blocks. $my_name = 'latexmk'; $My_name = 'Latexmk'; - $version_num = '4.83'; - $version_details = "$My_name, John Collins, 31 Jan. 2024. Version $version_num"; + $version_num = '4.85'; + $version_details = "$My_name, John Collins, 7 Apr. 2024. Version $version_num"; } use Config; @@ -365,7 +365,8 @@ our @latex_file_hooks = (); # # Single hash for various stacks of hooks: our %hooks = (); -for ( 'before_xlatex', 'after_xlatex', 'after_xlatex_analysis' ) { +for ( 'before_xlatex', 'after_xlatex', 'after_xlatex_analysis', 'after_main_pdf', + 'cleanup', 'cleanup_extra_full' ) { $hooks{$_} = []; } $hooks{aux_hooks} = \@aux_hooks; @@ -415,7 +416,11 @@ our $lualatex_silent_switch = '-interaction=batchmode'; our $xelatex_silent_switch = '-interaction=batchmode'; # Whether to emulate -aux-directory, so we can use it on system(s) (TeXLive) -# that don't support it: +# that don't support it. +# Possible values: 0: I don't do any emulation, and use -aux-directory & +# -out-directory options to *latex. +# 1: Emulate MiKTeX behavior: Use -output-directory=<aux dir> +# in call to *latex. Then move pdf (etc) files after run. our $emulate_aux = 1; # Whether emulate_aux had to be switched on during a run: our $emulate_aux_switched = 0; @@ -740,10 +745,6 @@ our ( $pdf_previewer, $ps_previewer, $ps_previewer_landscape, $dvi_previewer, $dvi_previewer_landscape, $hnt_previewer ); $pdf_previewer = $ps_previewer = $ps_previewer_landscape = $dvi_previewer = $dvi_previewer_landscape = $hnt_previewer = "NONE"; -# The following variables are assigned once and then used in symbolic -# references, so we need to avoid warnings 'name used only once': -our ( $aux_dir_requested, $out_dir_requested ); - our $dvi_update_signal = undef; our $ps_update_signal = undef; our $pdf_update_signal = undef; @@ -767,6 +768,11 @@ our $hnt_update_method = 1; our $ps_update_method = 1; our $pdf_update_method = 1; +# Whether to allow latexmk to create subdirectories of aux_dir when there's +# a report in the log file that *latex "can't write on file ...". +# Values: 0: no subdir creation, +# 1: only for aux files (occurs with \include{chapters/chap} etc +# 2: generally our $allow_subdir_creation = 1; our $new_viewer_always = 0; # If 1, always open a new viewer in pvc mode. @@ -1259,7 +1265,7 @@ our $texfile_search = ""; # Specification for extra files to search for # This variable is obsolete, and only in here for # backward compatibility. -our $jobname = ''; # Jobname: as with current tex, etc indicates +our $jobname = ''; # Jobname: as with current tex, etc indicates # basename of generated files. Defined so # that --jobname=STRING on latexmk's command # line has same effect as with current tex, @@ -1272,6 +1278,7 @@ our $jobname = ''; # Jobname: as with current tex, etc indicates # dependent on name of main TeX file; this is # useful when a jobname is used and latexmk is # invoked on multiple files. +our $out2_dir = ''; # Directory for final output files. our $out_dir = ''; # Directory for output files. # Cf. --output-directory of current *latex # Blank means default, i.e., cwd. @@ -1283,6 +1290,17 @@ our $aux_dir = ''; # Directory for aux files (log, aux, etc). # Corresponding forms that can be concatenated (e.g., when $aux_dir is '.', $aux_dir1 is './'). our $aux_dir1 = ''; our $out_dir1 = ''; +our $out2_dir1 = ''; + +# Use the following for saving original values, before directories are normalized. +our ( $aux_dir_requested, $out_dir_requested, $out2_dir_requested ); + + + +# Extensions for files to be copied to $out2_dir. +# Specify as for @generated_exts: I.e., extension w/o period +# or string including %R to be substituted by basename. +our @out2_exts = ( 'hnt', 'pdf', 'ps', 'synctex', 'synctex.gz' ); ## default flag settings. our $recorder = 1; # Whether to use recorder option on latex/pdflatex @@ -1641,6 +1659,7 @@ our %rule_db = (); # Database of all rules: # %R for base of primary tex file, %T for # texfile name, %O for options, # %V=$aux_dir, %W=$out_dir, + # %X for $out2_dir1 # %Y for $aux_dir1, and %Z for $out_dir1 # int_cmd specifies any internal command to be # used to implement the application of the @@ -1865,7 +1884,7 @@ our ($rule, $PA_extra_gen, $PAint_cmd, $PArule_data, $Pbase, $Pchanged, $Plast_message, $Plast_result, $Plast_result_info, $Pno_history, $Pout_of_date, $Pout_of_date_user, $Prun_time, $Psource, $file, $PAfile_data, $Ptime, $Psize, $Pmd5, $DUMMY, $Pcorrect_after_primary -); + ); # User's home directory our $HOME = ''; @@ -1970,8 +1989,6 @@ if ( $auto_rc_use ) { read_first_rc_file_in_list( ".latexmkrc", "latexmkrc" ); } - - ## Process command line args. our @command_line_file_list = (); our $bad_options = 0; @@ -2108,6 +2125,9 @@ while (defined(local $_ = $ARGV[0])) { elsif ( /^-output-directory=(.*)$/ ||/^-outdir=(.*)$/ ) { $out_dir = $1; } + elsif ( /^-out2dir=(.*)$/ ) { + $out2_dir = $1; + } elsif ( /^-output-format=(.*)$/ ) { my $format = $1; if ($format eq 'dvi' ) { @@ -2330,20 +2350,25 @@ print "$My_name: This is $version_details.\n", &config_to_mine; +# Save original values for use in diagnositics. +# We may change $aux_dir and $out_dir after a detection +# of results of misconfiguration. +$aux_dir_requested = $aux_dir; +$out_dir_requested = $out_dir; +$out2_dir_requested = $out2_dir; + if ($out_dir eq '' ){ # Default to cwd $out_dir = '.'; } +if ($out2_dir eq '' ){ + # Default to cwd + $out2_dir = $out_dir; +} if ( $aux_dir eq '' ){ # Default to out_dir - # ?? This is different than MiKTeX $aux_dir = $out_dir; } -# Save original values for use in diagnositics. -# We may change $aux_dir and $out_dir after a detection -# of results of misconfiguration. -$aux_dir_requested = $aux_dir; -$out_dir_requested = $out_dir; if ($bibtex_use > 1) { push @generated_exts, 'bbl'; @@ -2742,10 +2767,18 @@ our ( @default_includes, $texfile_name, $root_filename, $log_name, $dvi_name, $dviF_name, $hnt_name, $ps_name, $psF_name, $pdf_name, $xdv_name, $dvi_final, $hnt_final, $ps_final, $pdf_final, $xdv_final, + $dvi_final2, $hnt_final2, $ps_final2, $pdf_final2, $view_file, %rule_list, $missing_dvi_pdf, $switched_primary_output -); + ); +# Defaults for when rule-using subroutines are used outside a rule: +$rule = ''; +$Pbase = \$root_filename; +$Psource = \$texfile_name; +my $start_time = time(); +$Prun_time = \$start_time; + FILE: foreach $filename ( @file_list ) { @@ -2776,6 +2809,7 @@ foreach $filename ( @file_list ) # Use of $do_cd, which can affect how $aux_dir and $out_dir get normalized. local $aux_dir = $aux_dir; local $out_dir = $out_dir; + local $out2_dir = $out2_dir; local $dvilualatex = $dvilualatex; local $hilatex = $hilatex; @@ -3249,25 +3283,32 @@ sub normalize_aux_out_ETC { # Ensure the output/auxiliary directories exist, if need be, **with error checking**. my $ret1 = 0; my $ret2 = 0; + my $ret3 = 0; eval { if ( $out_dir ) { $ret1 = make_path_mod( $out_dir, 'output' ); } + if ( $out2_dir ) { + $ret2 = make_path_mod( $out2_dir, 'final output' ); + } if ( $aux_dir && ($aux_dir ne $out_dir) ) { - $ret2 = make_path_mod( $aux_dir, 'auxiliary' ); + $ret3 = make_path_mod( $aux_dir, 'auxiliary' ); } }; - if ($ret1 || $ret2 || $@ ) { + if ($ret1 || $ret2 || $ret3 || $@ ) { if ($@) { print "Error message:\n $@"; } die "$My_name: Since there was trouble making the output (and aux) dirs, I'll stop\n" } if ($normalize_names) { - foreach ( $aux_dir, $out_dir ) { $_ = normalize_filename_abs($_); } + foreach ( $aux_dir, $out_dir, $out2_dir ) { + $_ = normalize_filename_abs($_); + } } $aux_dir1 = $aux_dir; $out_dir1 = $out_dir; - foreach ( $aux_dir1, $out_dir1 ) { + $out2_dir1 = $out2_dir; + foreach ( $aux_dir1, $out_dir1, $out2_dir1 ) { if ($_ eq '.') {$_ = '';} if ( ($_ ne '') && ! m([\\/\:]$) ) { # Add a trailing '/' if necessary to give a string that can be @@ -3317,8 +3358,9 @@ sub normalize_aux_out_ETC { if ($diagnostics || $aux_out_dir_report ) { print "$My_name: Cwd: '", good_cwd(), "'\n"; - print "$My_name: Normalized aux dir and out dir: '$aux_dir', '$out_dir'\n"; - print "$My_name: and combining forms: '$aux_dir1', '$out_dir1'\n"; + print "$My_name: Normalized aux dir and out dirs:\n", + " '$aux_dir', '$out_dir', '$out2_dir'\n"; + print "$My_name: and combining forms:\n '$aux_dir1', '$out_dir1', '$out2_dir1'\n"; if ($aux_out_dir_report == 2) { exit 0; } @@ -3449,6 +3491,7 @@ sub rdb_initialize_rules { # until run time, in case of changes. foreach ($base, $source, $dest, @$PA_extra_gen, @$PA_extra_source ) { s/%R/$root_filename/g; + s/%X/$out2_dir1/; s/%Y/$aux_dir1/; s/%Z/$out_dir1/; } @@ -3504,21 +3547,22 @@ sub rdb_set_rule_templates { # Set up specifications for standard rules, adjusted to current conditions # Substitutions: %S = source, %D = dest, %B = this rule's base # %T = texfile, %R = root = base for latex. +# %X for $out2_dir1, # %Y for $aux_dir1, %Z for $out_dir1 my $print_file = ''; my $print_cmd = 'NONE'; if ( $print_type eq 'dvi' ) { - $print_file = $dvi_final; + $print_file = $dvi_final2; $print_cmd = $lpr_dvi; } elsif ( $print_type eq 'pdf' ) { - $print_file = $pdf_final; + $print_file = $pdf_final2; $print_cmd = $lpr_pdf; } elsif ( $print_type eq 'ps' ) { - $print_file = $ps_final; + $print_file = $ps_final2; $print_cmd = $lpr; } elsif ( $print_type eq 'none' ) { @@ -3533,7 +3577,7 @@ sub rdb_set_rule_templates { if ( ($view eq 'dvi') || ($view eq 'hnt') || ($view eq 'pdf') || ($view eq 'ps') ) { no strict "refs"; - $view_file = ${$view.'_final'}; + $view_file = ${$view.'_final2'}; $viewer = ${$view.'_previewer'}; $viewer_update_method = ${$view.'_update_method'}; $viewer_update_signal = ${$view.'_update_signal'}; @@ -3544,6 +3588,8 @@ sub rdb_set_rule_templates { # Specification of internal command for viewer update: my $PA_update = ['do_update_view', $viewer_update_method, $viewer_update_signal, 0, 1]; + # Base name is to be without path for *latex-type rules + # With path for others. %rule_list = ( 'dvilualatex' => [ 'primary', "$dvilualatex", '', "%T", $dvi_name, "%R", 1, [$aux_main, $log_name], [$aux_main] ], 'hilatex' => [ 'primary', "$hilatex", '', "%T", $hnt_name, "%R", 1, [$aux_main, $log_name], [$aux_main] ], @@ -3551,12 +3597,14 @@ sub rdb_set_rule_templates { 'lualatex' => [ 'primary', "$lualatex", '', "%T", $pdf_name, "%R", 1, [$aux_main, $log_name], [$aux_main] ], 'pdflatex' => [ 'primary', "$pdflatex", '', "%T", $pdf_name, "%R", 1, [$aux_main, $log_name], [$aux_main] ], 'xelatex' => [ 'primary', "$xelatex", '', "%T", $xdv_name, "%R", 1, [$aux_main, $log_name], [$aux_main] ], + 'dvipdf' => [ 'external', "$dvipdf", 'do_viewfile', $dvi_final, $pdf_name, "%Z%R", 1 ], 'xdvipdfmx' => [ 'external', "$xdvipdfmx", 'do_viewfile', $xdv_final, $pdf_name, "%Z%R", 1 ], 'dvips' => [ 'external', "$dvips", 'do_viewfile', $dvi_final, $ps_name, "%Z%R", 1 ], 'dvifilter' => [ 'external', $dvi_filter, 'do_viewfile', $dvi_name, $dviF_name, "%Z%R", 1 ], 'ps2pdf' => [ 'external', "$ps2pdf", 'do_viewfile', $ps_final, $pdf_name, "%Z%R", 1 ], 'psfilter' => [ 'external', $ps_filter, 'do_viewfile', $ps_name, $psF_name, "%Z%R", 1 ], + 'print' => [ 'external', "$print_cmd", 'if_source', $print_file, "", "", 1 ], 'update_view' => [ 'external', $viewer_update_command, $PA_update, $view_file, "", "", 2 ], @@ -3763,7 +3811,12 @@ sub set_trivial_aux_fdb { # 2. Write a corresponding fdb file # 3. Provoke a run of *latex (actually of all primaries). - open( my $aux_file, '>', $aux_main ) + # Use raw mode for writing aux file, so that line endings are \n. + # Otherwise on Windows, the aux file file will have \r\n line endings. + # Since both TeXLive and MiKTeX write \n rather than \r\n, latexmk will + # unnecessarily detect a change in the aux file because of the changed + # line endings, and thereby provoke a superfluous extra *latex run. + open( my $aux_file, '> :raw', $aux_main ) or die "Cannot write file '$aux_main'\n"; fprint8( $aux_file, "\\relax \n" ); # The following is added by recent versions of latex for a @@ -3788,8 +3841,9 @@ sub do_cleanup { my $kind = $_[0]; if (! $kind ) { return; } my @files_to_delete = (); - my @dirs = ($aux_dir1); - if ($out_dir1 ne $aux_dir1) { push @dirs, $out_dir1; } + my %dirs = (); + foreach ($aux_dir1, $out_dir1, $out2_dir1) { $dirs{$_} = 1; } + my @dirs = keys %dirs; push @files_to_delete, &get_small_cleanup; if ($kind == 1) { @@ -3797,19 +3851,25 @@ sub do_cleanup { push @files_to_delete, cleanup_get1( $dir1, @final_output_exts ); } } - # show_array( "Files to delete", sort @files_to_delete ); - # Names of contents of directory are longer than the name of the directory, - # but contain the directory name as an initial segment. - # Therefore deleting files and directories in the order given by reverse - # sort deletes contents of directory before attempting to delete the - # directory: + # Run the hooks first, since to determine what custom deletions they + # are to make, the hook subroutines may need access to files that + # cleanup later deletes (log, aux, ...). + run_hooks( 'cleanup' ); + if ($kind == 1) { run_hooks( 'cleanup_extra_full' ); } + + # Names of contents of directory are longer than the name of the + # directory, but contain the directory name as an initial segment. + # Therefore deleting files and directories in the order given by + # reverse sort deletes contents of directory before attempting to + # delete the directory: unlink_or_move( reverse sort @files_to_delete ); - # If the fdb file (or log, fls and/or aux files) exist, it/they will have - # been used to make a changed rule database. But a cleanup implies - # that we need a virgin rule database, corresponding to current state - # of files (after cleanup) so we reset the rule database and rule net: + # If the fdb file (or log, fls and/or aux files) exist, it/they will + # have been used to make a changed rule database. But a cleanup + # implies that we need a virgin rule database, corresponding to + # current state of files (after cleanup) so we reset the rule + # database and rule net: &rdb_initialize_rules; } @@ -4760,6 +4820,8 @@ sub print_help " -norc - omit automatic reading of system, user and project rc files\n", " -output-directory=dir or -outdir=dir\n", " - set name of directory for output files\n", + " -out2dir=dir\n", + " - set name of directory for final output files\n", " -output-format=FORMAT\n", " - if FORMAT is dvi, turn on dvi output, turn off others\n", " - if FORMAT is pdf, turn on pdf output, turn off others\n", @@ -5423,6 +5485,10 @@ sub set_names { $ps_name = "%Z%R.ps"; $psF_name = "%Z%R.psF"; $pdf_name = "%Z%R.pdf"; + $dvi_final2 = "%X%R.pdf"; + $hnt_final2 = "%X%R.pdf"; + $pdf_final2 = "%X%R.pdf"; + $ps_final2 = "%X%R.pdf"; ## It would be logical for a .xdv file to be put in the out_dir, ## just like a .dvi file. But the only program, MiKTeX, that ## currently implements aux_dir, and hence allows aux_dir ne out_dir, @@ -5430,8 +5496,12 @@ sub set_names { $xdv_name = "%Y%R.xdv"; foreach ( $aux_main, $log_name, $fdb_name, $fls_name, $fls_name_alt, - $dvi_name, $hnt_name, $ps_name, $pdf_name, $xdv_name, $dviF_name, $psF_name ) { + $dvi_name, $hnt_name, $ps_name, $pdf_name, $xdv_name, + $dviF_name, $psF_name, + $dvi_final2, $hnt_final2, $pdf_final2, $ps_final2, + ) { s/%R/$root_filename/g; + s/%X/$out2_dir1/; s/%Y/$aux_dir1/; s/%Z/$out_dir1/; } @@ -5452,6 +5522,95 @@ sub set_names { #************************************************** +sub do_moves_aux_to_out { + # do_moves_aux_to_out( source, dest ) + # Moves appropriate output files from source dir (e.g., $aux_dir1) to + # dest dir (e.g., $out_dir1). + # Veto move of file if it wasn't generated on current compilation. + # Special treatment of .fls file + # Assume rule context, which may be global context. + # Directory names should end in /, so that concatenation OK. + my ($source1, $dest1) = @_; + foreach my $ext ( 'fls', 'dvi', 'hnt', 'pdf', 'ps', 'synctex', 'synctex.gz' ) { + if ( ($ext eq 'fls') && ! $fls_uses_out_dir ) {next;} + my $from = "$source1$$Pbase.$ext"; + my $to = "$dest1$$Pbase.$ext" ; + if ( test_gen_file_time( $from ) ) { + if (! $silent) { print "$My_name: Moving '$from' to '$to'\n"; } + my $ret = move( $from, $to ); + if ( ! $ret ) { die " That failed, with message '$!'\n";} + } + } +} #END do_moves_aux_to_out + +#************************************************************************* + +sub do_copies_out_to_out2 { + # do_copies_out_to_out2( source, dest ) + # Copies final output files from source dir (e.g., $out_dir1) to + # dest dir (e.g., $out2_dir1). + # Note copy, not move, otherwise rules complain about non-existent + # destination pdf file (etc). + # Assume rule context, which is normally global context. + # Directory names should end in /, so that concatenation OK. + my ($source1, $dest1) = @_; + + # Ideally, guard against source and destination being same. + # Easy case: + my $absSource = abs_path($source1); + my $absDest = abs_path($dest1); + if ( defined($absSource) && defined($absDest) && ($absSource eq $absDest) ) { + # Directories are same. Nothing to do. + # Note that abs_path can return undef under certain error conditions. + # I'll leave the diagnosis to the copy subroutine. + return; + } + # !!! HOWEVER: !! + # There can be multiple ways of referring to the same directories + # without that being detectable by the use of abs_path + # on the names: E.g., on Windows one directory is referred to via a + # drive letter that is used for files on a server, and the second + # uses the '\\...' (or '//...'construction to refer to the server directly. + # Also, on a OS/FS combination that is insensitive to case, the + # abs_paths can differ in case while referring to the same entity + # On UNIX, I can use a dev and inode test for equality, from the + # results of stat. + # But that doesn't work on Windows (where the inode numbers + # returned by stat are always zero). + # Easiest is to let the copy subroutine do the work, and just + # diagnose the situation when it fails + + say "$My_name: Copying final output files from '$source1' to '$dest1'"; + + foreach ( @out2_exts ) { + my $name = ( /%R/ ? $_ : "%R.$_" ); + $name =~ s/%R/$$Pbase/; + my $from = "$source1$name"; + my $to = "$dest1$name"; + if ( test_gen_file_time( $from ) ) { + if (! $silent) { print "$My_name: Copying '$from' to '$to'\n"; } + # Work around problem that if $from and $to refer to the same + # file, then copy returns zero, for error, but does **not** set + # $!. (This is surely a bug, since copy (i.e., + # File::Copy::copy) is documented to set $! when it encounters + # an error.) So in this situation $! contains whatever error + # code was set by something else earlier. + # I'll reset $! to 0 here, which corresponds to no error. + # If after running copy, it's still zero, but copy reports + # failure, then that indicates that $from and $to are the same + # file, and we didn't actually need a copy; for latexmk it's a + # non-error. + local $! = 0; + my $ret = copy( $from, $to ); + if ( $ret ) { } # Success + elsif ($!) { warn "$My_name: Failure of copy from '$from' to '$to', error =\n $!\n"; } + else { } # Non-error. + } + } +} #END do_copies_out_to_out2 + +#************************************************************************* + sub correct_locations { # Deal with situations after a *latex run where files are in different # directories than expected (specifically aux v. output directory). @@ -5467,26 +5626,15 @@ sub correct_locations { # Assumes rule context. my $where_log = &find_set_log; - if ( $emulate_aux && ($aux_dir ne $out_dir) ) { - # Move output files from aux_dir to out_dir - # Move fls file also, if the configuration is for fls in out_dir. - # Omit 'xdv', that goes to aux_dir (as with MiKTeX). It's not final output. - foreach my $ext ( 'fls', 'dvi', 'hnt', 'pdf', 'ps', 'synctex', 'synctex.gz' ) { - if ( ($ext eq 'fls') && ! $fls_uses_out_dir ) {next;} - my $from = "$aux_dir1$$Pbase.$ext"; - my $to = "$out_dir1$$Pbase.$ext" ; - if ( test_gen_file_time( $from ) ) { - if (! $silent) { print "$My_name: Moving '$from' to '$to'\n"; } - my $ret = move( $from, $to ); - if ( ! $ret ) { die " That failed, with message '$!'\n";} - } - } + + if ( ($aux_dir_requested ne '') && $emulate_aux && ($aux_dir ne $out_dir) ) { + do_moves_aux_to_out( $aux_dir1, $out_dir1 ); } # Fix ups on fls file: if ($recorder) { # Deal with following special cases: - # 1. Some implemenations of *latex give fls files of name latex.fls + # 1. Some implementations of *latex give fls files of name latex.fls # or pdflatex.fls instead of $$Pbase.fls. # 2. In some implementations, the writing of the fls file (memory # of old implementations) may not respect the -output-directory @@ -6018,8 +6166,9 @@ LINE: $idx_file = $1; } else { - warn "$My_name: Message indicates index file was written\n", - " ==> but I do not know how to understand it: <==\n", + warn "$My_name: A message suggests an index file may have been written\n", + " but it is not of a form I understand. This is probably innocuous.\n", + " The message is\n", " '$_'\n"; next LINE; } @@ -6117,7 +6266,9 @@ LINE: my $dir = $1; my $file = $2; my $full_dir = $aux_dir1.$dir; - if ( ($aux_dir ne '') && (! -e $full_dir) && ( $file =~ /\.aux$/) ) { + if ( ($aux_dir ne '') && (! -e $full_dir) + && ( ($file =~ /\.aux$/) || ($allow_subdir_creation == 2) ) + ) { warn "$My_name: === There were problems writing to '$file' in '$full_dir'\n", " I'll try to make the subdirectory later.\n" if $diagnostics; @@ -6126,9 +6277,9 @@ LINE: else { warn "$My_name: ====== There were problems writing to", "----- '$file' in '$full_dir'.\n", - "----- But this is not the standard situation of\n", - "----- aux file to subdir of output directory, with\n", - "----- non-existent subdir\n", + "----- But this is not the standard situation of file to subdir of output\n", + "----- directory, with non-existent subdir, and either file is aux file or\n", + "----- or \$allow_subdir_creation is set to 2.\n"; } } @@ -7631,6 +7782,7 @@ LINE: } close $in_handle; # Get state of dependencies, including creating cus deps if needed + # !!!??? This doesn't match definition of rdb_set_dependents &rdb_set_dependents( keys %rule_db ); &rdb_set_rule_net; @@ -8088,6 +8240,12 @@ sub rdb_set_latex_deps { } } + foreach my $file ( keys %generated_fls ) { + if ( $file =~ /^(.*)\.idx$/ ) { + $idx_files{$file} = [ "$1.ind", $1 ]; + print "Have index file '$file', @{$idx_files{$file}}\n"; + } + } IDX_FILE: foreach my $idx_file ( keys %idx_files ) { my ($ind_file, $ind_base) = @{$idx_files{$idx_file}}; @@ -8310,7 +8468,7 @@ NEW_SOURCE: my @more_sources = &rdb_set_dependents( $rule ); my $num_new = $#more_sources + 1; - foreach (@more_sources) { + foreach (@more_sources) { $dependents{$_} = 4; if ( ! -e $_ ) { # Failure was non-existence of makable file @@ -8572,7 +8730,8 @@ sub rdb_find_source_file { } if ( exists $ENV{TEXINPUTS} ) { foreach my $searchpath (split $search_path_separator, $ENV{TEXINPUTS}) { - my $file = catfile($searchpath,$_[0]); + my $file = catfileA($searchpath,$_[0]); + if ( $file =~ /\\/ ) { print "====== '$file'\n"; die; } my $test = "$file.$_[1]"; if ( -e $test ) { return $file; @@ -8589,7 +8748,7 @@ sub rdb_one_dep { # Assume file (and rule) context for DESTINATION file. # Only look for dependency if $rule is primary rule (i.e., latex - # or pdflatex) or is a custom dependency: + # or pdflatex) or is a custom dependency: ???WHY???!!! if ( (! exists $possible_primaries{$rule}) && ($rule !~ /^cusdep/) ) { return; } @@ -8660,7 +8819,7 @@ DEP: && (! -e $file ) && (! -e "$base_name.$proptoext" ) && exists $$Pinput_extensions{$proptoext} - ) { + ) { # Empty extension and non-existent destination # This normally results from \includegraphics{A} # without graphics extension for file, when file does @@ -9236,8 +9395,11 @@ sub rdb_make { } ); } - rdb_for_some( [@unusual_one_time], \&rdb_make1 ); + if ( ($out2_dir_requested ne '') && ($out_dir ne $out2_dir) ) { + do_copies_out_to_out2( $out_dir1, $out2_dir1 ); + } + #--------------------------------------- # All of make done. Finish book-keeping: @@ -9632,7 +9794,13 @@ sub rdb_run1 { else { # No special analysis for other rules } - + if ($$Pdest eq $pdf_final) { + if ( run_hooks( 'after_main_pdf' ) ) { + warn "$My_name: ======Some hook failed.\n"; + $return = -1; + } + } + # General $updated = 1; if ( ($$Plast_result == 0) && ($return != 0) && ($return != -2) ) { @@ -10572,6 +10740,7 @@ sub rdb_create_rule { foreach ( $PAextra_gen, $PAextra_source ) { if (! defined $_) { $_ = []; } } + my $last_result = -1; my $last_result_info = ''; my $no_history = ($run_time <= 0); @@ -11505,6 +11674,7 @@ sub add_hook { warn "In add_hook, request to add hook to non-existent stack '$stack'.\n"; return 0; } + print "============== ADDING HOOK to $stack\n"; my $ref; if ( ref $routine ) { @@ -11530,22 +11700,35 @@ sub run_hooks { # a. If arguments follow the stackname in the call to run_hooks, these # are given to the called subroutines. # b. Otherwise a hash of information is given to the called subroutines. - # Return 1 for success, 0 for failure. + # Each has a return value, which like from system, is 0 for success. + # Return 0 for success, non-zero for failure. my $name = shift; my $Pstack = $hooks{$name}; my @args = @_; if (!@args) { @args = &info_make; } else { print "Have args\n"; } - if (defined $Pstack) { + + if ( ! defined $Pstack ) { + warn "run_hooks: No stack named '$name'\n"; + # But I'll not treat this as an error. Is that appropriate? + return 0; + } + elsif (! @$Pstack) { + # Nothing to do + return 0; + } + else { + print "$My_name: Running hooks in stack $name\n"; + my $fail = 0; # Do NOT use default $_, as in "for (...) {...}": # The called subroutine may change $_, which is a global variable # (although localized to the for loop and called subroutines). - for my $Psub ( @$Pstack) { &$Psub(@args); } - return 1; - } - else { - warn "run_hooks: No stack named '$name'\n"; - return 0; + for my $Psub ( @$Pstack) { + if ( &$Psub(@args) ) { + $fail = 1; + } + } + return $fail; } } @@ -11723,6 +11906,15 @@ sub ext_no_period { #************************************************************ +sub catfileA { + # Like catfile, but change \ to / in result. + my $file = catfile(@_); + $file =~ s[\\][/]g; + return $file; +} + +#************************************************************ + sub fileparseA { # Like fileparse but replace $path for current dir ('./' or '.\') by '' # Also default second argument to get normal extension. @@ -12300,7 +12492,7 @@ sub config_to_mine { # -outdir=... option, are already in the system CS, because that is # how strings are passed on the command line. # So we just need to do a conversion for strings with utf8 flag on: - foreach ( $out_dir, $aux_dir, @default_files, @default_excluded_files ) { + foreach ( $out_dir, $out2_dir, $aux_dir, @default_files, @default_excluded_files ) { if (utf8::is_utf8($_)) { $_ = encode( $CS_system, $_ ); } } } #END config_to_mine |