74 lines
2.0 KiB
Go
74 lines
2.0 KiB
Go
// 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)
|
|
}
|