summaryrefslogtreecommitdiffstats
path: root/src/engine
diff options
context:
space:
mode:
authorSteven Knight <knight@baldmt.com>2003-02-21 14:55:50 (GMT)
committerSteven Knight <knight@baldmt.com>2003-02-21 14:55:50 (GMT)
commitdbe12389b6253c305749d8e2d4e1558477a15787 (patch)
tree01b3f95492320b80b57f4c86d23ffe629d290a58 /src/engine
parent6496b8580990a6efadaeeaf65c25ee7d5964c7a1 (diff)
downloadSCons-dbe12389b6253c305749d8e2d4e1558477a15787.zip
SCons-dbe12389b6253c305749d8e2d4e1558477a15787.tar.gz
SCons-dbe12389b6253c305749d8e2d4e1558477a15787.tar.bz2
Support fetching SConscript files from source code management systems.
Diffstat (limited to 'src/engine')
-rw-r--r--src/engine/SCons/Builder.py2
-rw-r--r--src/engine/SCons/BuilderTests.py2
-rw-r--r--src/engine/SCons/Node/FS.py4
-rw-r--r--src/engine/SCons/Node/FSTests.py15
-rw-r--r--src/engine/SCons/Node/NodeTests.py19
-rw-r--r--src/engine/SCons/Node/__init__.py2
-rw-r--r--src/engine/SCons/Script/SConscript.py13
-rw-r--r--src/engine/SCons/Tool/RCS.py2
8 files changed, 53 insertions, 6 deletions
diff --git a/src/engine/SCons/Builder.py b/src/engine/SCons/Builder.py
index aceadbc..5047a44 100644
--- a/src/engine/SCons/Builder.py
+++ b/src/engine/SCons/Builder.py
@@ -144,7 +144,7 @@ def _init_nodes(builder, env, overrides, tlist, slist):
for t in tlist:
if t.side_effect:
raise UserError, "Multiple ways to build the same target were specified for: %s" % str(t)
- if t.has_builder():
+ if t.has_builder(fetch = 0):
if t.env != env:
raise UserError, "Two different environments were specified for the same target: %s"%str(t)
elif t.overrides != overrides:
diff --git a/src/engine/SCons/BuilderTests.py b/src/engine/SCons/BuilderTests.py
index 1c574d3..3ad6b23 100644
--- a/src/engine/SCons/BuilderTests.py
+++ b/src/engine/SCons/BuilderTests.py
@@ -140,7 +140,7 @@ class BuilderTestCase(unittest.TestCase):
return self.name
def builder_set(self, builder):
self.builder = builder
- def has_builder(self):
+ def has_builder(self, fetch=1):
return not self.builder is None
def env_set(self, env, safe=0):
self.env = env
diff --git a/src/engine/SCons/Node/FS.py b/src/engine/SCons/Node/FS.py
index 5a8687e..e2378b1 100644
--- a/src/engine/SCons/Node/FS.py
+++ b/src/engine/SCons/Node/FS.py
@@ -1016,7 +1016,7 @@ class File(Entry):
if self.fs.CachePath and self.fs.cache_force and os.path.exists(self.path):
CachePush(self, None, None)
- def has_builder(self):
+ def has_builder(self, fetch = 1):
"""Return whether this Node has a builder or not.
If this Node doesn't have an explicit builder, this is where we
@@ -1025,7 +1025,7 @@ class File(Entry):
try:
b = self.builder
except AttributeError:
- if not os.path.exists(self.path):
+ if fetch and not os.path.exists(self.path):
b = self.src_builder()
else:
b = None
diff --git a/src/engine/SCons/Node/FSTests.py b/src/engine/SCons/Node/FSTests.py
index f1160c1..1e8bc92 100644
--- a/src/engine/SCons/Node/FSTests.py
+++ b/src/engine/SCons/Node/FSTests.py
@@ -1180,6 +1180,10 @@ class has_builderTestCase(unittest.TestCase):
f1 = fs.File('f1', d)
f2 = fs.File('f2', d)
f3 = fs.File('f3', d)
+ f4 = fs.File('f4', d)
+ f5 = fs.File('f5', d)
+ f6 = fs.File('f6', d)
+ f7 = fs.File('f7', d)
h = f1.has_builder()
assert not h, h
@@ -1196,6 +1200,17 @@ class has_builderTestCase(unittest.TestCase):
assert h, h
assert f3.builder is b1, f3.builder
+ test.write(['sub', 'f4'], "sub/f4\n")
+ test.write(['sub', 'f6'], "sub/f6\n")
+ h = f4.has_builder(fetch = 0)
+ assert not h, h
+ h = f5.has_builder(fetch = 0)
+ assert not h, h
+ h = f6.has_builder(fetch = 1)
+ assert not h, h
+ h = f7.has_builder(fetch = 1)
+ assert h, h
+
class prepareTestCase(unittest.TestCase):
def runTest(self):
"""Test the prepare() method"""
diff --git a/src/engine/SCons/Node/NodeTests.py b/src/engine/SCons/Node/NodeTests.py
index b47106d..a9fa361 100644
--- a/src/engine/SCons/Node/NodeTests.py
+++ b/src/engine/SCons/Node/NodeTests.py
@@ -255,6 +255,25 @@ class NodeTestCase(unittest.TestCase):
node.builder_set(b)
assert node.builder == b
+ def test_has_builder(self):
+ """Test the has_builder() method
+ """
+ n1 = SCons.Node.Node()
+ n2 = SCons.Node.Node()
+ n3 = SCons.Node.Node()
+
+ assert n1.has_builder() == 0
+ assert n2.has_builder(fetch = 0) == 0
+ assert n3.has_builder(fetch = 1) == 0
+
+ n1.builder_set(Builder())
+ n2.builder_set(Builder())
+ n3.builder_set(Builder())
+
+ assert n1.has_builder() == 1
+ assert n2.has_builder(fetch = 0) == 1
+ assert n3.has_builder(fetch = 1) == 1
+
def test_builder_sig_adapter(self):
"""Test the node's adapter for builder signatures
"""
diff --git a/src/engine/SCons/Node/__init__.py b/src/engine/SCons/Node/__init__.py
index 27ff4db..0a64586 100644
--- a/src/engine/SCons/Node/__init__.py
+++ b/src/engine/SCons/Node/__init__.py
@@ -208,7 +208,7 @@ class Node:
def builder_set(self, builder):
self.builder = builder
- def has_builder(self):
+ def has_builder(self, fetch = 1):
"""Return whether this Node has a builder or not.
In Boolean tests, this turns out to be a *lot* more efficient
diff --git a/src/engine/SCons/Script/SConscript.py b/src/engine/SCons/Script/SConscript.py
index f2d07fd..4c54879 100644
--- a/src/engine/SCons/Script/SConscript.py
+++ b/src/engine/SCons/Script/SConscript.py
@@ -186,8 +186,21 @@ def SConscript(*ls, **kw):
f = fn
else:
f = SCons.Node.FS.default_fs.File(str(fn))
+ _file_ = None
if f.rexists():
_file_ = open(f.rstr(), "r")
+ elif f.has_builder():
+ # The SConscript file apparently exists in a source
+ # code management system. Build it, but then remove
+ # the builder so that it doesn't get built *again*
+ # during the actual build phase.
+ f.build()
+ f.builder_set(None)
+ s = str(f)
+ if os.path.exists(s):
+ _file_ = open(s, "r")
+
+ if _file_:
SCons.Node.FS.default_fs.chdir(f.dir)
if sconscript_chdir:
old_dir = os.getcwd()
diff --git a/src/engine/SCons/Tool/RCS.py b/src/engine/SCons/Tool/RCS.py
index 1f5489b..f6276c5 100644
--- a/src/engine/SCons/Tool/RCS.py
+++ b/src/engine/SCons/Tool/RCS.py
@@ -48,7 +48,7 @@ def generate(env, platform):
env['CO'] = 'co'
env['RCS'] = 'rcs'
env['RCSFLAGS'] = ''
- env['RCSCOM'] = '$CO $RCSFLAGS -p $TARGET,v > $TARGET'
+ env['RCSCOM'] = '$CO $RCSFLAGS $TARGET'
def exists(env):
return env.Detect('rcs')