blob: 8f5fb115f075b0d1d2c325b23cb40876f696d086 [file] [log] [blame]
// 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(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 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
}
type ConfigRemoveAbandonedFilesUnder interface {
// RemoveAbandonedFilesUnder should return two slices:
// - a slice of path prefixes that will be cleaned of files that are no
// longer active targets, but are listed in the .ninja_log.
// - a slice of paths that are exempt from cleaning
RemoveAbandonedFilesUnder(buildDir string) (under, except []string)
}
type ConfigBlueprintToolLocation interface {
// BlueprintToolLocation can return a path name to install blueprint tools
// designed for end users (bpfmt, bpmodify, and anything else using
// blueprint_go_binary).
BlueprintToolLocation() string
}
type StopBefore int
const (
StopBeforePrepareBuildActions StopBefore = 1
StopBeforeWriteNinja StopBefore = 2
)
type ConfigStopBefore interface {
StopBefore() StopBefore
}
type Stage int
const (
StagePrimary Stage = iota
StageMain
)
type PrimaryBuilderInvocation struct {
Inputs []string
Outputs []string
Args []string
}
type Config struct {
stage Stage
topLevelBlueprintsFile string
subninjas []string
runGoTests bool
useValidations bool
primaryBuilderInvocations []PrimaryBuilderInvocation
}