Add the ability of the Tex builder to change the name of the created
authormanagan <managan@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Wed, 10 Sep 2008 16:43:20 +0000 (16:43 +0000)
committermanagan <managan@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Wed, 10 Sep 2008 16:43:20 +0000 (16:43 +0000)
file to what the user requested in the target. Tex produces a standard name
based on the source so this was not being done.

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

src/engine/SCons/Tool/tex.py
test/TEX/rename_result.py [new file with mode: 0644]

index 0c1ed3d43abad1443ef8cb37640b0deba9044b90..db083ecc94de1839c73a8ec8e515cf0c2a4ac6dc 100644 (file)
@@ -36,6 +36,7 @@ __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
 import os.path
 import re
 import string
+import shutil
 
 import SCons.Action
 import SCons.Node
@@ -74,11 +75,21 @@ def InternalLaTeXAuxAction(XXXLaTeXAction, target = None, source= None, env=None
     """A builder for LaTeX files that checks the output in the aux file
     and decides how many times to use LaTeXAction, and BibTeXAction."""
 
+    # This routine is called with two actions. In this file for DVI builds
+    # with LaTeXAction and from the pdflatex.py with PDFLaTeXAction
+    # set this up now for the case where the user requests a different extension
+    # for the target filename
+    if (XXXLaTeXAction == LaTeXAction):
+       callerSuffix = ".dvi"
+    else:
+       callerSuffix = env['PDFSUFFIX']
+
     basename = SCons.Util.splitext(str(source[0]))[0]
     basedir = os.path.split(str(source[0]))[0]
     basefile = os.path.split(str(basename))[1]
     abspath = os.path.abspath(basedir)
     targetbase = SCons.Util.splitext(str(target[0]))[0]
+    targetext = os.path.splitext(str(target[0]))[1]
     targetdir = os.path.split(str(target[0]))[0]
 
     # Not sure if these environment changes should go here or make the
@@ -100,7 +111,7 @@ def InternalLaTeXAuxAction(XXXLaTeXAction, target = None, source= None, env=None
     texinputs_save = modify_env_var(env, 'TEXINPUTS', abspath)
     bibinputs_save = modify_env_var(env, 'BIBINPUTS', abspath)
     bstinputs_save = modify_env_var(env, 'BSTINPUTS', abspath)
-    texpicts_save = modify_env_var(env, 'TEXPICTS', abspath)
+    texpicts_save  = modify_env_var(env, 'TEXPICTS', abspath)
 
     # Create these file names with the target directory since they will
     # be made there.   That's because the *COM variables have the cd
@@ -121,6 +132,9 @@ def InternalLaTeXAuxAction(XXXLaTeXAction, target = None, source= None, env=None
     if os.path.exists(tocfilename):
         tocContents = open(tocfilename, "rb").read()
 
+    # generate the file name that latex will generate
+    resultfilename = os.path.join(targetdir, basefile + targetext)
+
     # Run LaTeX once to generate a new aux file and log file.
     result = XXXLaTeXAction(target, source, env)
     if result != 0:
@@ -187,6 +201,19 @@ def InternalLaTeXAuxAction(XXXLaTeXAction, target = None, source= None, env=None
         if result != 0:
             return result
 
+    # rename Latex's output to what the target name is
+    if not (str(target[0]) == resultfilename  and  os.path.exists(resultfilename)):
+        if os.path.exists(resultfilename):
+            print "move %s to %s" % (resultfilename, str(target[0]), )
+            shutil.move(resultfilename,str(target[0]))
+        # if the user gave some other extension try  PDFSUFFIX and then .dvi
+        # not sure how to tell if we got here from a PDF or DVI builder.
+        else:
+            resultfilename = os.path.splitext(resultfilename)[0] + callerSuffix
+            if os.path.exists(resultfilename):
+                print "move %s to %s" % (resultfilename, str(target[0]), )
+                shutil.move(resultfilename,str(target[0]))
+
     env['ENV']['TEXINPUTS'] = texinputs_save
     env['ENV']['BIBINPUTS'] = bibinputs_save
     env['ENV']['BSTINPUTS'] = bibinputs_save
diff --git a/test/TEX/rename_result.py b/test/TEX/rename_result.py
new file mode 100644 (file)
index 0000000..e14d502
--- /dev/null
@@ -0,0 +1,78 @@
+#!/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 rename the output from latex to the
+target name provided by the user.
+"""
+
+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'],
+        'TEXINPUTS' : [ 'subdir', os.environ.get('TEXINPUTS', '') ] }
+foo = Environment(ENV = ENV)
+foo.DVI(target = 'foobar.dvi', source = 'foo.ltx')
+foo.PDF(target = 'bar.xyz', source = 'bar.ltx')
+""" % locals())
+
+test.write('foo.ltx', r"""
+\documentclass{letter}
+\begin{document}
+This is the foo.ltx file.
+\end{document}
+""")
+
+test.write('bar.ltx', r"""
+\documentclass{letter}
+\begin{document}
+This is the bar.ltx file.
+\end{document}
+""")
+
+test.run(arguments = '.', stderr = None)
+
+test.must_exist('foobar.dvi')
+test.must_not_exist('foo.dvi')
+
+test.must_exist('bar.xyz')
+test.must_not_exist('bar.pdf')
+
+test.pass_test()