platform_build_blueprint/bootstrap/config.go
Cole Faust ef75beb068 Add implicit inputs to primary builder actions
This is needed so primary builder actions can directly depend on their
glob result files.

Bug: 318434287
Test: rm -rf out && m nothing && m nothing
Change-Id: I5c67ee53c9f18f81c79c0fe13b3338eacaccdbc0
2024-01-02 16:58:49 -08:00

116 lines
3.3 KiB
Go

// Copyright 2014 Google Inc. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package bootstrap
import (
"fmt"
"os"
"path/filepath"
"runtime"
"strings"
"github.com/google/blueprint"
)
func bootstrapVariable(name string, value func(BootstrapConfig) string) blueprint.Variable {
return pctx.VariableFunc(name, func(ctx blueprint.VariableFuncContext, config interface{}) (string, error) {
c, ok := config.(BootstrapConfig)
if !ok {
panic(fmt.Sprintf("Bootstrap rules were passed a configuration that does not include theirs, config=%q",
config))
}
return value(c), nil
})
}
var (
// These variables are the only configuration needed by the bootstrap
// modules.
srcDirVariable = bootstrapVariable("srcDir", func(c BootstrapConfig) string {
return "."
})
soongOutDirVariable = bootstrapVariable("soongOutDir", func(c BootstrapConfig) string {
return c.SoongOutDir()
})
outDirVariable = bootstrapVariable("outDir", func(c BootstrapConfig) string {
return c.OutDir()
})
goRootVariable = bootstrapVariable("goRoot", func(c BootstrapConfig) string {
goroot := runtime.GOROOT()
// Prefer to omit absolute paths from the ninja file
if cwd, err := os.Getwd(); err == nil {
if relpath, err := filepath.Rel(cwd, goroot); err == nil {
if !strings.HasPrefix(relpath, "../") {
goroot = relpath
}
}
}
return goroot
})
compileCmdVariable = bootstrapVariable("compileCmd", func(c BootstrapConfig) string {
return "$goRoot/pkg/tool/" + runtime.GOOS + "_" + runtime.GOARCH + "/compile"
})
linkCmdVariable = bootstrapVariable("linkCmd", func(c BootstrapConfig) string {
return "$goRoot/pkg/tool/" + runtime.GOOS + "_" + runtime.GOARCH + "/link"
})
debugFlagsVariable = bootstrapVariable("debugFlags", func(c BootstrapConfig) string {
if c.DebugCompilation() {
// -N: disable optimizations, -l: disable inlining
return "-N -l"
} else {
return ""
}
})
)
type BootstrapConfig interface {
// The directory where tools run during the build are located.
HostToolDir() string
// The directory where files emitted during bootstrapping are located.
// Usually OutDir() + "/soong".
SoongOutDir() string
// The output directory for the build.
OutDir() string
// Whether to compile Go code in such a way that it can be debugged
DebugCompilation() bool
// Whether to run tests for Go code
RunGoTests() bool
Subninjas() []string
PrimaryBuilderInvocations() []PrimaryBuilderInvocation
}
type StopBefore int
const (
DoEverything StopBefore = iota
StopBeforePrepareBuildActions
StopBeforeWriteNinja
)
type PrimaryBuilderInvocation struct {
Inputs []string
Implicits []string
OrderOnlyInputs []string
Outputs []string
Args []string
Console bool
Description string
Env map[string]string
}