// Copyright 2022 Google LLC // // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. package exporter import ( "io" "go.skia.org/infra/go/skerr" "go.skia.org/infra/go/util" "go.skia.org/skia/bazel/exporter/build_proto/build" ) // cmakeRule represents the CMake equivalent to a Bazel rule. type cmakeRule struct { contents []byte // Data to be written to CMake file. deps []string // Names of Bazel targets (not files) on which this rule directly depends. rule *build.Rule // Holding pointer because struct contains a Mutex. } // newCMakeRule will create a new CMake rule object. func newCMakeRule(r *build.Rule) *cmakeRule { return &cmakeRule{rule: r} } // Return the rule name. func (r *cmakeRule) getName() string { return r.rule.GetName() } // Does this rule contain source dependencies? func (r *cmakeRule) hasSrcs() bool { srcs, _ := getRuleStringArrayAttribute(r.rule, "srcs") return len(srcs) > 0 } // Does this rule depend directly on a rule. func (r *cmakeRule) hasDependency(ruleName string) bool { return util.In(ruleName, r.deps) } // Add a rule dependency. func (r *cmakeRule) addDependency(ruleName string) error { if ruleName == "" { return skerr.Fmt("empty rule name") } if ruleName == r.getName() { return skerr.Fmt("rule cannot depend on self: %s", ruleName) } if r.hasDependency(ruleName) { return nil } // Trusting that circular dependencies are already fixed by Bazel. r.deps = append(r.deps, ruleName) return nil } // setContents will set the supplied chunk of a CMake project file to this // rules contents. func (r *cmakeRule) setContents(contents []byte) { r.contents = contents } // Write the contents for this rule using the supplied writer. // Returns the number of bytes written and error. func (r *cmakeRule) write(writer io.Writer) (int, error) { if len(r.contents) == 0 { return 0, skerr.Fmt("rule %s has no contents", r.getName()) } return writer.Write(r.contents) }