blob: 6fffa0e0e1fa0cdfabb38242c412491e59f3ec5f [file] [log] [blame]
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
from mozbuild.makeutil import (
Makefile,
read_dep_makefile,
Rule,
write_dep_makefile,
)
from mozunit import main
import os
import unittest
from StringIO import StringIO
class TestMakefile(unittest.TestCase):
def test_rule(self):
out = StringIO()
rule = Rule()
rule.dump(out)
self.assertEqual(out.getvalue(), '')
out.truncate(0)
rule.add_targets(['foo', 'bar'])
rule.dump(out)
self.assertEqual(out.getvalue(), 'foo bar:\n')
out.truncate(0)
rule.add_targets(['baz'])
rule.add_dependencies(['qux', 'hoge', 'piyo'])
rule.dump(out)
self.assertEqual(out.getvalue(), 'foo bar baz: qux hoge piyo\n')
out.truncate(0)
rule = Rule(['foo', 'bar'])
rule.add_dependencies(['baz'])
rule.add_commands(['echo $@'])
rule.add_commands(['$(BAZ) -o $@ $<', '$(TOUCH) $@'])
rule.dump(out)
self.assertEqual(out.getvalue(),
'foo bar: baz\n' +
'\techo $@\n' +
'\t$(BAZ) -o $@ $<\n' +
'\t$(TOUCH) $@\n')
out.truncate(0)
rule = Rule(['foo'])
rule.add_dependencies(['bar', 'foo', 'baz'])
rule.dump(out)
self.assertEqual(out.getvalue(), 'foo: bar baz\n')
out.truncate(0)
rule.add_targets(['bar'])
rule.dump(out)
self.assertEqual(out.getvalue(), 'foo bar: baz\n')
out.truncate(0)
rule.add_targets(['bar'])
rule.dump(out)
self.assertEqual(out.getvalue(), 'foo bar: baz\n')
out.truncate(0)
rule.add_dependencies(['bar'])
rule.dump(out)
self.assertEqual(out.getvalue(), 'foo bar: baz\n')
out.truncate(0)
rule.add_dependencies(['qux'])
rule.dump(out)
self.assertEqual(out.getvalue(), 'foo bar: baz qux\n')
out.truncate(0)
rule.add_dependencies(['qux'])
rule.dump(out)
self.assertEqual(out.getvalue(), 'foo bar: baz qux\n')
out.truncate(0)
rule.add_dependencies(['hoge', 'hoge'])
rule.dump(out)
self.assertEqual(out.getvalue(), 'foo bar: baz qux hoge\n')
out.truncate(0)
rule.add_targets(['fuga', 'fuga'])
rule.dump(out)
self.assertEqual(out.getvalue(), 'foo bar fuga: baz qux hoge\n')
def test_makefile(self):
out = StringIO()
mk = Makefile()
rule = mk.create_rule(['foo'])
rule.add_dependencies(['bar', 'baz', 'qux'])
rule.add_commands(['echo foo'])
rule = mk.create_rule().add_targets(['bar', 'baz'])
rule.add_dependencies(['hoge'])
rule.add_commands(['echo $@'])
mk.dump(out, removal_guard=False)
self.assertEqual(out.getvalue(),
'foo: bar baz qux\n' +
'\techo foo\n' +
'bar baz: hoge\n' +
'\techo $@\n')
out.truncate(0)
mk.dump(out)
self.assertEqual(out.getvalue(),
'foo: bar baz qux\n' +
'\techo foo\n' +
'bar baz: hoge\n' +
'\techo $@\n' +
'hoge qux:\n')
def test_statement(self):
out = StringIO()
mk = Makefile()
mk.create_rule(['foo']).add_dependencies(['bar']) \
.add_commands(['echo foo'])
mk.add_statement('BAR = bar')
mk.create_rule(['$(BAR)']).add_commands(['echo $@'])
mk.dump(out, removal_guard=False)
self.assertEqual(out.getvalue(),
'foo: bar\n' +
'\techo foo\n' +
'BAR = bar\n' +
'$(BAR):\n' +
'\techo $@\n')
@unittest.skipIf(os.name != 'nt', 'Test only applicable on Windows.')
def test_path_normalization(self):
out = StringIO()
mk = Makefile()
rule = mk.create_rule(['c:\\foo'])
rule.add_dependencies(['c:\\bar', 'c:\\baz\\qux'])
rule.add_commands(['echo c:\\foo'])
mk.dump(out)
self.assertEqual(out.getvalue(),
'c:/foo: c:/bar c:/baz/qux\n' +
'\techo c:\\foo\n' +
'c:/bar c:/baz/qux:\n')
def test_read_dep_makefile(self):
input = StringIO(
os.path.abspath('foo') + ': bar\n' +
'baz qux: \\ \n' +
'hoge \\\n' +
'piyo \\\n' +
'fuga\n' +
'fuga:\n'
)
result = list(read_dep_makefile(input))
self.assertEqual(len(result), 2)
self.assertEqual(list(result[0].targets()), [os.path.abspath('foo').replace(os.sep, '/')])
self.assertEqual(list(result[0].dependencies()), ['bar'])
self.assertEqual(list(result[1].targets()), ['baz', 'qux'])
self.assertEqual(list(result[1].dependencies()), ['hoge', 'piyo', 'fuga'])
def test_write_dep_makefile(self):
out = StringIO()
write_dep_makefile(out, 'target', ['b', 'c', 'a'])
self.assertEqual(out.getvalue(),
'target: b c a\n' +
'a b c:\n')
if __name__ == '__main__':
main()