platform_build_blueprint/bootstrap/config.go
Dan Willemsen dac90d33ca Add --empty-ninja-file for test usecases
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
2018-10-26 09:57:24 -07:00

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
}