func Build(tid int, state *core.BuildState, label core.BuildLabel) { start := time.Now() target := state.Graph.TargetOrDie(label) target.SetState(core.Building) if err := buildTarget(tid, state, target); err != nil { if err == stopTarget { target.SetState(core.Stopped) state.LogBuildResult(tid, target.Label, core.TargetBuildStopped, "Build stopped") return } state.LogBuildError(tid, label, core.TargetBuildFailed, err, "Build failed: %s", err) if err := RemoveOutputs(target); err != nil { log.Errorf("Failed to remove outputs for %s: %s", target.Label, err) } target.SetState(core.Failed) return } metrics.Record(target, time.Since(start)) // Add any of the reverse deps that are now fully built to the queue. for _, reverseDep := range state.Graph.ReverseDependencies(target) { if reverseDep.State() == core.Active && state.Graph.AllDepsBuilt(reverseDep) && reverseDep.SyncUpdateState(core.Active, core.Pending) { state.AddPendingBuild(reverseDep.Label, false) } } if target.IsTest && state.NeedTests { state.AddPendingTest(target.Label) } parse.UndeferAnyParses(state, target) }