+func collectDeps(
+ tgt *Tgt,
+ level int,
+ deps map[string]map[string]*Tgt,
+ includeSrc bool,
+) []*Tgt {
+ if _, ok := DepCache[tgt.rel]; ok {
+ return nil
+ }
+ dep, err := depRead(tgt)
+ if err != nil {
+ return nil
+ }
+ DepCache[tgt.rel] = dep
+ var alwayses []*Tgt
+ returnReady := false
+ if dep.always {
+ if dep.build == BuildUUID {
+ tracef(CDebug, "ood: %s%s always, but already build",
+ strings.Repeat(". ", level), tgt)
+ returnReady = true
+ } else {
+ tracef(CDebug, "ood: %s%s always", strings.Repeat(". ", level), tgt)
+ alwayses = append(alwayses, tgt)
+ returnReady = true
+ }
+ }
+ for _, ifchange := range dep.ifchanges {
+ if ifchange.tgt.rel == tgt.rel {
+ continue
+ }
+ if !includeSrc && isSrc(ifchange.tgt) {
+ continue
+ }
+ if !returnReady {
+ if m, ok := deps[ifchange.tgt.rel]; ok {
+ m[tgt.rel] = tgt
+ } else {
+ deps[ifchange.tgt.rel] = map[string]*Tgt{tgt.rel: tgt}
+ }
+ alwayses = append(alwayses,
+ collectDeps(ifchange.tgt, level+1, deps, includeSrc)...)
+ }
+ }
+ return alwayses
+}