diff --git a/Android.bp b/Android.bp index ef46002..669eb49 100644 --- a/Android.bp +++ b/Android.bp @@ -113,7 +113,6 @@ bootstrap_go_package { pkgPath: "github.com/google/blueprint/bootstrap", srcs: [ "bootstrap/bootstrap.go", - "bootstrap/cleanup.go", "bootstrap/command.go", "bootstrap/config.go", "bootstrap/glob.go", diff --git a/bootstrap/cleanup.go b/bootstrap/cleanup.go deleted file mode 100644 index ed3c630..0000000 --- a/bootstrap/cleanup.go +++ /dev/null @@ -1,177 +0,0 @@ -// Copyright 2014 Google Inc. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package bootstrap - -import ( - "bufio" - "errors" - "fmt" - "os" - "path/filepath" - "strings" - "syscall" - - "github.com/google/blueprint" -) - -const logFileName = ".ninja_log" - -// removeAbandonedFilesUnder removes any files that appear in the Ninja log, and -// are prefixed with one of the `under` entries, but that are not currently -// build targets, or in `exempt` -func removeAbandonedFilesUnder(ctx *blueprint.Context, - srcDir, buildDir string, under, exempt []string) error { - - if len(under) == 0 { - return nil - } - - outDir, err := ctx.OutDir() - if err != nil { - return err - } - - targetRules, err := ctx.AllTargets() - if err != nil { - return fmt.Errorf("error determining target list: %s", err) - } - - replacer := strings.NewReplacer( - "@@SrcDir@@", srcDir, - "@@BuildDir@@", buildDir) - outDir = replacer.Replace(outDir) - targets := make(map[string]bool) - for target := range targetRules { - replacedTarget := replacer.Replace(target) - targets[filepath.Clean(replacedTarget)] = true - } - for _, target := range exempt { - replacedTarget := replacer.Replace(target) - targets[filepath.Clean(replacedTarget)] = true - } - - filePaths, err := parseNinjaLog(outDir, under) - if err != nil { - return err - } - - for _, filePath := range filePaths { - isTarget := targets[filePath] - if !isTarget { - err = removeFileAndEmptyDirs(joinPath(ctx.SrcDir(), filePath)) - if err != nil { - return err - } - } - } - - return nil -} - -func parseNinjaLog(outDir string, under []string) ([]string, error) { - logFilePath := filepath.Join(outDir, logFileName) - logFile, err := os.Open(logFilePath) - if err != nil { - if os.IsNotExist(err) { - return nil, nil - } - return nil, err - } - defer logFile.Close() - - scanner := bufio.NewScanner(logFile) - - // Check that the first line indicates that this is a Ninja log version 5 - const expectedFirstLine = "# ninja log v5" - if !scanner.Scan() || scanner.Text() != expectedFirstLine { - return nil, errors.New("unrecognized ninja log format") - } - - var filePaths []string - for scanner.Scan() { - line := scanner.Text() - if strings.HasPrefix(line, "#") { - continue - } - - const fieldSeperator = "\t" - fields := strings.Split(line, fieldSeperator) - - const precedingFields = 3 - const followingFields = 1 - - if len(fields) < precedingFields+followingFields+1 { - return nil, fmt.Errorf("log entry has too few fields: %q", line) - } - - start := precedingFields - end := len(fields) - followingFields - filePath := strings.Join(fields[start:end], fieldSeperator) - - for _, dir := range under { - if strings.HasPrefix(filePath, dir) { - filePaths = append(filePaths, filePath) - break - } - } - } - if err := scanner.Err(); err != nil { - return nil, err - } - - return filePaths, nil -} - -func removeFileAndEmptyDirs(path string) error { - err := os.Remove(path) - if err != nil { - if os.IsNotExist(err) { - return nil - } - pathErr := err.(*os.PathError) - switch pathErr.Err { - case syscall.ENOTEMPTY, syscall.EEXIST, syscall.ENOTDIR: - return nil - } - return err - } - fmt.Printf("removed old ninja-created file %s because it has no rule to generate it\n", path) - - path, err = filepath.Abs(path) - if err != nil { - return err - } - - cwd, err := os.Getwd() - if err != nil { - return err - } - - for dir := filepath.Dir(path); dir != cwd; dir = filepath.Dir(dir) { - err = os.Remove(dir) - if err != nil { - pathErr := err.(*os.PathError) - switch pathErr.Err { - case syscall.ENOTEMPTY, syscall.EEXIST: - // We've come to a nonempty directory, so we're done. - return nil - default: - return err - } - } - } - - return nil -} diff --git a/bootstrap/command.go b/bootstrap/command.go index 010f28f..319fd6f 100644 --- a/bootstrap/command.go +++ b/bootstrap/command.go @@ -120,8 +120,6 @@ func RunBlueprint(args Args, ctx *blueprint.Context, config interface{}) []strin fatalf("could not enumerate files: %v\n", err.Error()) } - soongOutDir := config.(BootstrapConfig).SoongOutDir() - ctx.RegisterBottomUpMutator("bootstrap_plugin_deps", pluginDeps) ctx.RegisterModuleType("bootstrap_go_package", newGoPackageModuleFactory()) ctx.RegisterModuleType("blueprint_go_binary", newGoBinaryModuleFactory()) @@ -200,14 +198,6 @@ func RunBlueprint(args Args, ctx *blueprint.Context, config interface{}) []strin } } - if c, ok := config.(ConfigRemoveAbandonedFilesUnder); ok { - under, except := c.RemoveAbandonedFilesUnder(soongOutDir) - err := removeAbandonedFilesUnder(ctx, srcDir, soongOutDir, under, except) - if err != nil { - fatalf("error removing abandoned files: %s", err) - } - } - if args.Memprofile != "" { f, err := os.Create(joinPath(ctx.SrcDir(), args.Memprofile)) if err != nil { diff --git a/bootstrap/config.go b/bootstrap/config.go index 6d37eb5..bcfdcf9 100644 --- a/bootstrap/config.go +++ b/bootstrap/config.go @@ -99,14 +99,6 @@ type BootstrapConfig interface { PrimaryBuilderInvocations() []PrimaryBuilderInvocation } -type ConfigRemoveAbandonedFilesUnder interface { - // RemoveAbandonedFilesUnder should return two slices: - // - a slice of path prefixes that will be cleaned of files that are no - // longer active targets, but are listed in the .ninja_log. - // - a slice of paths that are exempt from cleaning - RemoveAbandonedFilesUnder(buildDir string) (under, except []string) -} - type StopBefore int const (