Use Rule-local implicit dependencies

Depends on https://github.com/google/blueprint/pull/78

This uses the new CommandDeps field to move implicit dependencies
embedded in the Command string next to the definition, instead of having
to specify them in every BuildParam struct. This should make it easier
to verify dependencies.

Change-Id: I2711b160920e22fa962a436e1f7041272166f50f
diff --git a/cc/builder.go b/cc/builder.go
index 3d5bb77..a1d7f2c 100644
--- a/cc/builder.go
+++ b/cc/builder.go
@@ -45,6 +45,7 @@
 			Depfile:     "${out}.d",
 			Deps:        blueprint.DepsGCC,
 			Command:     "$relPwd $ccCmd -c $cFlags -MD -MF ${out}.d -o $out $in",
+			CommandDeps: []string{"$ccCmd"},
 			Description: "cc $out",
 		},
 		"ccCmd", "cFlags")
@@ -53,6 +54,7 @@
 		blueprint.RuleParams{
 			Command: "$ldCmd ${ldDirFlags} ${crtBegin} @${out}.rsp " +
 				"${libFlags} ${crtEnd} -o ${out} ${ldFlags}",
+			CommandDeps:    []string{"$ldCmd"},
 			Description:    "ld $out",
 			Rspfile:        "${out}.rsp",
 			RspfileContent: "${in}",
@@ -62,6 +64,7 @@
 	partialLd = pctx.StaticRule("partialLd",
 		blueprint.RuleParams{
 			Command:     "$ldCmd -r ${in} -o ${out}",
+			CommandDeps: []string{"$ldCmd"},
 			Description: "partialLd $out",
 		},
 		"ldCmd")
@@ -69,6 +72,7 @@
 	ar = pctx.StaticRule("ar",
 		blueprint.RuleParams{
 			Command:        "rm -f ${out} && $arCmd $arFlags $out @${out}.rsp",
+			CommandDeps:    []string{"$arCmd"},
 			Description:    "ar $out",
 			Rspfile:        "${out}.rsp",
 			RspfileContent: "${in}",
@@ -78,6 +82,7 @@
 	darwinAr = pctx.StaticRule("darwinAr",
 		blueprint.RuleParams{
 			Command:     "rm -f ${out} && $arCmd $arFlags $out $in",
+			CommandDeps: []string{"$arCmd"},
 			Description: "ar $out",
 		},
 		"arCmd", "arFlags")
@@ -85,6 +90,7 @@
 	darwinAppendAr = pctx.StaticRule("darwinAppendAr",
 		blueprint.RuleParams{
 			Command:     "cp -f ${inAr} ${out}.tmp && $arCmd $arFlags ${out}.tmp $in && mv ${out}.tmp ${out}",
+			CommandDeps: []string{"$arCmd"},
 			Description: "ar $out",
 		},
 		"arCmd", "arFlags", "inAr")
@@ -92,6 +98,7 @@
 	prefixSymbols = pctx.StaticRule("prefixSymbols",
 		blueprint.RuleParams{
 			Command:     "$objcopyCmd --prefix-symbols=${prefix} ${in} ${out}",
+			CommandDeps: []string{"$objcopyCmd"},
 			Description: "prefixSymbols $out",
 		},
 		"objcopyCmd", "prefix")
@@ -103,6 +110,7 @@
 			Depfile:     "${out}.d",
 			Deps:        blueprint.DepsGCC,
 			Command:     "$copyGccLibPath $out $ccCmd $cFlags -print-file-name=${libName}",
+			CommandDeps: []string{"$copyGccLibPath", "$ccCmd"},
 			Description: "copy gcc $out",
 		},
 		"ccCmd", "cFlags", "libName")
@@ -202,13 +210,11 @@
 			ccCmd = gccCmd(flags.toolchain, ccCmd)
 		}
 
-		objDeps := append([]string{ccCmd}, deps...)
-
 		ctx.Build(pctx, blueprint.BuildParams{
 			Rule:      cc,
 			Outputs:   []string{objFile},
 			Inputs:    []string{srcFile},
-			Implicits: objDeps,
+			Implicits: deps,
 			Args: map[string]string{
 				"cFlags": moduleCflags,
 				"ccCmd":  ccCmd,
@@ -227,10 +233,9 @@
 	arFlags := "crsPD"
 
 	ctx.Build(pctx, blueprint.BuildParams{
-		Rule:      ar,
-		Outputs:   []string{outputFile},
-		Inputs:    objFiles,
-		Implicits: []string{arCmd},
+		Rule:    ar,
+		Outputs: []string{outputFile},
+		Inputs:  objFiles,
 		Args: map[string]string{
 			"arFlags": arFlags,
 			"arCmd":   arCmd,
@@ -337,7 +342,6 @@
 		ldDirs = append(ldDirs, dir)
 	}
 
-	deps = append(deps, ldCmd)
 	deps = append(deps, sharedLibs...)
 	deps = append(deps, staticLibs...)
 	deps = append(deps, lateStaticLibs...)
@@ -368,13 +372,10 @@
 
 	ldCmd := gccCmd(flags.toolchain, "ld")
 
-	deps := []string{ldCmd}
-
 	ctx.Build(pctx, blueprint.BuildParams{
-		Rule:      partialLd,
-		Outputs:   []string{outputFile},
-		Inputs:    objFiles,
-		Implicits: deps,
+		Rule:    partialLd,
+		Outputs: []string{outputFile},
+		Inputs:  objFiles,
 		Args: map[string]string{
 			"ldCmd": ldCmd,
 		},
@@ -388,10 +389,9 @@
 	objcopyCmd := gccCmd(flags.toolchain, "objcopy")
 
 	ctx.Build(pctx, blueprint.BuildParams{
-		Rule:      prefixSymbols,
-		Outputs:   []string{outputFile},
-		Inputs:    []string{inputFile},
-		Implicits: []string{objcopyCmd},
+		Rule:    prefixSymbols,
+		Outputs: []string{outputFile},
+		Inputs:  []string{inputFile},
 		Args: map[string]string{
 			"objcopyCmd": objcopyCmd,
 			"prefix":     prefix,
@@ -405,10 +405,6 @@
 	ctx.Build(pctx, blueprint.BuildParams{
 		Rule:    copyGccLib,
 		Outputs: []string{outputFile},
-		Implicits: []string{
-			"$copyGccLibPath",
-			gccCmd(flags.toolchain, "gcc"),
-		},
 		Args: map[string]string{
 			"ccCmd":   gccCmd(flags.toolchain, "gcc"),
 			"cFlags":  flags.globalFlags,
diff --git a/cc/gen.go b/cc/gen.go
index 3bfe679..be50d75 100644
--- a/cc/gen.go
+++ b/cc/gen.go
@@ -38,6 +38,7 @@
 		blueprint.RuleParams{
 			Command: "BISON_PKGDATADIR=$yaccDataDir $yaccCmd -d $yaccFlags -o $cppFile $in && " +
 				"cp -f $hppFile $hFile",
+			CommandDeps: []string{"$yaccCmd"},
 			Description: "yacc $out",
 		},
 		"yaccFlags", "cppFile", "hppFile", "hFile")
@@ -45,6 +46,7 @@
 	lex = pctx.StaticRule("lex",
 		blueprint.RuleParams{
 			Command:     "$lexCmd -o$out $in",
+			CommandDeps: []string{"$lexCmd"},
 			Description: "lex $out",
 		})
 )
@@ -57,10 +59,9 @@
 	headerFile = pathtools.ReplaceExtension(cppFile, "h")
 
 	ctx.Build(pctx, blueprint.BuildParams{
-		Rule:      yacc,
-		Outputs:   []string{cppFile, headerFile},
-		Inputs:    []string{yaccFile},
-		Implicits: []string{"$yaccCmd"},
+		Rule:    yacc,
+		Outputs: []string{cppFile, headerFile},
+		Inputs:  []string{yaccFile},
 		Args: map[string]string{
 			"yaccFlags": yaccFlags,
 			"cppFile":   cppFile,
@@ -78,10 +79,9 @@
 	cppFile = pathtools.ReplaceExtension(cppFile, "cpp")
 
 	ctx.Build(pctx, blueprint.BuildParams{
-		Rule:      lex,
-		Outputs:   []string{cppFile},
-		Inputs:    []string{lexFile},
-		Implicits: []string{"$lexCmd"},
+		Rule:    lex,
+		Outputs: []string{cppFile},
+		Inputs:  []string{lexFile},
 	})
 
 	return cppFile
diff --git a/common/defs.go b/common/defs.go
index 0001ce1..67fcb1f 100644
--- a/common/defs.go
+++ b/common/defs.go
@@ -33,6 +33,7 @@
 	androidbp    = pctx.StaticRule("androidbp",
 		blueprint.RuleParams{
 			Command:     androidbpCmd + " ${srcDir}/Android.bp $in $out",
+			CommandDeps: []string{androidbpCmd},
 			Description: "androidbp $out",
 		})
 
diff --git a/common/glob.go b/common/glob.go
index 152be94..3de18ee 100644
--- a/common/glob.go
+++ b/common/glob.go
@@ -46,6 +46,7 @@
 	globRule = pctx.StaticRule("globRule",
 		blueprint.RuleParams{
 			Command:     fmt.Sprintf(`%s -o $out $excludes "$glob"`, globCmd),
+			CommandDeps: []string{globCmd},
 			Description: "glob $glob",
 
 			Restat:  true,
@@ -95,9 +96,8 @@
 	// Create a rule to rebuild fileListFile if a directory in depFile changes.  fileListFile
 	// will only be rewritten if it has changed, preventing unnecesary build.ninja regenerations.
 	ctx.Build(pctx, blueprint.BuildParams{
-		Rule:      globRule,
-		Outputs:   []string{fileListFile},
-		Implicits: []string{globCmd},
+		Rule:    globRule,
+		Outputs: []string{fileListFile},
 		Args: map[string]string{
 			"glob":     globPattern,
 			"excludes": JoinWithPrefixAndQuote(excludes, "-e "),
diff --git a/common/module.go b/common/module.go
index cb38513..33a801f 100644
--- a/common/module.go
+++ b/common/module.go
@@ -570,11 +570,10 @@
 
 		transMk := filepath.Join("androidmk", "Android_"+strings.Replace(filepath.Dir(origBp), "/", "_", -1)+".mk")
 		ctx.Build(pctx, blueprint.BuildParams{
-			Rule:      androidbp,
-			Outputs:   []string{transMk},
-			Inputs:    []string{bpFile},
-			Implicits: []string{androidbpCmd},
-			Optional:  true,
+			Rule:     androidbp,
+			Outputs:  []string{transMk},
+			Inputs:   []string{bpFile},
+			Optional: true,
 		})
 
 		androidMks = append(androidMks, transMk)
diff --git a/java/app_builder.go b/java/app_builder.go
index 8e907d2..4b3d315 100644
--- a/java/app_builder.go
+++ b/java/app_builder.go
@@ -34,6 +34,7 @@
 				`$aaptCmd package -m $aaptFlags -P $publicResourcesFile -G $proguardOptionsFile ` +
 				`-J $javaDir || ( rm -rf "$javaDir/*"; exit 41 ) && ` +
 				`find $javaDir -name "*.java" > $javaFileList`,
+			CommandDeps: []string{"$aaptCmd"},
 			Description: "aapt create R.java $out",
 		},
 		"aaptFlags", "publicResourcesFile", "proguardOptionsFile", "javaDir", "javaFileList")
@@ -41,6 +42,7 @@
 	aaptCreateAssetsPackage = pctx.StaticRule("aaptCreateAssetsPackage",
 		blueprint.RuleParams{
 			Command:     `rm -f $out && $aaptCmd package $aaptFlags -F $out`,
+			CommandDeps: []string{"$aaptCmd"},
 			Description: "aapt export package $out",
 		},
 		"aaptFlags", "publicResourcesFile", "proguardOptionsFile", "javaDir", "javaFileList")
@@ -49,6 +51,7 @@
 		blueprint.RuleParams{
 			// TODO: add-jni-shared-libs-to-package
 			Command:     `cp -f $in $out.tmp && $aaptCmd package -u $aaptFlags -F $out.tmp && mv $out.tmp $out`,
+			CommandDeps: []string{"$aaptCmd"},
 			Description: "aapt package $out",
 		},
 		"aaptFlags")
@@ -56,6 +59,7 @@
 	zipalign = pctx.StaticRule("zipalign",
 		blueprint.RuleParams{
 			Command:     `$zipalignCmd -f $zipalignFlags 4 $in $out`,
+			CommandDeps: []string{"$zipalignCmd"},
 			Description: "zipalign $out",
 		},
 		"zipalignFlags")
@@ -63,6 +67,7 @@
 	signapk = pctx.StaticRule("signapk",
 		blueprint.RuleParams{
 			Command:     `java -jar $signapkCmd $certificates $in $out`,
+			CommandDeps: []string{"$signapkCmd"},
 			Description: "signapk $out",
 		},
 		"certificates")
@@ -71,6 +76,7 @@
 		blueprint.RuleParams{
 			Command: "java -classpath $androidManifestMergerCmd com.android.manifmerger.Main merge " +
 				"--main $in --libs $libsManifests --out $out",
+			CommandDeps: []string{"$androidManifestMergerCmd"},
 			Description: "merge manifest files $out",
 		},
 		"libsManifests")
@@ -96,8 +102,6 @@
 	publicResourcesFile := filepath.Join(common.ModuleOutDir(ctx), "public_resources.xml")
 	proguardOptionsFile := filepath.Join(common.ModuleOutDir(ctx), "proguard.options")
 
-	deps = append([]string{"$aaptCmd"}, deps...)
-
 	ctx.Build(pctx, blueprint.BuildParams{
 		Rule:      aaptCreateResourceJavaFile,
 		Outputs:   []string{publicResourcesFile, proguardOptionsFile, javaFileList},
@@ -117,8 +121,6 @@
 func CreateExportPackage(ctx common.AndroidModuleContext, flags []string, deps []string) string {
 	outputFile := filepath.Join(common.ModuleOutDir(ctx), "package-export.apk")
 
-	deps = append([]string{"$aaptCmd"}, deps...)
-
 	ctx.Build(pctx, blueprint.BuildParams{
 		Rule:      aaptCreateAssetsPackage,
 		Outputs:   []string{outputFile},
@@ -137,10 +139,9 @@
 	resourceApk := filepath.Join(common.ModuleOutDir(ctx), "resources.apk")
 
 	ctx.Build(pctx, blueprint.BuildParams{
-		Rule:      aaptAddResources,
-		Outputs:   []string{resourceApk},
-		Inputs:    []string{jarFile},
-		Implicits: []string{"$aaptCmd"},
+		Rule:    aaptAddResources,
+		Outputs: []string{resourceApk},
+		Inputs:  []string{jarFile},
 		Args: map[string]string{
 			"aaptFlags": strings.Join(flags, " "),
 		},
@@ -154,10 +155,9 @@
 	}
 
 	ctx.Build(pctx, blueprint.BuildParams{
-		Rule:      signapk,
-		Outputs:   []string{signedApk},
-		Inputs:    []string{resourceApk},
-		Implicits: []string{"$signapkCmd"},
+		Rule:    signapk,
+		Outputs: []string{signedApk},
+		Inputs:  []string{resourceApk},
 		Args: map[string]string{
 			"certificates": strings.Join(certificateArgs, " "),
 		},
@@ -166,10 +166,9 @@
 	outputFile := filepath.Join(common.ModuleOutDir(ctx), "package.apk")
 
 	ctx.Build(pctx, blueprint.BuildParams{
-		Rule:      zipalign,
-		Outputs:   []string{outputFile},
-		Inputs:    []string{signedApk},
-		Implicits: []string{"$zipalignCmd"},
+		Rule:    zipalign,
+		Outputs: []string{outputFile},
+		Inputs:  []string{signedApk},
 		Args: map[string]string{
 			"zipalignFlags": "",
 		},
diff --git a/java/builder.go b/java/builder.go
index 4eda6adf..36506ae 100644
--- a/java/builder.go
+++ b/java/builder.go
@@ -52,6 +52,7 @@
 	jar = pctx.StaticRule("jar",
 		blueprint.RuleParams{
 			Command:     `$jarCmd -o $out $jarArgs`,
+			CommandDeps: []string{"$jarCmd"},
 			Description: "jar $out",
 		},
 		"jarCmd", "jarArgs")
@@ -61,6 +62,7 @@
 			Command: `rm -rf "$outDir" && mkdir -p "$outDir" && ` +
 				`$dxCmd --dex --output=$outDir $dxFlags $in || ( rm -rf "$outDir"; exit 41 ) && ` +
 				`find "$outDir" -name "classes*.dex" > $out`,
+			CommandDeps: []string{"$dxCmd"},
 			Description: "dex $out",
 		},
 		"outDir", "dxFlags")
@@ -68,6 +70,7 @@
 	jarjar = pctx.StaticRule("jarjar",
 		blueprint.RuleParams{
 			Command:     "java -jar $jarjarCmd process $rulesFile $in $out",
+			CommandDeps: []string{"$jarjarCmd", "$rulesFile"},
 			Description: "jarjar $out",
 		},
 		"rulesFile")
@@ -156,8 +159,6 @@
 		jarArgs = append(jarArgs, "-m "+manifest)
 	}
 
-	deps = append(deps, "$jarCmd")
-
 	ctx.Build(pctx, blueprint.BuildParams{
 		Rule:      jar,
 		Outputs:   []string{outputFile},
@@ -177,10 +178,9 @@
 	outputFile := filepath.Join(common.ModuleOutDir(ctx), "dex.filelist")
 
 	ctx.Build(pctx, blueprint.BuildParams{
-		Rule:      dx,
-		Outputs:   []string{outputFile},
-		Inputs:    []string{classesJar},
-		Implicits: []string{"$dxCmd"},
+		Rule:    dx,
+		Outputs: []string{outputFile},
+		Inputs:  []string{classesJar},
 		Args: map[string]string{
 			"dxFlags": flags.dxFlags,
 			"outDir":  outDir,
@@ -205,8 +205,6 @@
 	deps = append(deps, dexJarSpec.fileList)
 	jarArgs = append(jarArgs, dexJarSpec.soongJarArgs())
 
-	deps = append(deps, "$jarCmd")
-
 	ctx.Build(pctx, blueprint.BuildParams{
 		Rule:      jar,
 		Outputs:   []string{outputFile},
@@ -222,10 +220,9 @@
 func TransformJarJar(ctx common.AndroidModuleContext, classesJar string, rulesFile string) string {
 	outputFile := filepath.Join(common.ModuleOutDir(ctx), "classes-jarjar.jar")
 	ctx.Build(pctx, blueprint.BuildParams{
-		Rule:      jarjar,
-		Outputs:   []string{outputFile},
-		Inputs:    []string{classesJar},
-		Implicits: []string{"$jarjarCmd"},
+		Rule:    jarjar,
+		Outputs: []string{outputFile},
+		Inputs:  []string{classesJar},
 		Args: map[string]string{
 			"rulesFile": rulesFile,
 		},
diff --git a/java/gen.go b/java/gen.go
index 6e8313a..f989875 100644
--- a/java/gen.go
+++ b/java/gen.go
@@ -44,6 +44,7 @@
 	aidl = pctx.StaticRule("aidl",
 		blueprint.RuleParams{
 			Command:     "$aidlCmd -d$depFile $aidlFlags $in $out",
+			CommandDeps: []string{"$aidlCmd"},
 			Description: "aidl $out",
 		},
 		"depFile", "aidlFlags")
@@ -51,12 +52,14 @@
 	logtags = pctx.StaticRule("logtags",
 		blueprint.RuleParams{
 			Command:     "$logtagsCmd -o $out $in $allLogtagsFile",
+			CommandDeps: []string{"$logtagsCmd"},
 			Description: "logtags $out",
 		})
 
 	mergeLogtags = pctx.StaticRule("mergeLogtags",
 		blueprint.RuleParams{
 			Command:     "$mergeLogtagsCmd -o $out $in",
+			CommandDeps: []string{"$mergeLogtagsCmd"},
 			Description: "merge logtags $out",
 		})
 )
@@ -68,10 +71,9 @@
 	depFile := javaFile + ".d"
 
 	ctx.Build(pctx, blueprint.BuildParams{
-		Rule:      aidl,
-		Outputs:   []string{javaFile},
-		Inputs:    []string{aidlFile},
-		Implicits: []string{"$aidlCmd"},
+		Rule:    aidl,
+		Outputs: []string{javaFile},
+		Inputs:  []string{aidlFile},
 		Args: map[string]string{
 			"depFile":   depFile,
 			"aidlFlags": aidlFlags,
@@ -87,10 +89,9 @@
 	javaFile = pathtools.ReplaceExtension(javaFile, "java")
 
 	ctx.Build(pctx, blueprint.BuildParams{
-		Rule:      logtags,
-		Outputs:   []string{javaFile},
-		Inputs:    []string{logtagsFile},
-		Implicits: []string{"$logtagsCmd"},
+		Rule:    logtags,
+		Outputs: []string{javaFile},
+		Inputs:  []string{logtagsFile},
 	})
 
 	return javaFile