diff --git a/bootstrap/command.go b/bootstrap/command.go index cc8888b..433bc59 100644 --- a/bootstrap/command.go +++ b/bootstrap/command.go @@ -55,43 +55,25 @@ type Args struct { } var ( - cmdline Args - absSrcDir string + CmdlineArgs Args + absSrcDir string ) -func CmdlineOutFile() string { - return cmdline.OutFile -} - -// Returns the build dir as parsed from the command line. This is necessary -// because even though these flags are defined here, soong_build accesses them. -// The plan is to move these flags to soong_build. -func CmdlineBuildDir() string { - return cmdline.BuildDir -} - -// Returns the module list file as parsed from the command line. This is necessary -// because even though these flags are defined here, soong_build accesses them. -// The plan is to move these flags to soong_build. -func CmdlineModuleListFile() string { - return cmdline.ModuleListFile -} - func init() { - flag.StringVar(&cmdline.OutFile, "o", "build.ninja", "the Ninja file to output") - flag.StringVar(&cmdline.GlobFile, "globFile", "build-globs.ninja", "the Ninja file of globs to output") - flag.StringVar(&cmdline.BuildDir, "b", ".", "the build output directory") - flag.StringVar(&cmdline.NinjaBuildDir, "n", "", "the ninja builddir directory") - flag.StringVar(&cmdline.DepFile, "d", "", "the dependency file to output") - flag.StringVar(&cmdline.DocFile, "docs", "", "build documentation file to output") - flag.StringVar(&cmdline.Cpuprofile, "cpuprofile", "", "write cpu profile to file") - flag.StringVar(&cmdline.TraceFile, "trace", "", "write trace to file") - flag.StringVar(&cmdline.Memprofile, "memprofile", "", "write memory profile to file") - flag.BoolVar(&cmdline.NoGC, "nogc", false, "turn off GC for debugging") - flag.BoolVar(&cmdline.RunGoTests, "t", false, "build and run go tests during bootstrap") - flag.BoolVar(&cmdline.UseValidations, "use-validations", false, "use validations to depend on go tests") - flag.StringVar(&cmdline.ModuleListFile, "l", "", "file that lists filepaths to parse") - flag.BoolVar(&cmdline.EmptyNinjaFile, "empty-ninja-file", false, "write out a 0-byte ninja file") + flag.StringVar(&CmdlineArgs.OutFile, "o", "build.ninja", "the Ninja file to output") + flag.StringVar(&CmdlineArgs.GlobFile, "globFile", "build-globs.ninja", "the Ninja file of globs to output") + flag.StringVar(&CmdlineArgs.BuildDir, "b", ".", "the build output directory") + flag.StringVar(&CmdlineArgs.NinjaBuildDir, "n", "", "the ninja builddir directory") + flag.StringVar(&CmdlineArgs.DepFile, "d", "", "the dependency file to output") + flag.StringVar(&CmdlineArgs.DocFile, "docs", "", "build documentation file to output") + flag.StringVar(&CmdlineArgs.Cpuprofile, "cpuprofile", "", "write cpu profile to file") + flag.StringVar(&CmdlineArgs.TraceFile, "trace", "", "write trace to file") + flag.StringVar(&CmdlineArgs.Memprofile, "memprofile", "", "write memory profile to file") + flag.BoolVar(&CmdlineArgs.NoGC, "nogc", false, "turn off GC for debugging") + flag.BoolVar(&CmdlineArgs.RunGoTests, "t", false, "build and run go tests during bootstrap") + flag.BoolVar(&CmdlineArgs.UseValidations, "use-validations", false, "use validations to depend on go tests") + flag.StringVar(&CmdlineArgs.ModuleListFile, "l", "", "file that lists filepaths to parse") + flag.BoolVar(&CmdlineArgs.EmptyNinjaFile, "empty-ninja-file", false, "write out a 0-byte ninja file") } func Main(ctx *blueprint.Context, config interface{}, generatingPrimaryBuilder bool, extraNinjaFileDeps ...string) { @@ -103,9 +85,13 @@ func Main(ctx *blueprint.Context, config interface{}, generatingPrimaryBuilder b fatalf("no Blueprints file specified") } - cmdline.TopFile = flag.Arg(0) - cmdline.GeneratingPrimaryBuilder = generatingPrimaryBuilder - RunBlueprint(cmdline, ctx, config, extraNinjaFileDeps...) + CmdlineArgs.TopFile = flag.Arg(0) + CmdlineArgs.GeneratingPrimaryBuilder = generatingPrimaryBuilder + deps := RunBlueprint(CmdlineArgs, ctx, config, extraNinjaFileDeps...) + err := deptools.WriteDepFile(CmdlineArgs.DepFile, CmdlineArgs.OutFile, deps) + if err != nil { + fatalf("Cannot write depfile '%s': %s", CmdlineArgs.DepFile, err) + } } func PrimaryBuilderExtraFlags(args Args, globFile, mainNinjaFile string) []string { @@ -147,7 +133,7 @@ func writeEmptyGlobFile(path string) { } } } -func RunBlueprint(args Args, ctx *blueprint.Context, config interface{}, extraNinjaFileDeps ...string) { +func RunBlueprint(args Args, ctx *blueprint.Context, config interface{}, extraNinjaFileDeps ...string) []string { runtime.GOMAXPROCS(runtime.NumCPU()) if args.NoGC { @@ -253,12 +239,12 @@ func RunBlueprint(args Args, ctx *blueprint.Context, config interface{}, extraNi if err != nil { fatalErrors([]error{err}) } - return + return nil } if c, ok := config.(ConfigStopBefore); ok { if c.StopBefore() == StopBeforePrepareBuildActions { - return + return deps } } @@ -270,7 +256,7 @@ func RunBlueprint(args Args, ctx *blueprint.Context, config interface{}, extraNi if c, ok := config.(ConfigStopBefore); ok { if c.StopBefore() == StopBeforeWriteNinja { - return + return deps } } @@ -308,13 +294,6 @@ func RunBlueprint(args Args, ctx *blueprint.Context, config interface{}, extraNi } } - if args.DepFile != "" { - err := deptools.WriteDepFile(absolutePath(args.DepFile), args.OutFile, deps) - if err != nil { - fatalf("error writing depfile: %s", err) - } - } - err = ctx.WriteBuildFile(out) if err != nil { fatalf("error writing Ninja file contents: %s", err) @@ -350,6 +329,8 @@ func RunBlueprint(args Args, ctx *blueprint.Context, config interface{}, extraNi defer f.Close() pprof.WriteHeapProfile(f) } + + return deps } func fatalf(format string, args ...interface{}) { diff --git a/bootstrap/glob.go b/bootstrap/glob.go index 00022ab..6131eee 100644 --- a/bootstrap/glob.go +++ b/bootstrap/glob.go @@ -121,7 +121,7 @@ func globSingletonFactory(ctx *blueprint.Context) func() blueprint.Singleton { func (s *globSingleton) GenerateBuildActions(ctx blueprint.SingletonContext) { for _, g := range s.globLister() { - fileListFile := filepath.Join(ctx.Config().(BootstrapConfig).BuildDir(), ".glob", g.Name) + fileListFile := g.FileListFile(ctx.Config().(BootstrapConfig).BuildDir()) if s.writeRule { // We need to write the file list here so that it has an older modified date diff --git a/bootstrap/minibp/main.go b/bootstrap/minibp/main.go index 00ba865..165f058 100644 --- a/bootstrap/minibp/main.go +++ b/bootstrap/minibp/main.go @@ -32,7 +32,7 @@ type Config struct { } func (c Config) SrcDir() string { - return bootstrap.CmdlineBuildDir() + return bootstrap.CmdlineArgs.BuildDir } func (c Config) RemoveAbandonedFilesUnder(buildDir string) (under, exempt []string) { diff --git a/glob.go b/glob.go index f32c967..67d060e 100644 --- a/glob.go +++ b/glob.go @@ -17,6 +17,7 @@ package blueprint import ( "crypto/md5" "fmt" + "path/filepath" "sort" "strings" @@ -28,6 +29,10 @@ type GlobPath struct { Name string } +func (g *GlobPath) FileListFile(buildDir string) string { + return filepath.Join(buildDir, ".glob", g.Name) +} + func verifyGlob(fileName, pattern string, excludes []string, g GlobPath) { if pattern != g.Pattern { panic(fmt.Errorf("Mismatched patterns %q and %q for glob file %q", pattern, g.Pattern, fileName))