blob: c843a0fee1588aed78c203c2ba4148ac30de8dad [file] [log] [blame]
// 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)
}