// 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 c.SrcDir() }) buildDirVariable = bootstrapVariable("buildDir", func(c BootstrapConfig) string { return c.BuildDir() }) ninjaBuildDirVariable = bootstrapVariable("ninjaBuildDir", func(c BootstrapConfig) string { return c.NinjaBuildDir() }) 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 top-level directory of the source tree SrcDir() string // The directory where files emitted during bootstrapping are located. // Usually NinjaBuildDir() + "/soong". BuildDir() string // The output directory for the build. NinjaBuildDir() 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 globFile string runGoTests bool useValidations bool primaryBuilderInvocations []PrimaryBuilderInvocation }