dac90d33ca
In cases that we want to run blueprint-based builds in many configurations to verify all of the logic works without errors, but don't care about running the final ninja file, writing it out only wastes time and disk space. So add a --empty-ninja-file option that writes out an empty ninja file instead. Our specific use case (Soong's build_test / multiproduct_kati) runs Soong several hundred times for different configurations, and the ninja files are around 1GB, which leads to several hundred gigabytes of disk writes (and persistent use during incremental generation). Change-Id: I0198dfb2f744ce22284c05d5214dac2ab5dc9700
111 lines
3 KiB
Go
111 lines
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 (
|
|
"os"
|
|
"path/filepath"
|
|
"runtime"
|
|
"strings"
|
|
|
|
"github.com/google/blueprint"
|
|
)
|
|
|
|
func bootstrapVariable(name string, value func() string) blueprint.Variable {
|
|
return pctx.VariableFunc(name, func(config interface{}) (string, error) {
|
|
return value(), nil
|
|
})
|
|
}
|
|
|
|
var (
|
|
// These variables are the only configuration needed by the boostrap
|
|
// modules.
|
|
srcDir = bootstrapVariable("srcDir", func() string {
|
|
return SrcDir
|
|
})
|
|
buildDir = bootstrapVariable("buildDir", func() string {
|
|
return BuildDir
|
|
})
|
|
ninjaBuildDir = bootstrapVariable("ninjaBuildDir", func() string {
|
|
return NinjaBuildDir
|
|
})
|
|
goRoot = bootstrapVariable("goRoot", func() 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
|
|
})
|
|
compileCmd = bootstrapVariable("compileCmd", func() string {
|
|
return "$goRoot/pkg/tool/" + runtime.GOOS + "_" + runtime.GOARCH + "/compile"
|
|
})
|
|
linkCmd = bootstrapVariable("linkCmd", func() string {
|
|
return "$goRoot/pkg/tool/" + runtime.GOOS + "_" + runtime.GOARCH + "/link"
|
|
})
|
|
)
|
|
|
|
type ConfigInterface interface {
|
|
// GeneratingPrimaryBuilder should return true if this build invocation is
|
|
// creating a .bootstrap/build.ninja file to be used to build the
|
|
// primary builder
|
|
GeneratingPrimaryBuilder() 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() (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
|
|
)
|
|
|
|
type ConfigStopBefore interface {
|
|
StopBefore() StopBefore
|
|
}
|
|
|
|
type Stage int
|
|
|
|
const (
|
|
StagePrimary Stage = iota
|
|
StageMain
|
|
)
|
|
|
|
type Config struct {
|
|
stage Stage
|
|
|
|
topLevelBlueprintsFile string
|
|
|
|
emptyNinjaFile bool
|
|
runGoTests bool
|
|
moduleListFile string
|
|
}
|