Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

# 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/.
import os
import unittest
from mozunit import main
from six import StringIO
from mozbuild.makeutil import Makefile, Rule, read_dep_makefile, write_dep_makefile
class TestMakefile(unittest.TestCase):
def test_rule(self):
out = StringIO()
rule = Rule()
rule.dump(out)
self.assertEqual(out.getvalue(), "")
out = StringIO()
rule.add_targets(["foo", "bar"])
rule.dump(out)
self.assertEqual(out.getvalue(), "foo bar:\n")
out = StringIO()
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 = StringIO()
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 = StringIO()
rule = Rule(["foo"])
rule.add_dependencies(["bar", "foo", "baz"])
rule.dump(out)
self.assertEqual(out.getvalue(), "foo: bar baz\n")
out = StringIO()
rule.add_targets(["bar"])
rule.dump(out)
self.assertEqual(out.getvalue(), "foo bar: baz\n")
out = StringIO()
rule.add_targets(["bar"])
rule.dump(out)
self.assertEqual(out.getvalue(), "foo bar: baz\n")
out = StringIO()
rule.add_dependencies(["bar"])
rule.dump(out)
self.assertEqual(out.getvalue(), "foo bar: baz\n")
out = StringIO()
rule.add_dependencies(["qux"])
rule.dump(out)
self.assertEqual(out.getvalue(), "foo bar: baz qux\n")
out = StringIO()
rule.add_dependencies(["qux"])
rule.dump(out)
self.assertEqual(out.getvalue(), "foo bar: baz qux\n")
out = StringIO()
rule.add_dependencies(["hoge", "hoge"])
rule.dump(out)
self.assertEqual(out.getvalue(), "foo bar: baz qux hoge\n")
out = StringIO()
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 = StringIO()
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()