summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/CHANGES.txt50
-rw-r--r--src/RELEASE.txt2
-rw-r--r--src/engine/SCons/ExecutorTests.py10
-rw-r--r--src/engine/SCons/Scanner/LaTeX.py98
-rw-r--r--src/engine/SCons/Scanner/LaTeXTests.py15
-rw-r--r--src/engine/SCons/Scanner/__init__.py4
-rw-r--r--src/engine/SCons/Taskmaster.py2
-rw-r--r--src/engine/SCons/Tool/MSCommon/__init__.py3
-rw-r--r--src/engine/SCons/Tool/MSCommon/vc.py11
-rw-r--r--src/engine/SCons/Tool/msvc.py14
-rw-r--r--src/engine/SCons/Tool/msvs.py2
-rw-r--r--src/script/MANIFEST.in1
-rw-r--r--src/setup.py1
13 files changed, 155 insertions, 58 deletions
diff --git a/src/CHANGES.txt b/src/CHANGES.txt
index 4ae9cb2..4a7576e 100644
--- a/src/CHANGES.txt
+++ b/src/CHANGES.txt
@@ -6,6 +6,30 @@
RELEASE VERSION/DATE TO BE FILLED IN LATER
+ From John Doe:
+
+ - Whatever John Doe did.
+
+
+RELEASE VERSION/DATE TO BE FILLED IN LATER
+
+ From William Blevins:
+ - Updated D language scanner support to latest: 2.071.1. (PR #1924)
+ https://dlang.org/spec/module.html accessed 11 August 2016
+ - Enhancements:
+ - Added support for selective imports: "import A : B, C;" -> A
+ - Added support for renamed imports. "import B = A;" -> A
+ - Supports valid combinations: "import A, B, CCC = C, DDD = D : EEE = FFF;" -> A, B, C, D
+ - Notes:
+ - May find new (previously missed) Dlang dependencies.
+ - May cause rebuild after upgrade due to dependency changes.
+ - Updated Fortran-related tests to pass under GCC 5/6.
+ - Fixed SCons.Tool.Packaging.rpm.package source nondeterminism across builds.
+
+ From Daniel Moody:
+ - Fixed msvs.py for Visual Studio generated projects which were
+ creating invalid xml for greater than and less than symbols.
+
From Daniel Holth:
- Add basic support for PyPy (by deleting __slots__ from Node with a
metaclass on PyPy); wrap most-used open() calls in 'with' statements to
@@ -31,20 +55,22 @@ RELEASE VERSION/DATE TO BE FILLED IN LATER
- Added LoadableModule to the list of global functions (DefaultEnvironment
builders).
+ From Rick Lupton:
+ - Update LaTeX scanner to understand \import and related commands
+
+ From Richard Viney:
+ - Fixed PCHPDBFLAGS causing a deprecation warning on MSVC v8 and later when
+ using PCHs and PDBs together.
- From William Blevins:
- - Updated D language scanner support to latest: 2.071.1. (PR #1924)
- https://dlang.org/spec/module.html accessed 11 August 2016
- - Enhancements:
- - Added support for selective imports: "import A : B, C;" -> A
- - Added support for renamed imports. "import B = A;" -> A
- - Supports valid combinations: "import A, B, CCC = C, DDD = D : EEE = FFF;" -> A, B, C, D
- - Notes:
- - May find new (previously missed) Dlang dependencies.
- - May cause rebuild after upgrade due to dependency changes.
- - Updated Fortran-related tests to pass under GCC 5/6.
- - Fixed SCons.Tool.Packaging.rpm.package source nondeterminism across builds.
+RELEASE 2.5.1 - Mon, 03 Nov 2016 13:37:42 -0400
+
+ From William Deegan:
+ - Add scons-configure-cache.py to packaging. It was omitted
+
+ From Alexey Klimkin:
+ - Use memoization to optimize PATH evaluation across all dependencies per
+ node. (PR #345)
RELEASE 2.5.0 - Mon, 09 Apr 2016 11:27:42 -0700
diff --git a/src/RELEASE.txt b/src/RELEASE.txt
index ac2b95a..d71619d 100644
--- a/src/RELEASE.txt
+++ b/src/RELEASE.txt
@@ -1,4 +1,4 @@
- A new SCons checkpoint release, 2.6.0.alpha.yyyymmdd, is now available
+ A new SCons checkpoint release, 2.7.0.alpha.yyyymmdd, is now available
on the SCons download page:
http://www.scons.org/download.php
diff --git a/src/engine/SCons/ExecutorTests.py b/src/engine/SCons/ExecutorTests.py
index 99c6226..dbfb7d1 100644
--- a/src/engine/SCons/ExecutorTests.py
+++ b/src/engine/SCons/ExecutorTests.py
@@ -53,7 +53,11 @@ class MyAction(object):
def genstring(self, target, source, env):
return ' '.join(['GENSTRING'] + list(map(str, self.actions)) + target + source)
def get_contents(self, target, source, env):
- return ' '.join(self.actions + target + source)
+ return b' '.join(
+ [SCons.Util.to_bytes(aa) for aa in self.actions] +
+ [SCons.Util.to_bytes(tt) for tt in target] +
+ [SCons.Util.to_bytes(ss) for ss in source]
+ )
def get_implicit_deps(self, target, source, env):
return []
@@ -381,14 +385,14 @@ class ExecutorTestCase(unittest.TestCase):
x = SCons.Executor.Executor(MyAction(), env, [], ['t'], ['s'])
c = x.get_contents()
- assert c == 'action1 action2 t s', c
+ assert c == b'action1 action2 t s', c
x = SCons.Executor.Executor(MyAction(actions=['grow']), env, [],
['t'], ['s'])
x.add_pre_action(MyAction(['pre']))
x.add_post_action(MyAction(['post']))
c = x.get_contents()
- assert c == 'pre t sgrow t spost t s', c
+ assert c == b'pre t sgrow t spost t s', c
def test_get_timestamp(self):
"""Test fetching the "timestamp" """
diff --git a/src/engine/SCons/Scanner/LaTeX.py b/src/engine/SCons/Scanner/LaTeX.py
index 1e0fea1..cb89cf0 100644
--- a/src/engine/SCons/Scanner/LaTeX.py
+++ b/src/engine/SCons/Scanner/LaTeX.py
@@ -166,6 +166,9 @@ class LaTeX(SCons.Scanner.Base):
'usepackage': 'TEXINPUTS',
'lstinputlisting': 'TEXINPUTS'}
env_variables = SCons.Util.unique(list(keyword_paths.values()))
+ two_arg_commands = ['import', 'subimport',
+ 'includefrom', 'subincludefrom',
+ 'inputfrom', 'subinputfrom']
def __init__(self, name, suffixes, graphics_extensions, *args, **kw):
@@ -175,8 +178,29 @@ class LaTeX(SCons.Scanner.Base):
# line followed by one or more newline characters (i.e. blank
# lines), interfering with a match on the next line.
# add option for whitespace before the '[options]' or the '{filename}'
- regex = r'^[^%\n]*\\(include|includegraphics(?:\s*\[[^\]]+\])?|lstinputlisting(?:\[[^\]]+\])?|input|bibliography|addbibresource|addglobalbib|addsectionbib|usepackage)\s*{([^}]*)}'
- self.cre = re.compile(regex, re.M)
+ regex = r'''
+ ^[^%\n]*
+ \\(
+ include
+ | includegraphics(?:\s*\[[^\]]+\])?
+ | lstinputlisting(?:\[[^\]]+\])?
+ | input
+ | import
+ | subimport
+ | includefrom
+ | subincludefrom
+ | inputfrom
+ | subinputfrom
+ | bibliography
+ | addbibresource
+ | addglobalbib
+ | addsectionbib
+ | usepackage
+ )
+ \s*{([^}]*)} # first arg
+ (?: \s*{([^}]*)} )? # maybe another arg
+ '''
+ self.cre = re.compile(regex, re.M | re.X)
self.comment_re = re.compile(r'^((?:(?:\\%)|[^%\n])*)(.*)$', re.M)
self.graphics_extensions = graphics_extensions
@@ -236,23 +260,26 @@ class LaTeX(SCons.Scanner.Base):
SCons.Scanner.Base.__init__(self, *args, **kw)
- def _latex_names(self, include):
- filename = include[1]
- if include[0] == 'input':
+ def _latex_names(self, include_type, filename):
+ if include_type == 'input':
base, ext = os.path.splitext( filename )
if ext == "":
return [filename + '.tex']
- if (include[0] == 'include'):
- return [filename + '.tex']
- if include[0] == 'bibliography':
+ if include_type in ('include', 'import', 'subimport',
+ 'includefrom', 'subincludefrom',
+ 'inputfrom', 'subinputfrom'):
+ base, ext = os.path.splitext( filename )
+ if ext == "":
+ return [filename + '.tex']
+ if include_type == 'bibliography':
base, ext = os.path.splitext( filename )
if ext == "":
return [filename + '.bib']
- if include[0] == 'usepackage':
+ if include_type == 'usepackage':
base, ext = os.path.splitext( filename )
if ext == "":
return [filename + '.sty']
- if include[0] == 'includegraphics':
+ if include_type == 'includegraphics':
base, ext = os.path.splitext( filename )
if ext == "":
#return [filename+e for e in self.graphics_extensions + TexGraphics]
@@ -267,21 +294,26 @@ class LaTeX(SCons.Scanner.Base):
return SCons.Node.FS._my_normcase(str(include))
def find_include(self, include, source_dir, path):
+ inc_type, inc_subdir, inc_filename = include
try:
- sub_path = path[include[0]]
+ sub_paths = path[inc_type]
except (IndexError, KeyError):
- sub_path = ()
- try_names = self._latex_names(include)
+ sub_paths = ((), ())
+ try_names = self._latex_names(inc_type, inc_filename)
+
+ # There are three search paths to try:
+ # 1. current directory "source_dir"
+ # 2. env[var]
+ # 3. env['ENV'][var]
+ search_paths = [(source_dir,)] + list(sub_paths)
+
for n in try_names:
- # see if we find it using the path in env[var]
- i = SCons.Node.FS.find_file(n, (source_dir,) + sub_path[0])
- if i:
- return i, include
- # see if we find it using the path in env['ENV'][var]
- i = SCons.Node.FS.find_file(n, (source_dir,) + sub_path[1])
- if i:
- return i, include
- return i, include
+ for search_path in search_paths:
+ paths = tuple([d.Dir(inc_subdir) for d in search_path])
+ i = SCons.Node.FS.find_file(n, paths)
+ if i:
+ return i, include
+ return None, include
def canonical_text(self, text):
"""Standardize an input TeX-file contents.
@@ -300,7 +332,7 @@ class LaTeX(SCons.Scanner.Base):
line_continues_a_comment = len(comment) > 0
return '\n'.join(out).rstrip()+'\n'
- def scan(self, node):
+ def scan(self, node, subdir='.'):
# Modify the default scan function to allow for the regular
# expression to return a comma separated list of file names
# as can be the case with the bibliography keyword.
@@ -326,9 +358,14 @@ class LaTeX(SCons.Scanner.Base):
split_includes = []
for include in includes:
inc_type = noopt_cre.sub('', include[0])
- inc_list = include[1].split(',')
+ inc_subdir = subdir
+ if inc_type in self.two_arg_commands:
+ inc_subdir = os.path.join(subdir, include[1])
+ inc_list = include[2].split(',')
+ else:
+ inc_list = include[1].split(',')
for j in range(len(inc_list)):
- split_includes.append( (inc_type, inc_list[j]) )
+ split_includes.append( (inc_type, inc_subdir, inc_list[j]) )
#
includes = split_includes
node.includes = includes
@@ -359,11 +396,12 @@ class LaTeX(SCons.Scanner.Base):
while queue:
include = queue.pop()
+ inc_type, inc_subdir, inc_filename = include
try:
- if seen[include[1]] == 1:
+ if seen[inc_filename] == 1:
continue
except KeyError:
- seen[include[1]] = 1
+ seen[inc_filename] = 1
#
# Handle multiple filenames in include[1]
@@ -372,14 +410,14 @@ class LaTeX(SCons.Scanner.Base):
if n is None:
# Do not bother with 'usepackage' warnings, as they most
# likely refer to system-level files
- if include[0] != 'usepackage':
+ if inc_type != 'usepackage':
SCons.Warnings.warn(SCons.Warnings.DependencyWarning,
"No dependency generated for file: %s (included from: %s) -- file not found" % (i, node))
else:
sortkey = self.sort_key(n)
nodes.append((sortkey, n))
- # recurse down
- queue.extend( self.scan(n) )
+ # recurse down
+ queue.extend( self.scan(n, inc_subdir) )
return [pair[1] for pair in sorted(nodes)]
diff --git a/src/engine/SCons/Scanner/LaTeXTests.py b/src/engine/SCons/Scanner/LaTeXTests.py
index 49553cf..213e89e 100644
--- a/src/engine/SCons/Scanner/LaTeXTests.py
+++ b/src/engine/SCons/Scanner/LaTeXTests.py
@@ -44,6 +44,12 @@ test.write('test1.latex',"""
include{incNO}
%\include{incNO}
xyzzy \include{inc6}
+\subimport{subdir}{inc3}
+\import{subdir}{inc3a}
+\includefrom{subdir}{inc3b}
+\subincludefrom{subdir}{inc3c}
+\inputfrom{subdir}{inc3d}
+\subinputfrom{subdir}{inc3e}
""")
test.write('test2.latex',"""
@@ -61,6 +67,10 @@ test.subdir('subdir')
test.write('inc1.tex',"\n")
test.write('inc2.tex',"\n")
test.write(['subdir', 'inc3.tex'], "\n")
+for suffix in 'abcde':
+ test.write(['subdir', 'inc3%s.tex' % suffix], "\n")
+test.write(['subdir', 'inc3b.tex'], "\n")
+test.write(['subdir', 'inc3c.tex'], "\n")
test.write(['subdir', 'inc4.eps'], "\n")
test.write('inc5.xyz', "\n")
test.write('inc6.tex', "\n")
@@ -122,7 +132,10 @@ class LaTeXScannerTestCase1(unittest.TestCase):
s = SCons.Scanner.LaTeX.LaTeXScanner()
path = s.path(env)
deps = s(env.File('test1.latex'), env, path)
- headers = ['inc1.tex', 'inc2.tex', 'inc6.tex']
+ headers = ['inc1.tex', 'inc2.tex', 'inc6.tex',
+ 'subdir/inc3.tex', 'subdir/inc3a.tex',
+ 'subdir/inc3b.tex', 'subdir/inc3c.tex',
+ 'subdir/inc3d.tex', 'subdir/inc3e.tex']
deps_match(self, deps, headers)
class LaTeXScannerTestCase2(unittest.TestCase):
diff --git a/src/engine/SCons/Scanner/__init__.py b/src/engine/SCons/Scanner/__init__.py
index 5700fe9..28be642 100644
--- a/src/engine/SCons/Scanner/__init__.py
+++ b/src/engine/SCons/Scanner/__init__.py
@@ -324,7 +324,7 @@ class Classic(Current):
def __init__(self, name, suffixes, path_variable, regex, *args, **kw):
- self.cre = re.compile(SCons.Util.to_bytes(regex), re.M)
+ self.cre = re.compile(regex, re.M)
def _scan(node, env, path=(), self=self):
node = node.rfile()
@@ -405,7 +405,7 @@ class ClassicCPP(Classic):
return n, i
def sort_key(self, include):
- return SCons.Node.FS._my_normcase(b' '.join(include))
+ return SCons.Node.FS._my_normcase(' '.join(include))
# Local Variables:
# tab-width:4
diff --git a/src/engine/SCons/Taskmaster.py b/src/engine/SCons/Taskmaster.py
index 461a556..a620ba1 100644
--- a/src/engine/SCons/Taskmaster.py
+++ b/src/engine/SCons/Taskmaster.py
@@ -545,7 +545,7 @@ class Task(object):
if sys.version_info[0] == 2:
exec("raise exc_type, exc_value, exc_traceback")
else: # sys.version_info[0] == 3:
- exec("raise exc_type(exc_value).with_traceback(exc_traceback)")
+ exec("raise exc_type(*exc_value.args).with_traceback(exc_traceback)")
# raise e.__class__, e.__class__(e), sys.exc_info()[2]
diff --git a/src/engine/SCons/Tool/MSCommon/__init__.py b/src/engine/SCons/Tool/MSCommon/__init__.py
index fe4a7c6..c87bf71 100644
--- a/src/engine/SCons/Tool/MSCommon/__init__.py
+++ b/src/engine/SCons/Tool/MSCommon/__init__.py
@@ -41,7 +41,8 @@ from SCons.Tool.MSCommon.sdk import mssdk_exists, \
from SCons.Tool.MSCommon.vc import msvc_exists, \
msvc_setup_env, \
- msvc_setup_env_once
+ msvc_setup_env_once, \
+ msvc_version_to_maj_min
from SCons.Tool.MSCommon.vs import get_default_version, \
get_vs_by_version, \
diff --git a/src/engine/SCons/Tool/MSCommon/vc.py b/src/engine/SCons/Tool/MSCommon/vc.py
index baa4025..588fe98 100644
--- a/src/engine/SCons/Tool/MSCommon/vc.py
+++ b/src/engine/SCons/Tool/MSCommon/vc.py
@@ -185,16 +185,17 @@ _VCVER_TO_PRODUCT_DIR = {
}
def msvc_version_to_maj_min(msvc_version):
- msvc_version_numeric = ''.join([x for x in msvc_version if x in string_digits + '.'])
+
+ msvc_version_numeric = ''.join([x for x in msvc_version if x in string_digits + '.'])
- t = msvc_version_numeric.split(".")
- if not len(t) == 2:
+ t = msvc_version_numeric.split(".")
+ if not len(t) == 2:
raise ValueError("Unrecognized version %s (%s)" % (msvc_version,msvc_version_numeric))
- try:
+ try:
maj = int(t[0])
min = int(t[1])
return maj, min
- except ValueError as e:
+ except ValueError as e:
raise ValueError("Unrecognized version %s (%s)" % (msvc_version,msvc_version_numeric))
def is_host_target_supported(host_target, msvc_version):
diff --git a/src/engine/SCons/Tool/msvc.py b/src/engine/SCons/Tool/msvc.py
index f894562..20b5d28 100644
--- a/src/engine/SCons/Tool/msvc.py
+++ b/src/engine/SCons/Tool/msvc.py
@@ -47,7 +47,7 @@ import SCons.Util
import SCons.Warnings
import SCons.Scanner.RC
-from .MSCommon import msvc_exists, msvc_setup_env_once
+from .MSCommon import msvc_exists, msvc_setup_env_once, msvc_version_to_maj_min
CSuffixes = ['.c', '.C']
CXXSuffixes = ['.cc', '.cpp', '.cxx', '.c++', '.C++']
@@ -259,7 +259,17 @@ def generate(env):
env['CFILESUFFIX'] = '.c'
env['CXXFILESUFFIX'] = '.cc'
- env['PCHPDBFLAGS'] = SCons.Util.CLVar(['${(PDB and "/Yd") or ""}'])
+ if env.get('MSVC_VERSION',False):
+ maj, min = msvc_version_to_maj_min(env['MSVC_VERSION'])
+ if maj < 8:
+ env['PCHPDBFLAGS'] = SCons.Util.CLVar(['${(PDB and "/Yd") or ""}'])
+ else:
+ env['PCHPDBFLAGS'] = ''
+ else:
+ # Default if we can't determine which version of MSVC we're using
+ env['PCHPDBFLAGS'] = SCons.Util.CLVar(['${(PDB and "/Yd") or ""}'])
+
+
env['PCHCOM'] = '$CXX /Fo${TARGETS[1]} $CXXFLAGS $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c $SOURCES /Yc$PCHSTOP /Fp${TARGETS[0]} $CCPDBFLAGS $PCHPDBFLAGS'
env['BUILDERS']['PCH'] = pch_builder
diff --git a/src/engine/SCons/Tool/msvs.py b/src/engine/SCons/Tool/msvs.py
index 50f6b27..939668e 100644
--- a/src/engine/SCons/Tool/msvs.py
+++ b/src/engine/SCons/Tool/msvs.py
@@ -65,6 +65,8 @@ def xmlify(s):
s = s.replace("&", "&amp;") # do this first
s = s.replace("'", "&apos;")
s = s.replace('"', "&quot;")
+ s = s.replace('<', "&lt;")
+ s = s.replace('>', "&gt;")
s = s.replace('\n', '&#x0A;')
return s
diff --git a/src/script/MANIFEST.in b/src/script/MANIFEST.in
index f324ed4..d10cc82 100644
--- a/src/script/MANIFEST.in
+++ b/src/script/MANIFEST.in
@@ -1,3 +1,4 @@
scons
sconsign
scons-time
+scons-configure-cache
diff --git a/src/setup.py b/src/setup.py
index 9a02b25..41fc35a 100644
--- a/src/setup.py
+++ b/src/setup.py
@@ -388,6 +388,7 @@ scripts = [
'script/scons',
'script/sconsign',
'script/scons-time',
+ 'script/scons-configure-cache',
# We include scons.bat in the list of scripts, even on UNIX systems,
# because we provide an option to allow it be installed explicitly,