From f825dc4a899de60f0f0a0db3880d71c0b6acdd2c Mon Sep 17 00:00:00 2001 From: managan Date: Wed, 10 Sep 2008 16:43:20 +0000 Subject: [PATCH] Add the ability of the Tex builder to change the name of the created 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 | 29 +++++++++++++- test/TEX/rename_result.py | 78 ++++++++++++++++++++++++++++++++++++ 2 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 test/TEX/rename_result.py diff --git a/src/engine/SCons/Tool/tex.py b/src/engine/SCons/Tool/tex.py index 0c1ed3d4..db083ecc 100644 --- a/src/engine/SCons/Tool/tex.py +++ b/src/engine/SCons/Tool/tex.py @@ -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 index 00000000..e14d5029 --- /dev/null +++ b/test/TEX/rename_result.py @@ -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() -- 2.26.2