Support comments in build rules.

Tested: sh tests/test.sh
diff --git a/ninja_defs.go b/ninja_defs.go
index a653796..0919ea4 100644
--- a/ninja_defs.go
+++ b/ninja_defs.go
@@ -73,6 +73,7 @@
 // Ninja build statement.  The Args field contains variable names and values
 // that are set within the build statement's scope in the Ninja file.
 type BuildParams struct {
+	Comment   string            // The comment that will appear above the definition.
 	Rule      Rule              // The rule to invoke.
 	Outputs   []string          // The list of output targets.
 	Inputs    []string          // The list of explicit input dependencies.
@@ -236,6 +237,7 @@
 
 // A buildDef describes a build target definition.
 type buildDef struct {
+	Comment   string
 	Rule      Rule
 	Outputs   []*ninjaString
 	Inputs    []*ninjaString
@@ -248,9 +250,11 @@
 func parseBuildParams(scope scope, params *BuildParams) (*buildDef,
 	error) {
 
+	comment := params.Comment
 	rule := params.Rule
 
 	b := &buildDef{
+		Comment: comment,
 		Rule: rule,
 	}
 
@@ -315,13 +319,14 @@
 
 func (b *buildDef) WriteTo(nw *ninjaWriter, pkgNames map[*PackageContext]string) error {
 	var (
+		comment       = b.Comment
 		rule          = b.Rule.fullName(pkgNames)
 		outputs       = valueList(b.Outputs, pkgNames, outputEscaper)
 		explicitDeps  = valueList(b.Inputs, pkgNames, inputEscaper)
 		implicitDeps  = valueList(b.Implicits, pkgNames, inputEscaper)
 		orderOnlyDeps = valueList(b.OrderOnly, pkgNames, inputEscaper)
 	)
-	err := nw.Build(rule, outputs, explicitDeps, implicitDeps, orderOnlyDeps)
+	err := nw.Build(comment, rule, outputs, explicitDeps, implicitDeps, orderOnlyDeps)
 	if err != nil {
 		return err
 	}
diff --git a/ninja_writer.go b/ninja_writer.go
index 883228d..42b9aa8 100644
--- a/ninja_writer.go
+++ b/ninja_writer.go
@@ -103,7 +103,7 @@
 	return err
 }
 
-func (n *ninjaWriter) Build(rule string, outputs, explicitDeps, implicitDeps,
+func (n *ninjaWriter) Build(comment string, rule string, outputs, explicitDeps, implicitDeps,
 	orderOnlyDeps []string) error {
 
 	n.justDidBlankLine = false
@@ -116,6 +116,10 @@
 		maxLineLen:  maxLineLen,
 	}
 
+	if comment != "" {
+		wrapper.Comment(comment)
+	}
+
 	wrapper.WriteString("build")
 
 	for _, output := range outputs {
diff --git a/ninja_writer_test.go b/ninja_writer_test.go
index 1bc456d..7b34d90 100644
--- a/ninja_writer_test.go
+++ b/ninja_writer_test.go
@@ -49,10 +49,10 @@
 	},
 	{
 		input: func(w *ninjaWriter) {
-			ck(w.Build("foo", []string{"o1", "o2"}, []string{"e1", "e2"},
+			ck(w.Build("foo comment", "foo", []string{"o1", "o2"}, []string{"e1", "e2"},
 				[]string{"i1", "i2"}, []string{"oo1", "oo2"}))
 		},
-		output: "build o1 o2: foo e1 e2 | i1 i2 || oo1 oo2\n",
+		output: "# foo comment\nbuild o1 o2: foo e1 e2 | i1 i2 || oo1 oo2\n",
 	},
 	{
 		input: func(w *ninjaWriter) {
@@ -88,7 +88,7 @@
 			ck(w.ScopedAssign("command", "echo out: $out in: $in _arg: $_arg"))
 			ck(w.ScopedAssign("pool", "p"))
 			ck(w.BlankLine())
-			ck(w.Build("r", []string{"foo.o"}, []string{"foo.in"}, nil, nil))
+			ck(w.Build("r comment", "r", []string{"foo.o"}, []string{"foo.in"}, nil, nil))
 			ck(w.ScopedAssign("_arg", "arg value"))
 		},
 		output: `pool p
@@ -99,6 +99,7 @@
     command = echo out: $out in: $in _arg: $_arg
     pool = p
 
+# r comment
 build foo.o: r foo.in
     _arg = arg value
 `,