Added a strfunction to the various tex builders. Since the sub-actions report
authormanagan <managan@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Thu, 4 Sep 2008 18:05:49 +0000 (18:05 +0000)
committermanagan <managan@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Thu, 4 Sep 2008 18:05:49 +0000 (18:05 +0000)
their commands as they build the strfunction only returns a string for
GetOption("no_exec") which covers --dry-run.
Therefore --dry-run now gets output, the first command to be run plus " ..."
to indicate that the ral builder may repeat or run bibtex, makeindex,...

Also updating the flags to pass -interaction=nonstopmode
This prevents errors in the .tex files from stopping the build
while Latex asks for input.

Updated several tests to handle this new flag by switching to getopt module

git-svn-id: http://scons.tigris.org/svn/scons/trunk@3338 fdb21ef1-2011-0410-befe-b5e4ea1792b1

13 files changed:
src/engine/SCons/Tool/latex.py
src/engine/SCons/Tool/pdflatex.py
src/engine/SCons/Tool/pdftex.py
src/engine/SCons/Tool/tex.py
test/DVIPDF/DVIPDF.py
test/DVIPDF/DVIPDFFLAGS.py
test/DVIPS/DVIPS.py
test/DVIPS/DVIPSFLAGS.py
test/TEX/LATEX.py
test/TEX/PDFLATEX.py
test/TEX/PDFTEX.py
test/TEX/TEX.py
test/TEX/dryrun.py [new file with mode: 0644]

index c4934c321b30fb7353b9eb77e9e9cbba78fcfa23..8258829b780aa784ef18d7360164ae3fe7c1918e 100644 (file)
@@ -45,7 +45,8 @@ LaTeXAction = None
 def LaTeXAuxFunction(target = None, source= None, env=None):
     SCons.Tool.tex.InternalLaTeXAuxAction( LaTeXAction, target, source, env )
 
-LaTeXAuxAction = SCons.Action.Action(LaTeXAuxFunction, strfunction=None)
+LaTeXAuxAction = SCons.Action.Action(LaTeXAuxFunction,
+                              strfunction=SCons.Tool.tex.TeXLaTeXStrFunction)
 
 def generate(env):
     """Add Builders and construction variables for LaTeX to an Environment."""
@@ -63,7 +64,7 @@ def generate(env):
     bld.add_emitter('.latex', SCons.Tool.tex.tex_emitter)
 
     env['LATEX']        = 'latex'
-    env['LATEXFLAGS']   = SCons.Util.CLVar('')
+    env['LATEXFLAGS']   = SCons.Util.CLVar('-interaction=nonstopmode')
     env['LATEXCOM']     = 'cd ${TARGET.dir} && $LATEX $LATEXFLAGS ${SOURCE.file}'
     env['LATEXRETRIES'] = 3
 
index 97420a8ae035aff25b0ed545a44667d80027eb5c..b8a77365baa08810e3034de3ebb8216e9aaf8ff7 100644 (file)
@@ -54,7 +54,7 @@ def generate(env):
     global PDFLaTeXAuxAction
     if PDFLaTeXAuxAction is None:
         PDFLaTeXAuxAction = SCons.Action.Action(PDFLaTeXAuxFunction,
-                                                strfunction=None)
+                              strfunction=SCons.Tool.tex.TeXLaTeXStrFunction)
 
     import pdf
     pdf.generate(env)
@@ -66,7 +66,7 @@ def generate(env):
     bld.add_emitter('.latex', SCons.Tool.tex.tex_emitter)
 
     env['PDFLATEX']      = 'pdflatex'
-    env['PDFLATEXFLAGS'] = SCons.Util.CLVar('')
+    env['PDFLATEXFLAGS'] = SCons.Util.CLVar('-interaction=nonstopmode')
     env['PDFLATEXCOM']   = 'cd ${TARGET.dir} && $PDFLATEX $PDFLATEXFLAGS ${SOURCE.file}'
     env['LATEXRETRIES']  = 3
 
index e740fac22d48e281263f8b27cad80ef46ab71ad1..7bd57b0643e41e24fa2c25bebae3590e9c51ab76 100644 (file)
@@ -71,7 +71,7 @@ def generate(env):
     global PDFTeXLaTeXAction
     if PDFTeXLaTeXAction is None:
         PDFTeXLaTeXAction = SCons.Action.Action(PDFTeXLaTeXFunction,
-                                                strfunction=None)
+                              strfunction=SCons.Tool.tex.TeXLaTeXStrFunction)
 
     import pdf
     pdf.generate(env)
@@ -81,12 +81,12 @@ def generate(env):
     bld.add_emitter('.tex', SCons.Tool.tex.tex_emitter)
 
     env['PDFTEX']      = 'pdftex'
-    env['PDFTEXFLAGS'] = SCons.Util.CLVar('')
+    env['PDFTEXFLAGS'] = SCons.Util.CLVar('-interaction=nonstopmode')
     env['PDFTEXCOM']   = 'cd ${TARGET.dir} && $PDFTEX $PDFTEXFLAGS ${SOURCE.file}'
 
     # Duplicate from latex.py.  If latex.py goes away, then this is still OK.
     env['PDFLATEX']      = 'pdflatex'
-    env['PDFLATEXFLAGS'] = SCons.Util.CLVar('')
+    env['PDFLATEXFLAGS'] = SCons.Util.CLVar('-interaction=nonstopmode')
     env['PDFLATEXCOM']   = 'cd ${TARGET.dir} && $PDFLATEX $PDFLATEXFLAGS ${SOURCE.file}'
     env['LATEXRETRIES']  = 3
 
index c3156a3aa09878eef87ac1b1618d2d9262dc619b..29dc81deae7e0156c422bb034b54f2c5f0f2e31e 100644 (file)
@@ -208,7 +208,19 @@ def TeXLaTeXFunction(target = None, source= None, env=None):
         LaTeXAuxAction(target,source,env)
     else:
         TeXAction(target,source,env)
-    return 0
+
+def TeXLaTeXStrFunction(target = None, source= None, env=None):
+    """A strfunction for TeX and LaTeX that scans the source file to
+    decide the "flavor" of the source and then returns the appropriate
+    command string."""
+    if env.GetOption("no_exec"):
+        if is_LaTeX(source):
+            result = env.subst('$LATEXCOM',0,target,source)+" ..."
+        else:
+            result = env.subst("$TEXCOM",0,target,source)+" ..."
+    else:
+        result = ''
+    return result
 
 def tex_emitter(target, source, env):
     base = SCons.Util.splitext(str(source[0]))[0]
@@ -275,7 +287,8 @@ def generate(env):
 
     global TeXLaTeXAction
     if TeXLaTeXAction is None:
-        TeXLaTeXAction = SCons.Action.Action(TeXLaTeXFunction, strfunction=None)
+        TeXLaTeXAction = SCons.Action.Action(TeXLaTeXFunction,
+                              strfunction=TeXLaTeXStrFunction)
 
     import dvi
     dvi.generate(env)
@@ -285,12 +298,12 @@ def generate(env):
     bld.add_emitter('.tex', tex_emitter)
 
     env['TEX']      = 'tex'
-    env['TEXFLAGS'] = SCons.Util.CLVar('')
+    env['TEXFLAGS'] = SCons.Util.CLVar('-interaction=nonstopmode')
     env['TEXCOM']   = 'cd ${TARGET.dir} && $TEX $TEXFLAGS ${SOURCE.file}'
 
     # Duplicate from latex.py.  If latex.py goes away, then this is still OK.
     env['LATEX']        = 'latex'
-    env['LATEXFLAGS']   = SCons.Util.CLVar('')
+    env['LATEXFLAGS']   = SCons.Util.CLVar('-interaction=nonstopmode')
     env['LATEXCOM']     = 'cd ${TARGET.dir} && $LATEX $LATEXFLAGS ${SOURCE.file}'
     env['LATEXRETRIES'] = 3
 
index 8d36e5a7d05871577a925f08ca0bfaa74007499a..6f62f34a251796bbd5c7a29a23f5bf839152faa8 100644 (file)
@@ -39,8 +39,10 @@ test = TestSCons.TestSCons()
 test.write('mytex.py', r"""
 import os
 import sys
-base_name = os.path.splitext(sys.argv[1])[0]
-infile = open(sys.argv[1], 'rb')
+import getopt
+cmd_opts, arg = getopt.getopt(sys.argv[1:], 'i:', [])
+base_name = os.path.splitext(arg[0])[0]
+infile = open(arg[0], 'rb')
 out_file = open(base_name+'.dvi', 'wb')
 for l in infile.readlines():
     if l[:4] != '#tex':
@@ -51,8 +53,10 @@ sys.exit(0)
 test.write('mylatex.py', r"""
 import os
 import sys
-base_name = os.path.splitext(sys.argv[1])[0]
-infile = open(sys.argv[1], 'rb')
+import getopt
+cmd_opts, arg = getopt.getopt(sys.argv[1:], 'i:', [])
+base_name = os.path.splitext(arg[0])[0]
+infile = open(arg[0], 'rb')
 out_file = open(base_name+'.dvi', 'wb')
 for l in infile.readlines():
     if l[:6] != '#latex':
@@ -63,8 +67,10 @@ sys.exit(0)
 test.write('mydvipdf.py', r"""
 import os
 import sys
-infile = open(sys.argv[1], 'rb')
-out_file = open(sys.argv[2], 'wb')
+import getopt
+cmd_opts, arg = getopt.getopt(sys.argv[1:], 'i:', [])
+infile = open(arg[0], 'rb')
+out_file = open(arg[1], 'wb')
 for l in infile.readlines():
     if l[:7] != '#dvipdf':
         out_file.write(l)
index 4268705db4507dd4660e493132d4b9ef4b541c77..cc901052b5e994a7551730cb8e18e553d35daaff 100644 (file)
@@ -39,8 +39,10 @@ test = TestSCons.TestSCons()
 test.write('mytex.py', r"""
 import os
 import sys
-base_name = os.path.splitext(sys.argv[1])[0]
-infile = open(sys.argv[1], 'rb')
+import getopt
+cmd_opts, arg = getopt.getopt(sys.argv[1:], 'i:', [])
+base_name = os.path.splitext(arg[0])[0]
+infile = open(arg[0], 'rb')
 out_file = open(base_name+'.dvi', 'wb')
 for l in infile.readlines():
     if l[:4] != '#tex':
@@ -51,8 +53,10 @@ sys.exit(0)
 test.write('mylatex.py', r"""
 import os
 import sys
-base_name = os.path.splitext(sys.argv[1])[0]
-infile = open(sys.argv[1], 'rb')
+import getopt
+cmd_opts, arg = getopt.getopt(sys.argv[1:], 'i:', [])
+base_name = os.path.splitext(arg[0])[0]
+infile = open(arg[0], 'rb')
 out_file = open(base_name+'.dvi', 'wb')
 for l in infile.readlines():
     if l[:6] != '#latex':
index 490ac9534eef0cdcd1d24b7a02138bddb7fef951..882cb6a23d63d5be9a2eeea7b95555aa21147deb 100644 (file)
@@ -39,8 +39,10 @@ test = TestSCons.TestSCons()
 test.write('mytex.py', r"""
 import os
 import sys
-base_name = os.path.splitext(sys.argv[1])[0]
-infile = open(sys.argv[1], 'rb')
+import getopt
+cmd_opts, arg = getopt.getopt(sys.argv[1:], 'i:', [])
+base_name = os.path.splitext(arg[0])[0]
+infile = open(arg[0], 'rb')
 out_file = open(base_name+'.dvi', 'wb')
 for l in infile.readlines():
     if l[:4] != '#tex':
@@ -51,8 +53,10 @@ sys.exit(0)
 test.write('mylatex.py', r"""
 import os
 import sys
-base_name = os.path.splitext(sys.argv[1])[0]
-infile = open(sys.argv[1], 'rb')
+import getopt
+cmd_opts, arg = getopt.getopt(sys.argv[1:], 'i:', [])
+base_name = os.path.splitext(arg[0])[0]
+infile = open(arg[0], 'rb')
 out_file = open(base_name+'.dvi', 'wb')
 for l in infile.readlines():
     if l[:6] != '#latex':
index 635acb0be1d2b0f929160538bab369dee33a92ec..4b70e412969a7744f6da86d5418cc3ed242d17f2 100644 (file)
@@ -39,8 +39,10 @@ test = TestSCons.TestSCons()
 test.write('mytex.py', r"""
 import os
 import sys
-base_name = os.path.splitext(sys.argv[1])[0]
-infile = open(sys.argv[1], 'rb')
+import getopt
+cmd_opts, arg = getopt.getopt(sys.argv[1:], 'i:', [])
+base_name = os.path.splitext(arg[0])[0]
+infile = open(arg[0], 'rb')
 out_file = open(base_name+'.dvi', 'wb')
 for l in infile.readlines():
     if l[:4] != '#tex':
@@ -51,8 +53,10 @@ sys.exit(0)
 test.write('mylatex.py', r"""
 import os
 import sys
-base_name = os.path.splitext(sys.argv[1])[0]
-infile = open(sys.argv[1], 'rb')
+import getopt
+cmd_opts, arg = getopt.getopt(sys.argv[1:], 'i:', [])
+base_name = os.path.splitext(arg[0])[0]
+infile = open(arg[0], 'rb')
 out_file = open(base_name+'.dvi', 'wb')
 for l in infile.readlines():
     if l[:6] != '#latex':
index 0636109a124d3ab549f9cce56e1a014b08a68564..bb034be75f08a13f6082191c4e139953bf3ff947 100644 (file)
@@ -45,8 +45,10 @@ test = TestSCons.TestSCons()
 test.write('mylatex.py', r"""
 import sys
 import os
-base_name = os.path.splitext(sys.argv[1])[0]
-infile = open(sys.argv[1], 'rb')
+import getopt
+cmd_opts, arg = getopt.getopt(sys.argv[1:], 'i:', [])
+base_name = os.path.splitext(arg[0])[0]
+infile = open(arg[0], 'rb')
 dvi_file = open(base_name+'.dvi', 'wb')
 aux_file = open(base_name+'.aux', 'wb')
 log_file = open(base_name+'.log', 'wb')
@@ -112,9 +114,10 @@ ENV = { 'PATH' : os.environ['PATH'],
 foo = Environment(ENV = ENV)
 latex = foo.Dictionary('LATEX')
 makeindex = foo.Dictionary('MAKEINDEX')
+python_path = r'%(_python_)s'
 bar = Environment(ENV = ENV,
-                  LATEX = r'%(_python_)s wrapper.py ' + latex,
-                  MAKEINDEX =  r' wrapper.py ' + makeindex)
+                  LATEX = python_path + ' wrapper.py ' + latex,
+                  MAKEINDEX =  python_path + ' wrapper.py ' + makeindex)
 foo.DVI(target = 'foo.dvi', source = 'foo.ltx')
 bar.DVI(target = 'bar', source = 'bar.latex')
 
@@ -130,7 +133,7 @@ This is the %s LaTeX file.
 """
 
     makeindex =  r"""
-\documentclass{letter}
+\documentclass{report}
 \usepackage{makeidx}
 \makeindex
 \begin{document}
@@ -141,7 +144,7 @@ This is the %s LaTeX file.
 """
 
     latex1 = r"""
-\documentclass{letter}
+\documentclass{report}
 \usepackage{makeidx}
 \makeindex
 \begin{document}
index e1cf00e18bcf4d391a048db9277be477dbb61f5b..11ada7b583db354c4958a573eb4685a7d17d8737 100644 (file)
@@ -45,8 +45,10 @@ test = TestSCons.TestSCons()
 test.write('mypdflatex.py', r"""
 import sys
 import os
-base_name = os.path.splitext(sys.argv[1])[0]
-infile = open(sys.argv[1], 'rb')
+import getopt
+cmd_opts, arg = getopt.getopt(sys.argv[1:], 'i:', [])
+base_name = os.path.splitext(arg[0])[0]
+infile = open(arg[0], 'rb')
 pdf_file = open(base_name+'.pdf', 'wb')
 aux_file = open(base_name+'.aux', 'wb')
 log_file = open(base_name+'.log', 'wb')
index ad77b8afa4e2ca1971681b6e19eb2acef7ec7e1b..cde601506fe42d5d7ed66371ec7da353a58da0bc 100644 (file)
@@ -45,8 +45,10 @@ test = TestSCons.TestSCons()
 test.write('mypdftex.py', r"""
 import sys
 import os
-base_name = os.path.splitext(sys.argv[1])[0]
-infile = open(sys.argv[1], 'rb')
+import getopt
+cmd_opts, arg = getopt.getopt(sys.argv[2:], 'i:', [])
+base_name = os.path.splitext(arg[0])[0]
+infile = open(arg[0], 'rb')
 pdf_file = open(base_name+'.pdf', 'wb')
 aux_file = open(base_name+'.aux', 'wb')
 log_file = open(base_name+'.log', 'wb')
index eaea49a0cdf316c9cc57b0e6d8acea580bbc8eb5..5a0daec3ce0a48c362a9abb1a3a7945b15cca111 100644 (file)
@@ -45,8 +45,10 @@ test = TestSCons.TestSCons()
 test.write('mytex.py', r"""
 import sys
 import os
-base_name = os.path.splitext(sys.argv[1])[0]
-infile = open(sys.argv[1], 'rb')
+import getopt
+cmd_opts, arg = getopt.getopt(sys.argv[1:], 'i:', [])
+base_name = os.path.splitext(arg[0])[0]
+infile = open(arg[0], 'rb')
 dvi_file = open(base_name+'.dvi', 'wb')
 aux_file = open(base_name+'.aux', 'wb')
 log_file = open(base_name+'.log', 'wb')
@@ -175,7 +177,7 @@ Run \texttt{latex}, then \texttt{bibtex}, then \texttt{latex} twice again \cite{
     test.run(stderr = None)
     output_lines = string.split(test.stdout(), '\n')
 
-    reruns = filter(lambda x: string.find(x, 'latex rerun.tex') != -1, output_lines)
+    reruns = filter(lambda x: string.find(x, 'latex -interaction=nonstopmode rerun.tex') != -1, output_lines)
     if len(reruns) != 2:
         print "Expected 2 latex calls, got %s:" % len(reruns)
         print string.join(reruns, '\n')
diff --git a/test/TEX/dryrun.py b/test/TEX/dryrun.py
new file mode 100644 (file)
index 0000000..80458af
--- /dev/null
@@ -0,0 +1,67 @@
+#!/usr/bin/env python
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+"""
+Validate that we can set the LATEX string to our own utility, that
+the produced .dvi, .aux and .log files get removed by the -c option,
+and that we can use this to wrap calls to the real latex utility.
+"""
+
+import os
+import os.path
+import string
+import sys
+import TestSCons
+
+_python_ = TestSCons._python_
+
+test = TestSCons.TestSCons()
+
+latex = test.where_is('latex')
+
+if not latex:
+    test.skip_test('could not find latex; skipping test\n')
+
+test.write('SConstruct', """
+import os
+ENV = { 'PATH' : os.environ['PATH'] }
+foo = Environment(ENV = ENV)
+foo.DVI(target = 'foo.dvi', source = 'foo.ltx')
+""" % locals())
+
+test.write('foo.ltx', r"""
+\documentclass{letter}
+\begin{document}
+This is the foo.ltx file.
+\end{document}
+""")
+
+test.run(arguments = '--dry-run', stdout = test.wrap_stdout("""\
+cd . && latex -interaction=nonstopmode foo.ltx ...
+"""), stderr = None)
+
+
+test.pass_test()