Make APEX build rules consistent
Don't directly iterate over the copyManifest map to generate the copy
commands. Iterating over a map in golang isn't guaranteed to give
consistent order. This causes the apex build rules to be executed even
when there is no source file change.
Fix the issue by creating a sorted list of the key and then iterate over
the list.
Bug: 117453592
Test: m apex.test; m.apex.test nothing is built during the second
build
Change-Id: I329a91ec0b6a34cbe745bf9a9ceb0843b63c200c
diff --git a/apex/apex.go b/apex/apex.go
index 51e2401..0749ab3 100644
--- a/apex/apex.go
+++ b/apex/apex.go
@@ -19,6 +19,7 @@
"io"
"path/filepath"
"runtime"
+ "sort"
"strings"
"android/soong/android"
@@ -309,6 +310,7 @@
pathsInApex = append(pathsInApex, dirInApex)
}
}
+ sort.Strings(pathsInApex)
cannedFsConfig := android.PathForModuleOut(ctx, "canned_fs_config")
ctx.ModuleBuild(pctx, android.ModuleBuildParams{
Rule: generateFsConfig,
@@ -325,17 +327,22 @@
a.outputFile = android.PathForModuleOut(ctx, a.ModuleBase.Name()+apexSuffix)
- implicitInputs := []android.Path{}
+ filesToCopy := []android.Path{}
for file := range copyManifest {
- implicitInputs = append(implicitInputs, file)
+ filesToCopy = append(filesToCopy, file)
}
+ sort.Slice(filesToCopy, func(i, j int) bool {
+ return filesToCopy[i].String() < filesToCopy[j].String()
+ })
+
copyCommands := []string{}
- for src, dir := range copyManifest {
- dest := filepath.Join(dir, src.Base())
+ for _, src := range filesToCopy {
+ dest := filepath.Join(copyManifest[src], src.Base())
dest_path := filepath.Join(android.PathForModuleOut(ctx, "image").String(), dest)
copyCommands = append(copyCommands, "mkdir -p "+filepath.Dir(dest_path))
copyCommands = append(copyCommands, "cp "+src.String()+" "+dest_path)
}
+ implicitInputs := append(android.Paths(nil), filesToCopy...)
implicitInputs = append(implicitInputs, cannedFsConfig, manifest, fileContexts, key)
outHostBinDir := android.PathForOutput(ctx, "host", ctx.Config().PrebuiltOS(), "bin").String()
prebuiltSdkToolsBinDir := filepath.Join("prebuilts", "sdk", "tools", runtime.GOOS, "bin")