Avoid rewriting soong_build outputs if unchanged

This changes bp2build codegen, symlink forest generation, and
soong_build so that they do not rewrite output files if the contents are
unchanged.

Bug: 266983462
Test: m droid
Test: canonical_perf.sh benchmarking
Test: Manually verified that rerunning analysis did not regenerate
out/soong/workspace/prebuilts/sdk/BUILD.bazel unless contents changed

Change-Id: I5ec227df7a32b53c7fa0d741fb1403a51931024b
This commit is contained in:
Chris Parsons 2023-02-06 22:37:41 -05:00
parent 871109e91d
commit 1a12d03230
2 changed files with 10 additions and 19 deletions

View file

@ -16,7 +16,6 @@ package android
import (
"fmt"
"io/ioutil"
"os"
"path/filepath"
"reflect"
@ -2099,13 +2098,16 @@ func maybeRelErr(basePath string, targetPath string) (string, bool, error) {
// Writes a file to the output directory. Attempting to write directly to the output directory
// will fail due to the sandbox of the soong_build process.
// Only writes the file if the file doesn't exist or if it has different contents, to prevent
// updating the timestamp if no changes would be made. (This is better for incremental
// performance.)
func WriteFileToOutputDir(path WritablePath, data []byte, perm os.FileMode) error {
absPath := absolutePath(path.String())
err := os.MkdirAll(filepath.Dir(absPath), 0777)
if err != nil {
return err
}
return ioutil.WriteFile(absPath, data, perm)
return pathtools.WriteFileIfChanged(absPath, data, perm)
}
func RemoveAllOutputDir(path WritablePath) error {

View file

@ -25,6 +25,7 @@ import (
"sync/atomic"
"android/soong/shared"
"github.com/google/blueprint/pathtools"
)
// A tree structure that describes what to do at each directory in the created
@ -116,25 +117,13 @@ func mergeBuildFiles(output string, srcBuildFile string, generatedBuildFile stri
generatedBuildFileContent = packageDefaultVisibilityRegex.ReplaceAll(generatedBuildFileContent, []byte{})
}
outFile, err := os.Create(output)
if err != nil {
return err
newContents := generatedBuildFileContent
if newContents[len(newContents)-1] != '\n' {
newContents = append(newContents, '\n')
}
newContents = append(newContents, srcBuildFileContent...)
_, err = outFile.Write(generatedBuildFileContent)
if err != nil {
return err
}
if generatedBuildFileContent[len(generatedBuildFileContent)-1] != '\n' {
_, err = outFile.WriteString("\n")
if err != nil {
return err
}
}
_, err = outFile.Write(srcBuildFileContent)
return err
return pathtools.WriteFileIfChanged(output, newContents, 0666)
}
// Calls readdir() and returns it as a map from the basename of the files in dir