[go] fix $out replace in ninja

fix
 semi_in_var.mk
 target_specific_var_append.mk

partial fix recipe_var.mk: fix bad $-escape, but ninja emits $ as '$'
diff --git a/ninja.go b/ninja.go
index 7e44a44..3f1a9ce 100644
--- a/ninja.go
+++ b/ninja.go
@@ -245,7 +245,7 @@
 		cmd = trimLeftSpace(cmd)
 		cmd = strings.Replace(cmd, "\\\n", "", -1)
 		cmd = strings.TrimRight(cmd, " \t\n;")
-		cmd = strings.Replace(cmd, "$", "$$", -1) // for ninja
+		cmd = escapeNinja(cmd)
 		if cmd == "" {
 			cmd = "true"
 		}
@@ -340,6 +340,10 @@
 	return strings.Join(deps, " "), strings.Join(orderOnlys, " ")
 }
 
+func escapeNinja(s string) string {
+	return strings.Replace(s, "$", "$$", -1)
+}
+
 func escapeShell(s string) string {
 	i := strings.IndexAny(s, "$`!\\\"")
 	if i < 0 {
@@ -396,7 +400,7 @@
 	inputs, orderOnlys := getDepString(node)
 	if len(runners) > 0 {
 		ruleName = n.genRuleName()
-		fmt.Fprintf(n.f, "\n# rule for %s\n", node.Output)
+		fmt.Fprintf(n.f, "\n# rule for %q\n", node.Output)
 		fmt.Fprintf(n.f, "rule %s\n", ruleName)
 
 		ss, desc, ulp := n.genShellScript(runners)
@@ -418,17 +422,17 @@
 		if len(cmdline) > ArgLenLimit {
 			fmt.Fprintf(n.f, " rspfile = $out.rsp\n")
 			if inputs != "" {
-				cmdline = strings.Replace(cmdline, inputs, "$in", -1)
+				cmdline = strings.Replace(cmdline, inputs, "${in}", -1)
 			}
-			cmdline = strings.Replace(cmdline, node.Output, "$out", -1)
+			cmdline = strings.Replace(cmdline, escapeNinja(node.Output), "${out}", -1)
 			fmt.Fprintf(n.f, " rspfile_content = %s\n", cmdline)
 			fmt.Fprintf(n.f, " command = %s $out.rsp\n", n.ctx.shell)
 		} else {
 			cmdline = escapeShell(cmdline)
 			if inputs != "" {
-				cmdline = strings.Replace(cmdline, escapeShell(inputs), "$in", -1)
+				cmdline = strings.Replace(cmdline, escapeShell(inputs), "${in}", -1)
 			}
-			cmdline = strings.Replace(cmdline, escapeShell(node.Output), "$out", -1)
+			cmdline = strings.Replace(cmdline, escapeShell(escapeNinja(node.Output)), "${out}", -1)
 			fmt.Fprintf(n.f, " command = %s -c \"%s\"\n", n.ctx.shell, cmdline)
 		}
 	}
@@ -625,7 +629,7 @@
 	}
 
 	if defaultTarget != "" {
-		fmt.Fprintf(n.f, "\ndefault %s\n", defaultTarget)
+		fmt.Fprintf(n.f, "\ndefault %s\n", escapeNinja(defaultTarget))
 	}
 
 	fmt.Fprintf(n.f, "\n# shortcuts:\n")
diff --git a/testcase/recipe_var.mk b/testcase/recipe_var.mk
index bce4e97..8e1431f 100644
--- a/testcase/recipe_var.mk
+++ b/testcase/recipe_var.mk
@@ -1,4 +1,4 @@
-# TODO(ninja): Fix
+# TODO(ninja): Fix - ninja emits $ as '$'
 
 foo=FAIL