func Main(ctx *blueprint.Context, config interface{}, extraNinjaFileDeps ...string) { if !flag.Parsed() { flag.Parse() } runtime.GOMAXPROCS(runtime.NumCPU()) if cpuprofile != "" { f, err := os.Create(cpuprofile) if err != nil { fatalf("error opening cpuprofile: %s", err) } pprof.StartCPUProfile(f) defer f.Close() defer pprof.StopCPUProfile() } if flag.NArg() != 1 { fatalf("no Blueprints file specified") } stage := StageMain if c, ok := config.(ConfigInterface); ok { if c.GeneratingBootstrapper() { stage = StageBootstrap } if c.GeneratingPrimaryBuilder() { stage = StagePrimary } } bootstrapConfig := &Config{ stage: stage, topLevelBlueprintsFile: flag.Arg(0), runGoTests: runGoTests, } ctx.RegisterModuleType("bootstrap_go_package", newGoPackageModuleFactory(bootstrapConfig)) ctx.RegisterModuleType("bootstrap_core_go_binary", newGoBinaryModuleFactory(bootstrapConfig, StageBootstrap)) ctx.RegisterModuleType("bootstrap_go_binary", newGoBinaryModuleFactory(bootstrapConfig, StagePrimary)) ctx.RegisterTopDownMutator("bootstrap_stage", propagateStageBootstrap) ctx.RegisterSingletonType("bootstrap", newSingletonFactory(bootstrapConfig)) deps, errs := ctx.ParseBlueprintsFiles(bootstrapConfig.topLevelBlueprintsFile) if len(errs) > 0 { fatalErrors(errs) } // Add extra ninja file dependencies deps = append(deps, extraNinjaFileDeps...) errs = ctx.ResolveDependencies(config) if len(errs) > 0 { fatalErrors(errs) } if docFile != "" { err := writeDocs(ctx, filepath.Dir(bootstrapConfig.topLevelBlueprintsFile), docFile) if err != nil { fatalErrors([]error{err}) } return } extraDeps, errs := ctx.PrepareBuildActions(config) if len(errs) > 0 { fatalErrors(errs) } deps = append(deps, extraDeps...) buf := bytes.NewBuffer(nil) err := ctx.WriteBuildFile(buf) if err != nil { fatalf("error generating Ninja file contents: %s", err) } const outFilePermissions = 0666 if timestampFile != "" { err := ioutil.WriteFile(timestampFile, []byte{}, outFilePermissions) if err != nil { fatalf("error writing %s: %s", timestampFile, err) } if timestampDepFile != "" { err := deptools.WriteDepFile(timestampDepFile, timestampFile, deps) if err != nil { fatalf("error writing depfile: %s", err) } } } err = ioutil.WriteFile(outFile, buf.Bytes(), outFilePermissions) if err != nil { fatalf("error writing %s: %s", outFile, err) } if depFile != "" { err := deptools.WriteDepFile(depFile, outFile, deps) if err != nil { fatalf("error writing depfile: %s", err) } err = deptools.WriteDepFile(depFile+".timestamp", outFile+".timestamp", deps) if err != nil { fatalf("error writing depfile: %s", err) } } srcDir := filepath.Dir(bootstrapConfig.topLevelBlueprintsFile) err = removeAbandonedFiles(ctx, bootstrapConfig, srcDir, manifestFile) if err != nil { fatalf("error removing abandoned files: %s", err) } }