summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWilliam Deegan <bill@baddogconsulting.com>2019-12-06 23:11:07 (GMT)
committerGitHub <noreply@github.com>2019-12-06 23:11:07 (GMT)
commit0bb6513283d109447974d907617bb31c3fa763b3 (patch)
treee91acdc8b77919c48cb4681092645abb7c451340
parent714d2c0baf5573c32bf709f3d252496c2359b345 (diff)
parent16f42198ba3afe2e40b21c5627274fec48c8611e (diff)
downloadSCons-0bb6513283d109447974d907617bb31c3fa763b3.zip
SCons-0bb6513283d109447974d907617bb31c3fa763b3.tar.gz
SCons-0bb6513283d109447974d907617bb31c3fa763b3.tar.bz2
Merge pull request #3129 from dragon512/update-command
Allow Command to take more builder options
-rwxr-xr-xsrc/CHANGES.txt3
-rw-r--r--src/engine/SCons/Environment.py13
-rw-r--r--src/engine/SCons/Environment.xml22
-rw-r--r--test/Command.py44
4 files changed, 74 insertions, 8 deletions
diff --git a/src/CHANGES.txt b/src/CHANGES.txt
index e24555d..a5a37b8 100755
--- a/src/CHANGES.txt
+++ b/src/CHANGES.txt
@@ -5,6 +5,9 @@
Change Log
RELEASE VERSION/DATE TO BE FILLED IN LATER
+ From Jason Kenny
+ - Update Command() function to accept target_scanner, source_factory, and target_factory arguments.
+ This make Command act more like a one-off builder.
From Edoardo Bezzeccheri
- Added debug option "action_timestamps" which outputs to stdout the absolute start and end time for each target.
diff --git a/src/engine/SCons/Environment.py b/src/engine/SCons/Environment.py
index 1296f54..4a9cf11 100644
--- a/src/engine/SCons/Environment.py
+++ b/src/engine/SCons/Environment.py
@@ -1987,9 +1987,22 @@ class Base(SubstitutionEnvironment):
'target_factory' : self.fs.Entry,
'source_factory' : self.fs.Entry,
}
+ # source scanner
try: bkw['source_scanner'] = kw['source_scanner']
except KeyError: pass
else: del kw['source_scanner']
+ #target scanner
+ try: bkw['target_scanner'] = kw['target_scanner']
+ except KeyError: pass
+ else: del kw['target_scanner']
+ #source factory
+ try: bkw['source_factory'] = kw['source_factory']
+ except KeyError: pass
+ else: del kw['source_factory']
+ #target factory
+ try: bkw['target_factory'] = kw['target_factory']
+ except KeyError: pass
+ else: del kw['target_factory']
bld = SCons.Builder.Builder(**bkw)
return bld(self, target, source, **kw)
diff --git a/src/engine/SCons/Environment.xml b/src/engine/SCons/Environment.xml
index 516505c..48cf3ae 100644
--- a/src/engine/SCons/Environment.xml
+++ b/src/engine/SCons/Environment.xml
@@ -937,19 +937,29 @@ for a single special-case build.
</para>
<para>
-As a special case, the
-<varname>source_scanner</varname>
-keyword argument can
+&b-Command; builder accepts
+<varname>source_scanner</varname>,
+<varname>target_scanner</varname>,
+<varname>source_factory</varname>, and
+<varname>target_factory</varname>
+keyword arguments. The *_scanner args can
be used to specify
a Scanner object
-that will be used to scan the sources.
-(The global
+that will be used to apply a custom
+scanner for a source or target.
+For example, the global
<literal>DirScanner</literal>
object can be used
if any of the sources will be directories
that must be scanned on-disk for
changes to files that aren't
-already specified in other Builder of function calls.)
+already specified in other Builder of function calls.
+The *_factory args take a factory function that the
+Command will use to turn any sources or targets
+specified as strings into SCons Nodes.
+See the sections "Builder Objects"
+below, for more information about how these
+args work in a Builder.
</para>
<para>
diff --git a/test/Command.py b/test/Command.py
index 09a8daa..7189d06 100644
--- a/test/Command.py
+++ b/test/Command.py
@@ -21,7 +21,6 @@
# 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__"
import TestSCons
@@ -43,7 +42,9 @@ test.write('build.py', build_py)
test.write(['expand_chdir_sub', 'subbuild.py'], build_py)
test.write('SConstruct', """
+from __future__ import print_function
import os
+import sys
def buildIt(env, target, source):
with open(str(target[0]), 'w') as f, open(str(source[0]), 'r') as infp:
@@ -62,6 +63,19 @@ def sub(env, target, source):
t.write(s.read())
return 0
+def source_scanner(node, env, path, builder):
+ print("Source scanner node=", node, "builder =", builder,file=sys.stderr)
+ return []
+
+
+def target_scanner(node, env, path, builder):
+ print("Target scanner node=", node, "builder =", builder,file=sys.stderr)
+ return []
+
+def factory(node,*lst,**kw):
+ print("factory called on:",node,file=sys.stderr)
+ return env.File(node)
+
env = Environment(COPY_THROUGH_TEMP = r'%(_python_)s build.py .tmp $SOURCE' + '\\n' + r'%(_python_)s build.py $TARGET .tmp',
EXPAND = '$COPY_THROUGH_TEMP')
env.Command(target = 'f1.out', source = 'f1.in',
@@ -82,6 +96,19 @@ env.Command(target = 'f7.out', source = 'f7.in',
action = r'%(_python_)s build.py $TARGET $SOURCE')
Command(target = 'f8.out', source = 'f8.in',
action = r'%(_python_)s build.py $TARGET $SOURCE')
+env.Command(target = 'f7s.out', source = 'f7.in',
+ action = r'%(_python_)s build.py $TARGET $SOURCE',
+ target_scanner=Scanner(lambda node, env, path: target_scanner(node, env, path, "w-env")),
+ source_scanner=Scanner(lambda node, env, path: source_scanner(node, env, path, "w-env")))
+Command(target = 'f8s.out', source = 'f8.in',
+ action = r'%(_python_)s build.py $TARGET $SOURCE',
+ target_scanner=Scanner(lambda node, env, path: target_scanner(node, env, path, "wo-env")),
+ source_scanner=Scanner(lambda node, env, path: source_scanner(node, env, path, "wo-env")))
+Command(target = 'f8f.out', source = 'f8.in',
+ action = r'%(_python_)s build.py $TARGET $SOURCE',
+ target_factory=factory,
+ source_factory=factory
+ )
env.Command(target = 'f9.out', source = 'f9.in',
action = r'$EXPAND')
env.Command(target = '${F10}.out', source = '${F10}.in',
@@ -108,7 +135,18 @@ test.write('f9.in', "f9.in\n")
test.write('f10.in', "f10.in\n")
test.write(['expand_chdir_sub', 'f11.in'], "expand_chdir_sub/f11.in\n")
-test.run(arguments = '.')
+test_str = r'''factory called on: f8.in
+factory called on: f8f.out
+Source scanner node= f7.in builder = w-env
+Target scanner node= f7s.out builder = w-env
+Source scanner node= f8.in builder = wo-env
+Target scanner node= f8s.out builder = wo-env
+'''
+
+out = test.run(arguments = '.',
+ stderr = test_str,
+ match=TestSCons.match_re_dotall)
+
test.must_match('f1.out', "f1.in\n", mode='r')
test.must_match('f2.out', "f2.in\n", mode='r')
@@ -118,6 +156,8 @@ test.must_match('f5.out', "XYZZY is set\nf5.in\n", mode='r')
test.must_match('f6.out', "f6.in\n", mode='r')
test.must_match('f7.out', "f7.in\n", mode='r')
test.must_match('f8.out', "f8.in\n", mode='r')
+test.must_match('f7s.out', "f7.in\n", mode='r')
+test.must_match('f8s.out', "f8.in\n", mode='r')
test.must_match('f9.out', "f9.in\n", mode='r')
test.must_match('f10.out', "f10.in\n", mode='r')
test.must_match(['expand_chdir_sub', 'f11.out'], "expand_chdir_sub/f11.in\n", mode='r')