Esempio n. 1
0
# 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.
"""
Verify that we can install a file if its file name portion begins
with a '#'.  (A previous bug re-interpreted that as relative to
the top-level SConstruct directory.)

Thanks to Dave Weber for the test case.
"""

import TestSCons

test = TestSCons.TestSCons()

test.subdir(['test'])

test.write(['SConstruct'], """\
DefaultEnvironment(tools=[])
env = Environment(tools=[]) 
i = env.Install("#/install", "#/test/#testfile.txt#");
env.Default(i);
""")

test.write(['test', '#testfile.txt#'], "test/#testfile.txt#\n")

test.run()

test.must_match(['install', '#testfile.txt#'], "test/#testfile.txt#\n")
Esempio n. 2
0
# 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__ = "test/option/warn-dependency.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog"

"""
Verify use of the --warn=dependency option.
"""

import TestSCons

test = TestSCons.TestSCons(match = TestSCons.match_re_dotall)


test.write("SConstruct", """\
import SCons.Defaults

def build(target, source, env):
    pass

env=Environment()
env['BUILDERS']['test'] = Builder(action=build,
                                  source_scanner=SCons.Defaults.ObjSourceScan)
env.test(target='foo', source='foo.c')
env.Pseudo('foo')
""")
Esempio n. 3
0
#
# 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__ = "test/dependency-cycle.py rel_2.5.1:3735:9dc6cee5c168 2016/11/03 14:02:02 bdbaddog"

import TestSCons
import TestCmd

test = TestSCons.TestSCons(match=TestCmd.match_re)

test.write(
    'SConstruct', """
env = Environment()
foo1 = env.Library(target = 'foo1', source = 'f1.c')
foo2 = env.Library(target = 'foo2', source = 'f1.c')
foo3 = env.Library(target = 'foo3', source = 'f1.c')
env.Depends(foo1, foo2)
env.Depends(foo2, foo3)
env.Depends(foo3, foo1)
""")

test.write(
    'f1.c', r"""
#include <stdio.h>
Esempio n. 4
0
# 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__"

import TestSCons

_python_ = TestSCons._python_

test = TestSCons.TestSCons()

test.write(
    'build.py', r"""
import sys
with open(sys.argv[1], 'wb') as f, open(sys.argv[2], 'rb') as infp:
    f.write(infp.read())
""")

test.write(
    'SConstruct', """
DefaultEnvironment(tools=[])
SetOption('md5_chunksize', 128)
B = Builder(action = r'%(_python_)s build.py $TARGETS $SOURCES')
env = Environment(tools=[], BUILDERS = { 'B' : B })
f1 = env.B(target = 'f1.out', source = 'f1.in')
Esempio n. 5
0
import TestSCons

def match_normcase(lines, matches):
    if not isinstance(lines, list):
        lines = lines.split("\n")
    if not isinstance(matches, list):
        matches = matches.split("\n")
    if len(lines) != len(matches):
        return
    for i in range(len(lines)):
        if os.path.normcase(lines[i]) != os.path.normcase(matches[i]):
            return
    return 1

test = TestSCons.TestSCons(match=match_normcase)

wpath = test.workpath()
wpath_sub = test.workpath('sub')
wpath_sub_dir = test.workpath('sub', 'dir')
wpath_sub_foo_bar = test.workpath('sub', 'foo', 'bar')

test.subdir('sub', ['sub', 'dir'])

test.write('SConstruct', """
import os
print("SConstruct "+os.getcwd())
""")

test.write(['sub', 'SConstruct'], """
import os
Esempio n. 6
0
# 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

__docformat__ = "restructuredText"
"""
TODO: Write documentation
"""

import sys
import TestSCons

if sys.platform == 'win32':
    test = TestSCons.TestSCons(program='scons.bat', interpreter=None)
else:
    test = TestSCons.TestSCons()

test.dir_fixture('image')
test.subdir(['src', 'site_scons'])
test.subdir(['src', 'site_scons', 'site_tools'])
test.subdir(['src', 'site_scons', 'site_tools', 'texas'])
test.file_fixture('../../../../../../about.py',
                  'src/site_scons/site_tools/texas/about.py')
test.file_fixture('../../../../../../__init__.py',
                  'src/site_scons/site_tools/texas/__init__.py')
test.file_fixture('../../../../../../TeXASCommon.py',
                  'src/site_scons/site_tools/texas/TeXASCommon.py')
test.file_fixture('../../../../../../TeXASDist.py',
                  'src/site_scons/site_tools/texas/TeXASDist.py')
Esempio n. 7
0
# 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__"

import os

import TestCmd
import TestSCons

test = TestSCons.TestSCons(match=TestCmd.match_re_dotall,
                           ignore_python_version=0)

wpath = test.workpath()

test.write('SConstruct', r"""
Help("Help text.\n")
""")

expect = """scons: Reading SConscript files ...
scons: done reading SConscript files.
Help text.

Use scons -H for help about command-line options.
"""

os.environ['SCONSFLAGS'] = ''
Esempio n. 8
0
# 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__"
"""
Verify that "build" command of --interactive mode can take a -j
option to build things in parallel.
"""

import TestSCons

test = TestSCons.TestSCons(combine=1)

test.write(
    'SConstruct', """\
import os
import time
from SCons.Script import *
def cat(target, source, env):
    t = str(target[0])
    os.mkdir(t + '.started')
    fp = open(t, 'wb')
    for s in source:
        fp.write(open(str(s), 'rb').read())
    fp.close()
    os.mkdir(t + '.finished')
Esempio n. 9
0
    def test_Save(self):
        """Testing saving Variables"""

        test = TestSCons.TestSCons()
        cache_file = test.workpath('cached.options')
        opts = SCons.Variables.Variables()

        def bool_converter(val):
            if val in [1, 'y']: val = 1
            if val in [0, 'n']: val = 0
            return val

        # test saving out empty file
        opts.Add('OPT_VAL', 'An option to test', 21, None, None)
        opts.Add('OPT_VAL_2', default='foo')
        opts.Add('OPT_VAL_3', default=1)
        opts.Add('OPT_BOOL_0', default='n', converter=bool_converter)
        opts.Add('OPT_BOOL_1', default='y', converter=bool_converter)
        opts.Add('OPT_BOOL_2', default=0, converter=bool_converter)

        env = Environment()
        opts.Update(env, {'OPT_VAL_3': 2})
        assert env['OPT_VAL'] == 21, env['OPT_VAL']
        assert env['OPT_VAL_2'] == 'foo', env['OPT_VAL_2']
        assert env['OPT_VAL_3'] == 2, env['OPT_VAL_3']
        assert env['OPT_BOOL_0'] == 0, env['OPT_BOOL_0']
        assert env['OPT_BOOL_1'] == 1, env['OPT_BOOL_1']
        assert env['OPT_BOOL_2'] == '0', env['OPT_BOOL_2']

        env['OPT_VAL_2'] = 'bar'
        env['OPT_BOOL_0'] = 0
        env['OPT_BOOL_1'] = 1
        env['OPT_BOOL_2'] = 2

        opts.Save(cache_file, env)
        checkSave(cache_file, {
            'OPT_VAL_2': 'bar',
            'OPT_VAL_3': 2,
            'OPT_BOOL_2': 2
        })

        # Test against some old bugs
        class Foo(object):
            def __init__(self, x):
                self.x = x

            def __str__(self):
                return self.x

        test = TestSCons.TestSCons()
        cache_file = test.workpath('cached.options')
        opts = SCons.Variables.Variables()

        opts.Add('THIS_USED_TO_BREAK', 'An option to test', "Default")

        opts.Add('THIS_ALSO_BROKE', 'An option to test', "Default2")

        opts.Add('THIS_SHOULD_WORK', 'An option to test', Foo('bar'))

        env = Environment()
        opts.Update(
            env, {
                'THIS_USED_TO_BREAK': "Single'Quotes'In'String",
                'THIS_ALSO_BROKE': "\\Escape\nSequences\t",
                'THIS_SHOULD_WORK': Foo('baz')
            })
        opts.Save(cache_file, env)
        checkSave(
            cache_file, {
                'THIS_USED_TO_BREAK': "Single'Quotes'In'String",
                'THIS_ALSO_BROKE': "\\Escape\nSequences\t",
                'THIS_SHOULD_WORK': 'baz'
            })
Esempio n. 10
0
    def test_Update(self):
        """Test updating an Environment"""

        # Test that a default value is validated correctly.
        test = TestSCons.TestSCons()
        file = test.workpath('custom.py')
        opts = SCons.Variables.Variables(file)

        opts.Add('ANSWER', 'THE answer to THE question', "42", check,
                 lambda x: int(x) + 12)

        env = Environment()
        opts.Update(env)
        assert env['ANSWER'] == 54

        env = Environment()
        opts.Update(env, {})
        assert env['ANSWER'] == 54

        # Test that a bad value from the file is used and
        # validation fails correctly.
        test = TestSCons.TestSCons()
        file = test.workpath('custom.py')
        test.write('custom.py', 'ANSWER=54')
        opts = SCons.Variables.Variables(file)

        opts.Add('ANSWER', 'THE answer to THE question', "42", check,
                 lambda x: int(x) + 12)

        env = Environment()
        exc_caught = None
        try:
            opts.Update(env)
        except AssertionError:
            exc_caught = 1
        assert exc_caught, "did not catch expected assertion"

        env = Environment()
        exc_caught = None
        try:
            opts.Update(env, {})
        except AssertionError:
            exc_caught = 1
        assert exc_caught, "did not catch expected assertion"

        # Test that a good value from the file is used and validated.
        test = TestSCons.TestSCons()
        file = test.workpath('custom.py')
        test.write('custom.py', 'ANSWER=42')
        opts = SCons.Variables.Variables(file)

        opts.Add('ANSWER', 'THE answer to THE question', "10", check,
                 lambda x: int(x) + 12)

        env = Environment()
        opts.Update(env)
        assert env['ANSWER'] == 54

        env = Environment()
        opts.Update(env, {})
        assert env['ANSWER'] == 54

        # Test that a bad value from an args dictionary passed to
        # Update() is used and validation fails correctly.
        test = TestSCons.TestSCons()
        file = test.workpath('custom.py')
        test.write('custom.py', 'ANSWER=10')
        opts = SCons.Variables.Variables(file)

        opts.Add('ANSWER', 'THE answer to THE question', "12", check,
                 lambda x: int(x) + 12)

        env = Environment()
        exc_caught = None
        try:
            opts.Update(env, {'ANSWER': '54'})
        except AssertionError:
            exc_caught = 1
        assert exc_caught, "did not catch expected assertion"

        # Test that a good value from an args dictionary
        # passed to Update() is used and validated.
        test = TestSCons.TestSCons()
        file = test.workpath('custom.py')
        test.write('custom.py', 'ANSWER=10')
        opts = SCons.Variables.Variables(file)

        opts.Add('ANSWER', 'THE answer to THE question', "12", check,
                 lambda x: int(x) + 12)

        env = Environment()
        opts.Update(env, {'ANSWER': '42'})
        assert env['ANSWER'] == 54

        # Test against a former bug.  If we supply a converter,
        # but no default, the value should *not* appear in the
        # Environment if no value is specified in the options file
        # or args.
        test = TestSCons.TestSCons()
        file = test.workpath('custom.py')
        opts = SCons.Variables.Variables(file)

        opts.Add('ANSWER', help='THE answer to THE question', converter=str)

        env = Environment()
        opts.Update(env, {})
        assert 'ANSWER' not in env

        # Test that a default value of None is all right.
        test = TestSCons.TestSCons()
        file = test.workpath('custom.py')
        opts = SCons.Variables.Variables(file)

        opts.Add('ANSWER', "This is the answer", None, check)

        env = Environment()
        opts.Update(env, {})
        assert 'ANSWER' not in env