# 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()