summaryrefslogtreecommitdiff
path: root/support/latexmk/latexmk.pl
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2021-04-17 03:00:41 +0000
committerNorbert Preining <norbert@preining.info>2021-04-17 03:00:41 +0000
commit8ca7af6e140fdaee415715e4a537d8f1a9305198 (patch)
tree7ca5f98e34ec0c9e917f70c3577a3a3b0cff176f /support/latexmk/latexmk.pl
parent487e248ea8406af82362ed0cf749198b48b38183 (diff)
CTAN sync 202104170300
Diffstat (limited to 'support/latexmk/latexmk.pl')
-rwxr-xr-xsupport/latexmk/latexmk.pl742
1 files changed, 382 insertions, 360 deletions
diff --git a/support/latexmk/latexmk.pl b/support/latexmk/latexmk.pl
index a05e938f91..1ef32d985e 100755
--- a/support/latexmk/latexmk.pl
+++ b/support/latexmk/latexmk.pl
@@ -1,130 +1,7 @@
#!/usr/bin/env perl
-#!!!!!!!!!!!!!!!!!!!????????? CLEAN UP INITIALIZATION
-#!!! See all FIX items.
-# Perhaps add subroutine rdb_change_active( (rules to deactivate), (rules to activate))
-
-# ?? Still need to fix bcf error issue.
-# Don't keep looping after error
-# pvc: Only re-run on USER FILE CHANGE.
-# See # ??????? BCF
-
-
-#!!!!!!!!??? Check @pwd_log
-
-
-# !!!!!!!!!! Don't forget to document $silence_logfile_warnings.!!!
-
-# N.B. !!!!!!!!!!! See 17 July 2012 comments !!!!!!!!!!!!!!!!!!
-
-# On a UNIX-like system, the above enables latexmk to run independently
-# of the location of the perl executable. This line relies on the
-# existence of the program /usr/bin/env
-# If there is a problem for any reason, you can replace the first line of
-# this file by:
-
-#!/usr/bin/perl -w
-
-# with the path of the perl executable adjusted for your system.
-
-use warnings;
-
-# Delete #??!! when working
-
-# See ?? <===============================
-
-## ?? Issues with clean-up
-## List of aux files deleted is those read, not those generated.
-## Other files are generated by *latex; should they be deleted?
-## (I have hooks for this).
-
-
-
-#=======================================
-
-#?? Force mode doesn't appear to do force (if error in latex file)
-#??? Get banner back in.
-#?? CORRECT DIAGNOSTICS ON CHANGED FILES IF THEY DIDN'T EXIST BEFORE
-#?? Further corrections to deal with disappeared source files for custom dependencies.
-# Message repeatedly appears about remake when source file of cusdep doesn't exist.
-#?? logfile w/o fdb file: don't set changed file, perhaps for generated exts.
-# Reconsider
-#?? Do proper run-stuff for bibtex, makeindex, cus-deps. OK I think
-# Parse and correctly find ist files
-
-
-# ATTEMPT TO ALLOW FILENAMES WITH SPACES:
-# (as of 1 Apr 2006, and then 14 Sep. 2007)
-
-# Problems:
-# A. Quoting filenames will not always work.
-# a. Under UNIX, quotes are legal in filenames, so when PERL
-# directly runs a binary, a quoted filename will be treated as
-# as a filename containing a quote character. But when it calls
-# a shell, the quotes are handled by the shell as quotes.
-# b. Under MSWin32, quotes are illegal filename characters, and tend
-# to be handled correctly.
-# c. But under cygwin, results are not so clear (there are many
-# combinations: native v. cygwin perl, native v cygwin programs
-# NT v. unix scripts, which shell is called.
-# B. TeX doesn't always handle filenames with spaces gracefully.
-# a. UNIX/LINUX: The version on gluon2 Mar 31, 2006 to Sep. 2007)
-# doesn't handle them at all. (TeX treats space as separator.)
-# b. At least some later versions actually do (Brad Miller e-mail,
-# Sep. 2007).
-# c. fptex [[e-TeXk, Version 3.141592-2.1 (Web2c 7.5.2)] does, on
-# my MSWin at home. In \input the filename must be in quotes.
-# d. Bibtex [BibTeX (Web2c 7.5.2) 0.99c on my MSWin system at home,
-# Sep. 2007] does not allow names of bibfiles to have spaces.
-# C. =====> Using the shell for command lines is not safe, since special
-# characters can cause lots of mayhem.
-# It will therefore be a good idea to sanitize filenames.
-#
-# I've sanitized all calls out:
-# a. system and exec use a single argument, which forces
-# use of shell, under all circumstances
-# Thus I can safely use quotes on filenames: They will be handled by
-# the shell under UNIX, and simply passed on to the program under MSWin32.
-# b. I reorganized Run, Run_Detached to use single command line
-# c. All calls to Run and Run_Detached have quoted filenames.
-# d. So if a space-free filename with wildcards is given on latexmk's
-# command line, and it globs to space-containing filename(s), that
-# works (fptex on home computer, native NT tex)
-# e. ====> But globbing fails: the glob function takes space as filename
-# separator. ====================
-
-#================= TO DO ================
-#
-# 1. See ?? ESPECIALLY $MSWin_fudge_break
-# 2. Check fudged conditions in looping and make_files
-# 3. Should not completely abort after a run that ends in failure from latex
-# Missing input files (including via custom dependency) should be checked for
-# a change in status
-# If sources for missing files from custom dependency
-# are available, then do a rerun
-# If sources of any kind become available rerun (esp. for pvc)
-# rerun
-# Must parse log_file after unsuccessful run of latex: it may give
-# information about missing files.
-# 4. Check file of bug reports and requests
-# 5. Rationalize bibtex warnings and errors. Two almost identical routines.
-# Should 1. Use single routine
-# 2. Convert errors to failure only in calling routine
-# 3. Save first warning/error.
-
-# ?? Use of generated_exts arrays and hashes needs rationalization
-
-# To do:
-# Rationalize again handling of include files.
-# Now I use kpsewhich to do searches, if file not found
-# (How do I avoid getting slowed down too much?)
-# Document the assumptions at each stage of processing algorithm.
-# Option to restart previewer automatically, if it dies under -pvc
-# Test for already running previewer gets wrong answer if another
-# process has the viewed file in its command line
-
-## Copyright John Collins 1998-2020
+## Copyright John Collins 1998-2021
## (username jcc8 at node psu.edu)
## (and thanks to David Coppit (username david at node coppit.org)
## for suggestions)
@@ -149,25 +26,86 @@ use warnings;
##
##
##
-## NEW FEATURES, since v. 2.0:
-## 1. Correct algorithm for deciding how many times to run latex:
-## based on whether source file(s) change between runs
-## 2. Continuous preview works, and can be of ps file or dvi file
-## 3. pdf creation by pdflatex possible
-## 4. Defaults for commands are OS dependent.
-## 5. Parsing of log file instead of source file is used to
-## obtain dependencies, by default.
-##
-## Modification log from 9 Dec 2011 onwards in detail
-##
-## 12 Jan 2012 STILL NEED TO DOCUMENT some items below
+## Modification log from 1 Jan 2020 onwards in detail
##
+## 14-15 Apr 2021 John Collins In normalize_filename, try both good_cwd() and
+## cwd() for removing directory component.
+## That improves clean up.
+## V. 4.72b
+## 14 Apr 2021 John Collins Allow index instead of makeindex in indexfudge options
+## 12 Apr 2021 John Collins Start to fix bug on not-found files with out_dir = .
+## 11 Apr 2021 John Collins V. 4.72a.
+## Modify contents of minimal aux file.
+## 9 Apr 2021 John Collins Correct bug that if on one run of latexmk a
+## missing file was detected and the file was
+## later created, then a subsequent run of latexmk
+## didn't cause a recompilation. The cause was an
+## error in latexmk's initialization of its file
+## database.
+## V. 4.72.
+## 12 Jan 2021 John Collins Correct parse_log
+## 28 Dec 2020 John Collins Process -output-format=fmt option rather than passing it to *latex
+## 26-27 Dec 2020 John Collins Deal with bug exposed by chapterbib. (It involved
+## incorrect attempt to deal with filenames specified
+## relative to aux_dir.
+## 14 Dec 2020 John Collins Try to solve problems of normalization of source
+## name and general normalization of file names.
+## 10 Dec 2020 John Collins Set up run_makeindex and $makeindex_fudge, just as
+## for bibtex, and corresponding CL options.
+## Revert changes to normalize_filename, they aren't
+## needed any more.
+## Normalize filenames in rdb_ensure_file.
+## 25 Nov 2020 John Collins Revert to default $bibtex_fudge to 1
+## Rationale:
+## There are enough annoying security-related
+## complications in many cases concerning
+## filenames with a path component given to
+## bibtex, that it is better to do the cd trick
+## by default. In addition there are some
+## interesting incompatibilities between TeXLive
+## and MiKTeX. In the rare (I suspect) cases
+## where the fudge fails, the user can always
+## turn it off, of course.
+## I should do same fudge for makeindex.
+## Comment out warning when bibtex fudge is used.
+## 18 Nov 2020 John Collins Add options -bibtexfudge, -bibtexfudge-, -nobibtexfudge,
+## so that the options are in agreement with documentation
+## including historical versions.
+## Set environmnent variable TEXMFOUTPUT to the
+## aux_dir. This solves problem that bibtex and
+## makeindex sometimes cannot write to the
+## aux_dir (for their log and output files). This
+## problem occurs notably when the aux_dir is
+## specified by an absolute path to a directory that
+## is not a subdirectory of the cwd.
+## 12 Nov 2020 John Collins Correct some aliasing of filenames.
+## 11 Nov 2020 John Collins Remove some messages.
+## Don't allow log file as a source.
+## 2 Nov 2020 John Collins Refuse to allow main pdf file or main output file to
+## be source of a primary rule, and give warning
+## about it. (Concerns at least hyperxmp (2020/10/05 v. 5.6;
+## this accesses file system metadata, specifically file size,
+## and the fls file therefore lists the pdf file as a source.
+## This generally leads to an infinite loop, without a special
+## a configuration.) Hyperxmp v. 5.7 2010/11/01 doesn't give
+## this problem. But the test is still good to have.
+## 23 Oct 2020 John Collins Fix incorrect $/ in reading rc files
+## 10-15 Oct 2020 John Collins Correct bug in normalizing filename
+## Give .latexmkrc priority over latexmkrc in cwd
+## 8 Oct 2020 John Collins Restore use Cwd "chdir";. There's no longer
+## a problem with cd
+## 7 Oct 2020 John Collins Extra diagnostics for reporting normalized aux/out dirs
+## 6 Oct 2020 John Collins Better normalize etc.
+## 1 Oct 2020 John Collins Improve some messages.
+## 30 Sep 2020 John Collins V. 4.70c.
+## Clean up some comments.
## 29 Sep 2020 John Collins V. 4.70b.
## Correct switch_output.
## Try to ensure bibtex isn't given absolute pathname, when aux_dir
## is under current directory. (Otherwise bibtex isn't allowed
## to write a bbl file under default TeXLive settings.)
## Add options -bibfudge, -bibfudge-, -nobibfudge.
+## Current version (4.70b, 29 Sep 2020) to CTAN
## 13 Sep 2020 John Collins V. 4.70a. Updates in comments about bibtex.
## 28 Aug 2020 John Collins Correct $biber and $bibtex to use %S not %B
## 24 Aug 2020 John Collins Make sure bibtex/biber rules when created for
@@ -221,81 +159,9 @@ use warnings;
## xetex source). This forces xdvipdfmx to always
## try to embed fonts, ignoring licensing flags, etc.
##
-## Current version (4.67, 26 Dec 2019) to CTAN
-## 26 Dec 2019 John Collins Change place of setting of $view_file
-## Make fully consistent set of options for engines:
-## -latex, -latex=...,
-## preserving backward compatibility, and avoiding suprises.
-## 11 Dec 2019 John Collins Change rules for wrapping in log file: This deals
-## with xelatex wrapping at > standard number of
-## bytes in presence of non-ASCII Unicode characters.
-## 4 Dec 2019 John Collins If there were missing subdirectories in output/aux
-## directories, and these were successfully created,
-## then ignore error from *latex, since rerun may
-## succeed.
-## 14 Nov 2019 John Collins Add comment.
-## 12 Nov 2019 John Collins Use $compiling_cmd, $warning_cmd, $success_cmd
-# on normal make, rather than just in -pvc mode.
-## 5 Aug 2019 John Collins The changing of '\' to '/' in filenames is now
-## done for msys as well as MSWin32.
-## 8 Jul 2019 John Collins Allow addition of hook for processing lists of
-## missing source files, used after run of *latex.
-## 2 Jul 2019 John Collins Silence message about disallowing change of output
-## file type.
-## V. 4.66
-## 28 Jun 2019 John Collins Try to deal with log file parsing problems
-## V. 4.65
-## 21 May 2019 John Collins Fix incorrect listings by -rules and by -deps
-## 21 May 2019 John Collins V. 4.64a.
-## 20,21 May 2019 John Collins Fix problem with not always running dvipdf,
-## dvips, xdvpdf because of missing information
-## on source files. Do this by adding a
-## source_rule hash to each rule and adding a
-## pass-based criterion for out-of-dateness
-## 20 May 2019 John Collins V. 4.64.
-## 17 Mar 2019 John Collins V. 4.63c.
-## 18 Mar 2019 John Collins Update copyright date
-## 17 Mar 2019 John Collins Further test for problems when linking rules
-## 17 Mar 2019 John Collins V. 4.63b.
-## 17 Mar 2019 John Collins Fix problem revealed by bibtopic package
-## 15 Mar 2019 John Collins Corrections
-## 14 Mar 2019 John Collins Version to 4.63a
-## 12-14 Mar 2019 John Collins Jobname has placeholder
-## 8-11 Mar 2019 John Collins Correct aux-dir bugs
-## 8 Mar 2019 John Collins Version to 4.63
-## 1 Jan 2019 John Collins Correct bug in output switching code
-## 31 Dec 2018 John Collins Correct bug that with $cleanup_includes_generated
-## -c mode deletes final output files (e.g., .dvi, .pdf).
-## 13 Dec 2018 John Collins Fixes, cleanup
-## 12 Dec 2018 John Collins Fix rdb_read
-## 11 Dec 2018 John Collins For output-switch: Reorganize initialization
-## Remove possibility of more than one primary.
-## 1 Dec 2018 John Collins Clean up some code.
-## 30 Nov 2018 John Collins Allow any characters in directory part of tex
-## filename when cd mode on. (Still standard
-## set of disallowed characters applies basename.)
-## 21 Nov 2018 John Collins Infrastructure finished, I think, for active flag
-## Start on output switch
-## 16 Nov 2018 John Collins Remove in non-diagnostics mode a warning about
-## rule not in use in this session that is given
-## when reading an fdb_latexmk file.
-## 2 Nov 2018 John Collins Start implementing active flag for rules.
-## 1 Nov 2018 John Collins Fix finding of missing files that are relative to aux_dir
-## 29-31 Oct 2018 John Collins Some cleanup.
-## 27,28 Oct 2018 John Collins Fix bug that in -pvc mode, after an error in
-## certain rules, new rounds of compilation
-## are triggered because of changes in generated
-## files, instead of only by later user-generated
-## changes.
-## Improve linking of rules.
-## 25 Oct 2018 John Collins V. 4.62
-## Clean up can remove (empty) directories
-## 25 Oct 2018 John Collins Fix definition of clean up substitution for %R
-## so that something with intermediate %R works,
-## as in 'pythontex-files-%R/*'.
##
-## 1998-2018, John Collins. Many improvements and fixes.
-## See CHANGE-log.txt for full list, and CHANGES for summary
+## 1998-2019, John Collins: Many improvements and fixes.
+## See CHANGE-log.txt for full list, and CHANGES for summaries
##
## Modified by Evan McLean (no longer available for support)
## Original script (RCS version 2.3) called "go" written by David J. Musliner
@@ -313,8 +179,8 @@ use warnings;
$my_name = 'latexmk';
$My_name = 'Latexmk';
-$version_num = '4.70b';
-$version_details = "$My_name, John Collins, 29 September 2020";
+$version_num = '4.72b';
+$version_details = "$My_name, John Collins, 15 April 2021";
use Config;
use File::Basename;
@@ -351,8 +217,9 @@ use File::Path 2.08 qw( make_path );
use FileHandle;
use File::Find;
use List::Util qw( max );
-use Cwd; # To be able to change cwd
-#use Cwd "chdir"; # Ensure $ENV{PWD} tracks cwd. NO NEED, and it messes up -cd -outdir=
+use Cwd;
+use Cwd "abs_path";
+use Cwd "chdir"; # Ensure $ENV{PWD} tracks cwd.
use Digest::MD5;
#use strict;
@@ -414,6 +281,8 @@ $log_wrap = 79;
# See subroutine test_fix_texnames and its call for their use.
$illegal_in_texname = "\x00\t\f\n\r\$%\\~\x7F";
+# Whether to normalize filenames where possible:
+$normalize_names = 2; # Strongest kind.
## Hash mapping file extension (w/o period, e.g., 'eps') to a single regexp,
# whose matching by a line in a file with that extension indicates that the
@@ -539,7 +408,6 @@ foreach (
"-mltex enable MLTeX extensions such as \charsubdef",
"-output-comment=STRING use STRING for DVI file comment instead of date\n".
" (no effect for PDF)",
- "-output-format=FORMAT use FORMAT for job output; FORMAT is `dvi\" or `pdf\"",
"-parse-first-line enable parsing of first line of input file",
"-no-parse-first-line disable parsing of first line of input file",
"-progname=STRING set program (and fmt) name to STRING",
@@ -621,6 +489,7 @@ foreach (
#-jobname=STRING set the job name to STRING
#-aux-directory=dir Set the directory dir to which auxiliary files are written
#-output-directory=DIR use existing DIR as the directory to write files in
+ # "-output-format=FORMAT use FORMAT for job output; FORMAT is `dvi\" or `pdf\"",
#-quiet
#-recorder enable filename recorder
#
@@ -659,12 +528,6 @@ foreach (
$biber = 'biber %O %S';
$bibtex = 'bibtex %O %S';
# Switch(es) to make biber & bibtex silent:
-$bibtex_fudge = 0; # Don't use hack to get bibtex working in old versions that
- # don't handle output-directory. When this version of
- # latexmk is part of a distribution of TeX, the
- # accompanying bibtex should also be recent enough
- # (e.g., TeXLive 2019 or later, current MiKTeX) not to
- # need the hack/fudge.
$biber_silent_switch = '--onlylog';
$bibtex_silent_switch = '-terse';
$bibtex_use = 1; # Whether to actually run bibtex to update bbl files.
@@ -685,11 +548,23 @@ $bibtex_use = 1; # Whether to actually run bibtex to update bbl files.
#
# In any event bibtex is only run if the log file
# indicates that the document uses bbl files.
+$bibtex_fudge = 1; # Whether or not to cd to aux dir when running bibtex.
+ # If the cd is not done, and bibtex is passed a
+ # filename with a path component, then it can easily
+ # happen that (a) bibtex refuses to write bbl and blg
+ # files to the aux directory, for security reasons,
+ # and/or (b) bibtex in pre-2019 versions fails to find
+ # some input file(s). But in some other cases, the cd
+ # method fails.
## Command to invoke makeindex
$makeindex = 'makeindex %O -o %D %S';
# Switch(es) to make makeinex silent:
$makeindex_silent_switch = '-q';
+$makeindex_fudge = 1; # Whether or not to cd to aux dir when running makeindex.
+ # Set to 1 to avoid security-related prohibition on
+ # makeindex writing to aux_dir when it is not specified
+ # as a subdirectory of cwd.
## Command to convert dvi file to pdf file directly:
$dvipdf = 'dvipdf %O %S %D';
@@ -1548,13 +1423,14 @@ $allow_switch = 1; # Allow switch of rule structure to accommodate
# for source, %B for base of current rule,
# %R for base of primary tex file, %T for
# texfile name, %O for options,
+ # %V=$aux_dir, %W=$out_dir,
# %Y for $aux_dir1, and %Z for $out_dir1
# int_cmd specifies any internal command to be
# used to implement the application of the
# rule. If this is present, it overrides
- # the external command, and it is the
- # responsibility of the perl subroutine
- # specified in intcmd to execute the
+ # **direct** execution of the external command, and
+ # it is the responsibility of the perl subroutine
+ # specified in intcmd to execute the specified
# external command if this is appropriate.
# This variable intcmd is a reference to an array,
# $$intcmd[0] = internal routine
@@ -1776,7 +1652,7 @@ if ( $auto_rc_use && ($HOME ne "" ) ) {
}
if ( $auto_rc_use ) {
# Rc file in current directory:
- read_first_rc_file_in_list( "./latexmkrc", "./.latexmkrc" );
+ read_first_rc_file_in_list( ".latexmkrc", "latexmkrc" );
}
## Process command line args.
@@ -1793,8 +1669,8 @@ while ($_ = $ARGV[0])
if ( /^-aux-directory=(.*)$/ || /^-auxdir=(.*)$/ ) {
$aux_dir = $1;
}
- elsif (/^-bibfudge$/) { $bibtex_fudge = 1; }
- elsif (/^-bibfudge-$/) { $bibtex_fudge = 0; }
+ elsif (/^-bib(tex|)fudge$/) { $bibtex_fudge = 1; }
+ elsif (/^-bib(tex|)fudge-$/) { $bibtex_fudge = 0; }
elsif (/^-bibtex$/) { $bibtex_use = 2; }
elsif (/^-bibtex-$/) { $bibtex_use = 0; }
elsif (/^-nobibtex$/) { $bibtex_use = 0; }
@@ -1861,6 +1737,8 @@ while ($_ = $ARGV[0])
shift;
}
elsif ( /^-MP$/ ) { $dependents_phony = 1; }
+ elsif (/^-(make|)indexfudge$/) { $makeindex_fudge = 1; }
+ elsif (/^-(make|)indexfudge-$/) { $makeindex_fudge = 0; }
elsif ( /-MSWinBackSlash$/ ) { $MSWin_back_slash = 1; }
elsif ( /-MSWinBackSlash-$/ ) { $MSWin_back_slash = 0; }
elsif (/^-new-viewer$/) {
@@ -1873,10 +1751,26 @@ while ($_ = $ARGV[0])
$auto_rc_use = 0;
# N.B. This has already been obeyed.
}
- elsif (/^-nobibfudge$/) { $bibtex_fudge = 0; }
+ elsif (/^-nobib(tex|)fudge$/) { $bibtex_fudge = 0; }
+ elsif (/^-no(make|)indexfudge$/) { $makeindex_fudge = 0; }
elsif ( /^-output-directory=(.*)$/ ||/^-outdir=(.*)$/ ) {
$out_dir = $1;
}
+ elsif ( /^-output-format=(.*)$/ ) {
+ my $format = $1;
+ if ($format eq 'dvi' ) {
+ $dvi_mode = 1;
+ $pdf_mode = $postscript_mode = 0;
+ }
+ elsif ($format eq 'pdf' ) {
+ $pdf_mode = 1;
+ $dvi_mode = $postscript_mode = 0;
+ }
+ else {
+ warn "$My_name: unknown format in option '$_'\n";
+ $bad_options++;
+ }
+ }
elsif (/^-p$/) { $printout_mode = 1;
$preview_continuous_mode = 0; # to avoid conflicts
$preview_mode = 0;
@@ -2045,7 +1939,7 @@ while ($_ = $ARGV[0])
push @extra_xelatex_options, $original;
}
elsif (/^-/) {
- warn "$My_name: $_ bad option\n";
+ warn "$My_name: $_ unknown option\n";
$bad_options++;
}
else {
@@ -2083,8 +1977,6 @@ $out_dir_requested = $out_dir;
# 3 log file **not** in aux_dir or out_dir, but in cwd.
$where_log = -1;
-&set_dirs_etc;
-
if ($bibtex_use > 1) {
push @generated_exts, 'bbl';
}
@@ -2253,19 +2145,6 @@ if ( $recorder ) {
# possible cd to the document directory, since the directories can be
# relative to the document.
-$q = $quote_filenames ? '"' : '';
-if ( $out_dir ) {
- add_option( "-output-directory=$q$out_dir$q",
- \$latex, \$pdflatex, \$lualatex, \$xelatex );
-}
-if ( $aux_dir && ($aux_dir ne $out_dir) ) {
- # N.B. If $aux_dir and $out_dir are the same, then the -output-directory
- # option is sufficient, especially because the -aux-directory exists
- # only in MiKTeX, not in TeXLive.
- add_option( "-aux-directory=$q$aux_dir$q",
- \$latex, \$pdflatex, \$lualatex, \$xelatex );
-}
-
if ( $jobname ne '' ) {
# Since $jobname may include placeholder(s), put %R placeholder
# in option, and let %R be substituted by actual jobname at runtime.
@@ -2467,6 +2346,8 @@ foreach ($clean_ext, $clean_full_ext) { s/^\s+//; s/\s+$//; s/\s+/ /g; }
# Deal with illegal and problematic characters in filename:
test_fix_texnames( @file_list );
+$quote = $quote_filenames ? '"' : '';
+
FILE:
foreach $filename ( @file_list )
{
@@ -2479,12 +2360,18 @@ foreach $filename ( @file_list )
if ( $do_cd ) {
($filename, $path) = fileparse( $filename );
warn "$My_name: Changing directory to '$path'\n"
- if !$silent;
+ if !$silent;
pushd( dirname_no_tail( $path ) );
}
else {
$path = '';
}
+ local $aux_dir = $aux_dir;
+ local $out_dir = $out_dir;
+ local $latex = $latex;
+ local $lualatex = $lualatex;
+ local $pdflatex = $pdflatex;
+ local $xelatex = $xelatex;
# Ensure the output/auxiliary directories exist, if need be
if ( $out_dir ) {
@@ -2516,7 +2403,31 @@ foreach $filename ( @file_list )
}
}
+ if ($normalize_names) {
+ $aux_dir = normalize_filename($aux_dir);
+ $out_dir = normalize_filename($out_dir);
+ }
+ set_dirs_etc();
+ if ($diagnostics) {
+ warn "$My_name: Cwd: '", good_cwd(), "'\n";
+ warn "$My_name: Normalized aux dir and out dir: '$aux_dir', '$out_dir'\n";
+ warn "$My_name: and combining forms: '$aux_dir1', '$out_dir1'\n";
+ }
+ if ( $out_dir && ($out_dir ne '.') ) {
+ add_option( "-output-directory=$quote$out_dir$quote",
+ \$latex, \$pdflatex, \$lualatex, \$xelatex );
+ }
+ if ( $aux_dir && ($aux_dir ne '.') && ($aux_dir ne $out_dir) ) {
+ # N.B. If $aux_dir and $out_dir are the same, then the -output-directory
+ # option is sufficient, especially because the -aux-directory exists
+ # only in MiKTeX, not in TeXLive.
+ add_option( "-aux-directory=$quote%V$quote",
+ \$latex, \$pdflatex, \$lualatex, \$xelatex );
+ }
+
+
&set_names;
+
# For use under error conditions:
@default_includes = ($texfile_name, $aux_main);
# N.B. Do **not** apply local %rule_db here. It might appear appropriate,
@@ -2710,15 +2621,13 @@ foreach $filename ( @file_list )
rdb_for_some( [keys %current_primaries], \&rdb_set_latex_deps );
}
}
- foreach $rule ( &rdb_accessible ) {
- # For all source files of all accessible rules,
- # if the file data are not already set (e.g., from fdb_latexmk
- # file, set them from disk.
- rdb_one_rule ($rule, undef,
- sub{ if ( $$Ptime == 0) { &rdb_update1; } }
- );
- }
-
+ # At this point, we assume that the file database was correctly
+ # initialized from fdb_latexmk database (corresponding to the state at
+ # the end of the previous run of latexmk, if the fdb_latexmk file exists.
+ # PERHAPS if fdb_latexmk doesn't exist we ought to assume there was
+ # a previous run that completed, if the appropriate output files exist,
+ # so a new run of *latex etc isn't needed; then we should set the file
+ # data from the on-disk state.
if ($go_mode) {
# Force everything to be remade.
rdb_recurse( [ &rdb_target_array], sub{$$Pout_of_date=1;} );
@@ -2937,7 +2846,7 @@ sub ensure_path {
else {
$ENV{$var} = $_ . $search_path_separator;
}
- if (!$silent) {
+ if ($diagnostics) {
print "Set environment variable $var='$ENV{$var}'\n";
}
}
@@ -2946,18 +2855,27 @@ sub ensure_path {
#############################################################
sub set_dirs_etc {
- # Normalize versions terminating in directory/path separator
- # and versions referring to current directory
- # These actions in a subroutine so they can be used elsewhere.
+ # Normalize $out_dir and $aux_dir, so that if they have a non-trivial last
+ # component, any trailing '/' is removed.
+ # Then set $out_dir1 and $aux_dir1 to have a directory separator character
+ # '/' added if needed to give forms suitable for direct concatenation with
+ # a filename. These are needed for substitutions like %Y%R.
+ # Nasty cases of dir_name: "/" on all systems, "A:", "A:/" etc on MS-Win
+ # Then set some TeX-related environment variables.
$out_dir = dirname_no_tail( $out_dir );
$aux_dir = dirname_no_tail( $aux_dir );
$out_dir1 = $out_dir;
$aux_dir1 = $aux_dir;
- foreach ( $aux_dir1, $out_dir1 ) {
+ $out_dir_abs = abs_path($out_dir);
+ $out_dir1_abs = $out_dir_abs;
+ $aux_dir_abs = abs_path($aux_dir);
+ $aux_dir1_abs = $aux_dir_abs;
+ foreach ( $aux_dir1, $out_dir1, $aux_dir1_abs, $out_dir1_abs ) {
if ( ($_ ne '') && ! m([\\/\:]$) ) {
+ # Add a trailing '/' if necessary to give a string that can be
+ # correctly concatenated with a filename:
$_ .= '/';
}
- while ( s[^\.\/][] ) {}
}
if ($aux_dir) {
# Ensure $aux_dir is in BIBINPUTS and TEXINPUTS search paths.
@@ -2970,9 +2888,31 @@ sub set_dirs_etc {
# there is an error. So cope with this situation (and any analogous
# cases by adding the aux_dir to the relevant path search environment
# variables. BIBINPUTS seems to be the only one currently affected.
+ # Convert $aux_dir to absolute path to make the search path invariant
+ # under change of directory.
foreach ( 'BIBINPUTS', 'TEXINPUTS' ) {
- ensure_path( $_, $aux_dir );
- }
+ ensure_path( $_, $aux_dir_abs );
+ }
+ # Set TEXMFOUTPUT so that when the aux_dir is not a subdirectory
+ # of the cwd (or below), bibtex and makeindex can write to it.
+ # Otherwise, security precautions in these programs will prevent
+ # them from writing there.
+ # The security issues concern **document-controlled** writing of
+ # files, when bibtex or makeindex is invoked directly by a
+ # document. In contrast, here $aux_dir is set by latexmk, not by
+ # the document. (See the main texmf.cnf file in a TeXLive
+ # distribution for some information.) The security issues here
+ # appear to be identical to those when giving an
+ # -output-directory=... option to *latex.
+ # CONSTRAINTS:
+ # 1. This works in the aux dir is an an absolute path pointing to a
+ # higher-level directory, but NOT when it is a relative path, e.g.,
+ # "../build".
+ # 2. The directories for files on the command line given to bibtex
+ # and makeindex must be exactly the same as the value in $aux_dir.
+ # This is ensured by the way in which the command strings are
+ # constructed.
+ $ENV{TEXMFOUTPUT} = $aux_dir_abs;
}
}
@@ -3179,6 +3119,7 @@ sub rdb_make_links {
# over non-main generated files from other rules.
local %from_rules_old = %from_rules;
&rdb_cache_generated;
+
rdb_for_actives(
0,
sub{
@@ -3194,7 +3135,7 @@ sub rdb_make_links {
}
);
rdb_for_actives( \&rdb_set_source_rules );
-# &rdb_show;
+# print "=========In rdb_make_links: rules\n"; &rdb_show;
} # END rdb_make_links
#************************************************************
@@ -3296,8 +3237,13 @@ sub one_from_rule_cache {
#************************************************************
sub set_trivial_aux_fdb {
- # 1. Write aux file EXACTLY as would be written if the tex file
- # had no cross references, etc. I.e., a minimal .aux file.
+ # 1. Write aux file as would be written if the tex file had no cross
+ # cross references, etc. i.e., a minimal .aux file, as would be
+ # written by latex with a simple document.
+ # That saves a run of latex on such simple documents.
+ # Before about 2020, latex only wrote one line, containing '\relax '
+ # in the aux file. After that a reference to the last page was
+ # added. So now I write what is written for a one page document.
# 2. Write a corresponding fdb file
# 3. Provoke a run of *latex (actually of all primaries).
@@ -3305,6 +3251,9 @@ sub set_trivial_aux_fdb {
open( aux_file, '>', $aux_main )
or die "Cannot write file '$aux_main'\n";
print aux_file "\\relax \n";
+ # The following is added by recent versions of latex for a
+ # one page document
+ print aux_file "\\gdef \\\@abspage\@last{1}\n";
close(aux_file);
foreach my $rule (keys %possible_primaries ) {
@@ -3807,8 +3756,10 @@ sub process_rc_file {
return 1;
}
elsif ( open $RCH, "<$rc_file" ) {
- { local $/; eval <$RCH>; }
+ my $code = '';
+ { local $/; $code = <$RCH>;}
close $RCH;
+ eval $code;
}
else {
warn "$My_name: I cannot read the rc-file '$rc_file'\n";
@@ -3998,8 +3949,8 @@ sub print_help
" -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",
- " -bibfudge - use change-directory fudge needed for old bibtexs\n",
- " -bibfudge- - don't use change-directory fudge needed for old bibtexs\n",
+ " -bibfudge or -bibtexfudge - change directory to output directory when running bibtex\n",
+ " -bibfudge- or -bibtexfudge- - don't change directory when running bibtex\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",
@@ -4033,6 +3984,8 @@ sub print_help
" -g- - Turn off -g\n",
" -h - print help\n",
" -help - print help\n",
+ " -indexfudge or -makeindexfudge - change directory to output directory when running makeindex\n",
+ " -indexfudge- or -makeindexfudge- - don't change directory when running makeindex\n",
" -jobname=STRING - set basename of output file(s) to STRING.\n",
" (Like --jobname=STRING on command line for many current\n",
" implementations of latex/pdflatex.)\n",
@@ -4050,6 +4003,8 @@ sub print_help
" -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",
+ " -makeindexfudge - change directory to output directory when running makeindex\n",
+ " -makeindexfudge-- don't change directory to output directory when running makeindex\n",
" -MSWinBackSlash under MSWin use backslash (\\) for directory separators\n",
" for filenames given to called programs\n",
" -MSWinBackSlash- under MSWin use forward slash (/) for directory separators\n",
@@ -4057,11 +4012,16 @@ sub print_help
" -new-viewer - in -pvc mode, always start a new viewer\n",
" -new-viewer- - in -pvc mode, start a new viewer only if needed\n",
" -nobibtex - never use bibtex\n",
- " -nobibfudge - don't use change-directory fudge needed for old bibtexs\n",
+ " -nobibfudge or -nobibtexfudge - don't change directory when running bibtex\n",
" -nodependents - Do not show list of dependent files after processing\n",
+ " -noindexfudge or -nomakeindexfudge - don't change directory when running makeindex\n",
" -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",
+ " -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",
+ " - otherwise error\n",
" -pdf - generate pdf by pdflatex\n",
" -pdfdvi - generate pdf by dvipdf\n",
" -pdflatex=<program> - set program used for pdflatex.\n",
@@ -4337,7 +4297,11 @@ sub run_bibtex {
my $return = 999;
# Prevent changes we make to environment becoming global:
local %ENV = %ENV;
+
my ( $base, $path, $ext ) = fileparseA( $$Psource );
+ # Define source and dest base to include extension, no path.
+ my $source_base = $base.$ext;
+ my $dest_base = basename( $$Pdest );
if ( $path && $bibtex_fudge ) {
# Up to TeXLive 2018, the following was true; situation has changed since.
# When an output directory is specified and with a bibtex from 2018 or
@@ -4346,6 +4310,9 @@ sub run_bibtex {
# directory to the directory of the top-level .aux file to run bibtex.
# But we have to fix search paths for .bib and .bst, since they may be
# specified relative to the document directory.
+ # There is also another problem: Depending on the exact
+ # specification of the aux dir, bibtex may refuse to write to the
+ # aux dir, for security reasons.
my $cwd = good_cwd();
foreach ( 'BIBINPUTS', 'BSTINPUTS' ) {
if ( exists $ENV{$_} ) {
@@ -4357,31 +4324,56 @@ sub run_bibtex {
}
pushd( $path );
if (!$silent) {
- print "$My_name: ==========WARNING:=================\n",
- "I am taking action to evade a bug/feature in older versions of bibtex\n",
- "This may give problems under some situations, symptomized by bibtex not\n",
- "finding a .bib file or an aux file.\n",
- "Provided you have a recent version of bibtex (about 2019 or later) you\n",
- "can avoid the problems by putting '\$bibtex_fudge = 0;' in an\n",
- "initialization file (a latexmrc file for $my_name.\n",
- "\n",
- "Here my bug-evading action:\n",
- "I temporarily changed directory to '$path'\n",
- "Set BIBINPUTS='$ENV{BIBINPUTS}'\n",
- "Set BSTINPUTS='$ENV{BSTINPUTS}'\n";
- }
- $return = &Run_subst( undef, undef, '', $base.$ext, '', $base );
+ print "$My_name: Change directory to '$path'.\n",
+ "To assist finding of files in document\n",
+ "directory, I set\n",
+ " BIBINPUTS='$ENV{BIBINPUTS}'\n",
+ " BSTINPUTS='$ENV{BSTINPUTS}'.\n";
+ }
+ # Override standard substitutions for source, dest, and base names in
+ # default external command:
+ $return = &Run_subst( undef, undef, '', $source_base, $dest_base, $base );
popd();
if (!$silent) {
- print "$My_name: changed directory back to '", cwd(), "'\n";
+ print "$My_name: Change directory back to '", cwd(), "'\n";
}
}
else {
+ # Use default substitutions etc for rule:
$return = Run_subst();
}
return $return;
-}
+} #END run_bibtex
+
+#**************************************************
+sub run_makeindex {
+ my $return = 999;
+ my ( $base, $path, $ext ) = fileparseA( $$Psource );
+
+ # Define source and dest base to include extension, no path.
+ my $source_base = $base.$ext;
+ my $dest_base = basename( $$Pdest );
+ if ( $path && $makeindex_fudge ) {
+ my $cwd = good_cwd();
+ pushd( $path );
+ if (!$silent) {
+ print "$My_name: Change directory to '$path'.\n";
+ }
+ # Override standard substitutions for source, dest, and base names in
+ # default external command:
+ $return = &Run_subst( undef, undef, '', $source_base, $dest_base, $base );
+ popd();
+ if (!$silent) {
+ print "$My_name: Change directory back to '", cwd(), "'\n";
+ }
+ }
+ else {
+ # Use default substitutions etc for rule:
+ $return = Run_subst();
+ }
+ return $return;
+} #END run_makeindex
#**************************************************
@@ -4423,7 +4415,6 @@ sub check_bibtex_log {
}
close $blg_file;
my $missing = $missing_citations + $#missing_aux + 1;
-
if ( $#missing_aux > -1 ) {
# Need to make the missing files.
warn "$My_name: One or more aux files is missing for bibtex. I'll try\n",
@@ -4453,17 +4444,15 @@ sub check_bibtex_log {
sub normalize_force_directory {
# Usage, normalize_force_directory( dir, filename )
+ # Filename is assumed to be relative to dir (terminated with directory separator).
# Perform the following operations:
# Clean filename
- # If filename contains no path component, insert dir in front
+ # Prefix filename with dir
# Normalize filename
# Return result
- my $default_dir = $_[0];
+ my $dir = $_[0];
my $filename = clean_filename( $_[1] );
- my ($base_name, $path ) = fileparse( $filename );
- if ( $base_name eq $filename ) {
- $filename = "$default_dir$filename";
- }
+ $filename = "$dir$filename";
return normalize_filename( $filename );
} #END normalize force_directory
@@ -4595,22 +4584,6 @@ sub parse_log {
# print "==== Cusdep to-exts:"; foreach (keys %cusdep_to) {print " '$_'";} print "\n";
- # Filenames given in log file may be preceded by a pathname
- # denoting current directory. In MiKTeX, this is an absolute
- # pathname; in TeXLive, it is './'. Either way, we'll want to
- # remove this pathname string --- see the comments in sub
- # rdb_set_latex_deps. In order of reliability for use in
- # normalizing filenames from the log file, the following forms
- # of the cwd are used:
- # (a) internally deduced pwd from log file from sequence of lines
- # **file
- # (dir/file
- # if possible. NO THAT'S WRONG if kpsearch is done.
- # (b) from PWD line in fls file (if available), passed as $pwd_latex
- # (c) system-given cwd as interpreted by sub good_cwd.
- # We'll put the first two in @pwd_log
- my @pwd_log = ();
- if ($pwd_latex) { push @pwd_log, $pwd_latex; }
# $primary_out is actual output file (dvi or pdf)
# It is initialized before the call to this routine, to ensure
@@ -4851,6 +4824,8 @@ LINE:
# \openout followed by filename followed by line end.
# pdflatex and xelatex quote it and wrap,
# lualatex leaves filename as is, and doesn't wrap.
+ # Filename is always relative to aux_dir, given standard security
+ # settings in TeXLive.
my $cand = $1;
if ( $cand =~ /\`\"([^\'\"]+)\"\'\.$/ ) {
# One form of quoting by pdflatex, xelatex: `"..."'.
@@ -4864,7 +4839,7 @@ LINE:
# Bad quotes: e.g., incomplete wrapped line
next LINE;
}
- $generated_log{normalize_force_directory( $aux_dir1, $cand )} = 1;
+ $generated_log{ normalize_force_directory($aux_dir1, $cand) } = 1;
next LINE;
}
# Test for conversion produced by package:
@@ -4903,7 +4878,7 @@ LINE:
$idx_file =~ s/\s*$//;
# When *latex is run with an -output-directory
# or an -aux_directory, the file name does not contain
- # the output path; fix this, after removing quotes:
+ # the path. Fix this:
$idx_file = normalize_force_directory( $aux_dir1, $idx_file );
my ($idx_base, $idx_path, $idx_ext) = fileparseA( $idx_file );
$idx_base = $idx_path.$idx_base;
@@ -4928,10 +4903,10 @@ LINE:
next LINE;
}
elsif ( /^No file (.*?\.bbl)./ ) {
- my $bbl_file = normalize_force_directory( $aux_dir1, $1);
- my $aux_file = $bbl_file;
- $aux_file =~ s/\.bbl$/\.aux/;
- warn "$My_name: Non-existent bbl file '$bbl_file in line'\n $_\n";
+ # Filename is always relative to aux_dir, given standard security
+ # settings in TeXLive.
+ my $bbl_file = normalize_force_directory( $aux_dir1, $1 );
+ warn "$My_name: Missing bbl file '$bbl_file' in following:\n $_\n";
$dependents{$bbl_file} = 0;
push @bbl_files, $bbl_file;
next LINE;
@@ -4939,11 +4914,11 @@ LINE:
foreach my $pattern (@file_not_found) {
if ( /$pattern/ ) {
my $file = clean_filename($1);
- warn "$My_name: Missing input file: '$file' from line\n '$_'\n"
+ warn "$My_name: Missing input file: '$file' from following:\n '$_'\n"
unless $silent;
$dependents{normalize_filename($file, @pwd_log)} = 0;
my $file1 = $file;
- if ( $aux_dir ) {
+ if ( $aux_dir && ($aux_dir ne '.') ) {
# Allow 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
@@ -4955,8 +4930,6 @@ LINE:
# relative to the aux_dir, so allow for that as well
my $file1 = normalize_force_directory( $aux_dir1, $file );
$dependents{$file1} = 0;
- $dependents{$aux_dir1.$file} = 0;
-
}
next LINE;
}
@@ -5147,6 +5120,7 @@ LINE:
next INCLUDE_NAME;
}
$include_name = normalize_filename( $include_name, @pwd_log );
+ if ( ! defined $include_name ) { next INCLUDE_NAME; }
my ($base, $path, $ext) = fileparseB( $include_name );
if ( ($path eq './') || ($path eq '.\\') ) {
$include_name = $base.$ext;
@@ -5434,6 +5408,11 @@ sub parse_fls {
if ( ! open ($fls_file, "<$fls_name") ) {
return 1;
}
+
+ my $pdf_base = basename($pdf_name);
+ my $log_base = basename($log_name);
+ my $out_base = basename($$Pdest);
+
foreach $_ ( <$fls_file> ) {
# Remove trailing CR and LF. Thus we get correct behavior when an fls file
# is produced by MS-Windows program (e.g., in MiKTeX) with CRLF line ends,
@@ -5441,12 +5420,15 @@ sub parse_fls {
# in read-in lines):
$_ =~ s/[\n\r]*$//;
if (/^\s*PWD\s+(.*)$/) {
- $cwd = $1;
- $$Ppwd_latex = $cwd;
- if ( $cwd =~ /\"/ ) {
+ my $cwd_fls = $1;
+ $$Ppwd_latex = $cwd_fls;
+ if ( $cwd_fls =~ /\"/ ) {
warn "$My_name: The working directory has a '\"' character in its name:\n",
" '$cwd'\n This can cause me trouble. Beware!\n";
}
+ if ( normalize_filename($cwd_fls) ne normalize_filename($cwd) ) {
+ print "$My_name: ============== Inequiv cwd_fls cwd '$cwd_fls' '$cwd'\n";
+ }
}
elsif (/^\s*INPUT\s+(.*)$/) {
# Take precautions against aliasing of foo, ./foo and other possibilities for cwd.
@@ -5463,7 +5445,34 @@ sub parse_fls {
if ( (exists $$Poutputs{$file}) && (! exists $$Pinputs{$file}) ) {
$$Pfirst_read_after_write{$file} = 1;
}
- $$Pinputs{$file} = 1;
+ # Take precautions against main destination file being listed as INPUT file
+ # This results, e.g., from hyperxmp (2020/10/05 v. 5.6) reading the pdf file
+ # size, and triggers an infinite loop, unless we omit the pdf file from the
+ # list of input files. (Hyperxmp v. 5.7 2010/11/01 doesn't give this problem.)
+ # There's a related issue with the log file, when acmart.cls is used with
+ # xelatex. (I don't work out what causes this, e.g., what package.)
+ # Test on basenames rather than full name to evade in a simple-minded way
+ # alias issues with the directory part.
+ if ( basename($file) eq $pdf_base ) {
+ warn "$My_name: !!!!!!!!!!! Fls file lists main pdf **output** file as an input\n",
+ " file for rule '$rule'. I won't treat as a source file, since that leads\n",
+ " to an infinite loop.\n",
+ " This can be caused by the hyperxmp package in an old version.\n",
+ " You should update to hyperxmp in ver. 5.7 or higher\n";
+ } elsif ( basename($file) eq $out_base ) {
+ warn "$My_name: !!!!!!!!!!! Fls file lists main **output** file as an input\n",
+ " file for rule '$rule'. I won't treat as a source file, since that leads\n",
+ " to an infinite loop.\n",
+ " This can be caused by the hyperxmp package in an old version.\n",
+ " You should update to hyperxmp in ver. 5.7 or higher\n";
+ } elsif ( basename($file) eq $log_base ) {
+ warn "$My_name: !!!!!!!!!!! Fls file lists log file as an input\n",
+ " file for rule '$rule'. I won't treat it as a source file, since\n",
+ " there appear to be no good uses for it.\n",
+ " This behavior happens at least under acmart.cls with xelatex\n";
+ } else {
+ $$Pinputs{$file} = 1;
+ }
}
elsif (/^\s*OUTPUT\s+(.*)$/) {
# Take precautions against aliasing of foo, ./foo and other possibilities for cwd.
@@ -5481,7 +5490,6 @@ sub parse_fls {
sub dirname_no_tail {
my $dirname = $_[0];
-# print "DNT1 = '$dirname'\n";
foreach ($dirname) {
# Normalize name to use / to separate directory components:
# (Note both / and \ are allowed under MSWin.)
@@ -5497,7 +5505,6 @@ sub dirname_no_tail {
}
}
}
-# print "DNT2 = '$dirname'\n";
return $dirname;
}
@@ -5525,28 +5532,44 @@ sub clean_filename {
sub normalize_filename {
# Usage: normalize_filename( filename [, extra forms of name of cwd] )
# Returns filename with removal of various forms for cwd, and
- # with conversion of directory separator to '/' only
+ # with conversion of directory separator to '/' only.
+ # Works also when filename is name of a directory.
#
my ( $file, @dirs ) = @_;
my $file1 = $file; # Saved original value
my $cwd = good_cwd();
+ my $cwd1 = cwd();
# Normalize files to use / to separate directory components:
# (Note both / and \ are allowed under MSWin.)
- foreach ($cwd, $file, @dirs) {
+ foreach ($cwd, $cwd1, $file, @dirs) {
s(\\)(/)g;
$_ = dirname_no_tail( $_ );
}
+ if ($filename eq '.') { $filename = ''; }
# Remove initial component equal to current working directory.
# Use \Q and \E round directory name in regex to avoid interpretation
# of metacharacters in directory name:
- foreach my $dir ( @dirs, '.', $cwd ) {
+ foreach my $dir ( @dirs, '.', $cwd, $cwd1 ) {
if ( $dir =~ /^\s*$/ ) {
+ # All spaces, nothing to do.
next;
}
+ if ($file eq $dir) {
+ # Filename equals cwd, so it is . relative to cwd:
+ $file = '.';
+ last;
+ }
if ( $file =~ s(^\Q$dir\E/)() ) {
last;
}
}
+ if ($file eq '.' ) {
+ # This only occurs for a directory that is the cwd.
+ # Our convention is always to replace this by a blank.
+ # Watch out for tests of existence that will go wrong,
+ # and for a form for concatenating this with a filename.
+ $file = '';
+ }
return $file;
}
@@ -5556,7 +5579,7 @@ sub normalize_clean_filename {
# Usage: normalize_clean_filename( filename [, extra forms of name of cwd] )
# Same as normalize_filename, but first remove any double quotes, as
# done by clean_filename, which is appropriate for filenames from log file.
- my ($file, @dirs) = @_;
+ my ($file, @dirs) = shift;
return normalize_filename( clean_filename( $file ) , @dirs );
}
@@ -5934,6 +5957,7 @@ 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"; }
+ if ($rule =~ /^makeindex/) { $int_cmd = "run_makeindex"; }
warn "$My_name: File-database '$in_name': setting rule '$rule'\n"
if $diagnostics;
my $cmd_type = 'external';
@@ -5972,7 +5996,6 @@ LINE:
my $size = $3;
my $md5 = $4;
my $from_rule = $5;
-#?? print " --- File '$file'\n";
if ($state != 1) {
warn "$My_name: In file-database '$in_name' ",
"line $. is outside a section:\n '$_'\n";
@@ -6425,7 +6448,7 @@ sub rdb_set_latex_deps {
if ( ! rdb_rule_exists( $from_rule ) ){
print "!!!===Creating rule '$from_rule': '$ind_file' from '$idx_file'\n"
if ($diagnostics);
- rdb_create_rule( $from_rule, 'external', $makeindex, '', 1,
+ rdb_create_rule( $from_rule, 'external', $makeindex, 'run_makeindex', 1,
$idx_file, $ind_file, $ind_base, 1, 0, 0, 1, [ "$ind_base.ilg" ] );
print " ===Source file '$ind_file' for '$rule'\n"
if ($diagnostics);
@@ -6959,10 +6982,9 @@ DEP:
if ( (! -e $file) && $use_make_for_missing_files ) {
# Try to make the missing file
#Set character to surround filenames in commands:
- my $q = $quote_filenames ? '"' : '';
if ( $toext ne '' ) {
print "$My_name: '$rule': source file '$file' doesn't exist. I'll try making it...\n";
- &Run_subst( "$make $q$file$q" );
+ &Run_subst( "$make $quote$file$quote" );
if ( -e $file ) {
return;
}
@@ -6972,7 +6994,7 @@ DEP:
" I'll try making it with allowed extensions \n";
foreach my $try_ext ( keys %$Pinput_extensions ) {
my $new_dest = "$file.$try_ext";
- &Run_subst( "$make $q$new_dest$q" );
+ &Run_subst( "$make $quote$new_dest$quote" );
if ( -e $new_dest ) {
print "SUCCESS in making '$new_dest'\n";
# Put file in rule, without a from_rule, but
@@ -7763,7 +7785,7 @@ sub rdb_classify2 {
sub rdb_run1 {
- # Assumes contexts for: rule.
+ # Assumes context for: rule.
# Unconditionally apply the rule
# Returns return code from applying the rule.
# Otherwise: 0 on other kind of success,
@@ -7790,7 +7812,8 @@ sub rdb_run1 {
if ( ! defined $_ ) { $_ = 'undef'; }
}
if ($int_cmd) {
- print "For rule '$rule', running '\&$int_cmd( @int_args_for_printing )' ...\n";
+ print "For rule '$rule', use internal command '\&$int_cmd( @int_args_for_printing )' ...\n"
+ if $diagnostics;
$return = &$int_cmd( @int_args );
}
elsif ($$Pext_cmd) {
@@ -7976,7 +7999,8 @@ sub Run_subst {
# options, source, dest, base: correspond to placeholders.
# Substitutions:
# %S=source, %D=dest, %B=base, %R=root=base for latex, %O=options,
- # %T=texfile, %Y=$aux_dir1, %Z=$out_dir1
+ # %T=texfile,
+ # %V=$aux_dir, %W=$out_dir, %Y=$aux_dir1, %Z=$out_dir1
# This is a globally usable subroutine, and works in a rule context,
# and outside.
# Defaults:
@@ -8001,24 +8025,24 @@ sub Run_subst {
}
#Set character to surround filenames:
- my $q = $quote_filenames ? '"' : '';
-
my %subst = (
- '%A' => $q.$tex_basename.$q,
- '%B' => $q.$base.$q,
- '%D' => $q.$dest.$q,
+ '%A' => $quote.$tex_basename.$quote,
+ '%B' => $quote.$base.$quote,
+ '%D' => $quote.$dest.$quote,
'%O' => $options,
- '%S' => $q.$source.$q,
- '%R' => $q.$root_filename.$q,
- '%S' => $q.$source.$q,
- '%T' => $q.$texfile_name.$q,
- '%Y' => $q.$aux_dir1.$q,
- '%Z' => $q.$out_dir1.$q,
+ '%S' => $quote.$source.$quote,
+ '%R' => $quote.$root_filename.$quote,
+ '%S' => $quote.$source.$quote,
+ '%T' => $quote.$texfile_name.$quote,
+ '%V' => $quote.$aux_dir.$quote,
+ '%W' => $quote.$out_dir.$quote,
+ '%Y' => $quote.$aux_dir1.$quote,
+ '%Z' => $quote.$out_dir1.$quote,
'%%' => '%' # To allow literal %B, %R, etc, by %%B.
);
if ($pre_tex_code) {
- $subst{'%U'} = $q.$pre_tex_code.$q;
- $subst{'%P'} = "$q$pre_tex_code\\input{$source}$q";
+ $subst{'%U'} = $quote.$pre_tex_code.$quote;
+ $subst{'%P'} = "$quote$pre_tex_code\\input{$source}$quote";
}
else {
$subst{'%U'} = '';
@@ -8594,7 +8618,6 @@ sub rdb_one_rule {
#===== Accesses rule part of database structure =======
local ( $rule, $rule_act1, $file_act, $rule_act2 ) = @_;
-#?? &R1;
if ( (! $rule) || ! rdb_rule_exists($rule) ) { return; }
local ( $PArule_data, $PHsource, $PHdest, $PHsource_rules ) = @{$rule_db{$rule}};
@@ -8608,7 +8631,6 @@ sub rdb_one_rule {
&$rule_act1 if $rule_act1;
&rdb_do_files( $file_act ) if $file_act;
&$rule_act2 if $rule_act2;
-#?? &R2;
} #END rdb_one_rule
#************************************************************
@@ -8671,7 +8693,6 @@ sub rdb_one_file {
# Assumes $rule context set.
#===== Accesses file part of database structure =======
local ($file, $file_act) = @_;
-#?? &F1;
if ( (!$file) ||(!exists ${$PHsource}{$file}) ) { return; }
local $PAfile_data = ${$PHsource}{$file};
local ($Ptime, $Psize, $Pmd5, $Pfrom_rule, $Pcorrect_after_primary )
@@ -8680,7 +8701,6 @@ sub rdb_one_file {
if ( ! rdb_rule_exists( $$Pfrom_rule ) ) {
$$Pfrom_rule = '';
}
-#?? &F2;
} #END rdb_one_file
#************************************************************
@@ -9354,7 +9374,6 @@ sub find_file1 {
else { return( $name, 1 );}
}
foreach my $dir ( @path ) {
- #??print "-------------dir='$dir', ";
# Make $dir concatenatable, and empty for current dir:
if ( $dir eq '.' ) {
$dir = '';
@@ -9366,7 +9385,6 @@ sub find_file1 {
#Append directory separator only to non-empty dir
$dir = "$dir/";
}
- #?? print " newdir='$dir'\n";
if (-e "$dir$name") {
return("$dir$name", 0);
}
@@ -9417,8 +9435,6 @@ sub find_file_list1 {
}
}
@$ref_output = @return_list;
-#?? show_array( " Output", @$ref_output );
-#?? foreach (@$ref_output) { if ( /\/\// ) { print " ====== double slash in '$_'\n"; } }
return @not_found;
} #END find_file_list1
@@ -10021,10 +10037,12 @@ sub Run_Detached {
sub find_process_id {
# find_process_id(string) finds id of process containing string and
-# being run by the present user. Typically the string will be the
-# name of the process or part of its command line.
+# being run by the present user. In all the uses in latexmk, the string is
+# the name of a file that is expected to be on the command line.
+#
# On success, this subroutine returns the process ID.
# On failure, it returns 0.
+#
# This subroutine only works on UNIX systems at the moment.
if ( $pid_position < 0 ) {
@@ -10079,7 +10097,7 @@ sub cache_good_cwd {
# that the result can be used for input to MSWin programs as well
# as cygwin programs.
# Similarly for msys.
- my $cwd = cwd();
+ my $cwd = getcwd();
if ( $^O eq "cygwin" ) {
my $cmd = "cygpath -w \"$cwd\"";
my $Win_cwd = `$cmd`;
@@ -10099,6 +10117,10 @@ sub cache_good_cwd {
elsif ( $^O eq "msys" ) {
$cwd =~ s[^/([a-z])/][\u$1:/];
}
+ # Normalized
+ if ($normalize_names) {
+ $cwd = abs_path($cwd);
+ }
$cache{cwd} = $cwd;
} # END cache_good_cwd