e7945d76ac
We were previously setting GOROOT to "prebuilts/go/linux-x86" during the ninja executions when we were running Soong. But we can also run Soong during the main ninja execution, were GOROOT was unset. When the GOROOT was unset, the default GOROOT in our Go installation is "./prebuilts/go/linux-x86" (note the extra ./). This would cause g.bootstrap.goRoot to change between some soong runs, causing us to rebuild all go programs (and anything depending on them) more often than necessary. So instead, keep GOROOT undefined when running Soong. Everything that matters is using runtime.GOROOT(), which will fall back to the default. Continue setting $GOROOT for bootstrap.bash, otherwise it fails when there is no system provided go binary. What we give bootstrap.bash doesn't really matter, since we don't actually use the blueprint wrapper in Android. Test: m blueprint_tools; touch bionic/libc/tzcode/new.c; m blueprint_tools <doesn't rebuild everything> Change-Id: I82f30c7c3b5d25e5cbf28fe37a97fdb776c4a164
113 lines
3.5 KiB
Go
113 lines
3.5 KiB
Go
// Copyright 2017 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 build
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"strconv"
|
|
"time"
|
|
|
|
"github.com/google/blueprint/microfactory"
|
|
)
|
|
|
|
func runSoong(ctx Context, config Config) {
|
|
ctx.BeginTrace("soong")
|
|
defer ctx.EndTrace()
|
|
|
|
func() {
|
|
ctx.BeginTrace("blueprint bootstrap")
|
|
defer ctx.EndTrace()
|
|
|
|
cmd := Command(ctx, config, "blueprint bootstrap", "build/blueprint/bootstrap.bash", "-t")
|
|
cmd.Environment.Set("BLUEPRINTDIR", "./build/blueprint")
|
|
cmd.Environment.Set("BOOTSTRAP", "./build/blueprint/bootstrap.bash")
|
|
cmd.Environment.Set("BUILDDIR", config.SoongOutDir())
|
|
cmd.Environment.Set("GOROOT", "./"+filepath.Join("prebuilts/go", config.HostPrebuiltTag()))
|
|
cmd.Environment.Set("BLUEPRINT_LIST_FILE", filepath.Join(config.FileListDir(), "Android.bp.list"))
|
|
cmd.Environment.Set("NINJA_BUILDDIR", config.OutDir())
|
|
cmd.Environment.Set("SRCDIR", ".")
|
|
cmd.Environment.Set("TOPNAME", "Android.bp")
|
|
cmd.Sandbox = soongSandbox
|
|
cmd.Stdout = ctx.Stdout()
|
|
cmd.Stderr = ctx.Stderr()
|
|
cmd.RunOrFatal()
|
|
}()
|
|
|
|
func() {
|
|
ctx.BeginTrace("environment check")
|
|
defer ctx.EndTrace()
|
|
|
|
envFile := filepath.Join(config.SoongOutDir(), ".soong.environment")
|
|
envTool := filepath.Join(config.SoongOutDir(), ".bootstrap/bin/soong_env")
|
|
if _, err := os.Stat(envFile); err == nil {
|
|
if _, err := os.Stat(envTool); err == nil {
|
|
cmd := Command(ctx, config, "soong_env", envTool, envFile)
|
|
cmd.Sandbox = soongSandbox
|
|
cmd.Stdout = ctx.Stdout()
|
|
cmd.Stderr = ctx.Stderr()
|
|
if err := cmd.Run(); err != nil {
|
|
ctx.Verboseln("soong_env failed, forcing manifest regeneration")
|
|
os.Remove(envFile)
|
|
}
|
|
} else {
|
|
ctx.Verboseln("Missing soong_env tool, forcing manifest regeneration")
|
|
os.Remove(envFile)
|
|
}
|
|
} else if !os.IsNotExist(err) {
|
|
ctx.Fatalf("Failed to stat %f: %v", envFile, err)
|
|
}
|
|
}()
|
|
|
|
func() {
|
|
ctx.BeginTrace("minibp")
|
|
defer ctx.EndTrace()
|
|
|
|
var cfg microfactory.Config
|
|
cfg.Map("github.com/google/blueprint", "build/blueprint")
|
|
|
|
cfg.TrimPath = absPath(ctx, ".")
|
|
|
|
minibp := filepath.Join(config.SoongOutDir(), ".minibootstrap/minibp")
|
|
if _, err := microfactory.Build(&cfg, minibp, "github.com/google/blueprint/bootstrap/minibp"); err != nil {
|
|
ctx.Fatalln("Failed to build minibp:", err)
|
|
}
|
|
}()
|
|
|
|
ninja := func(name, file string) {
|
|
ctx.BeginTrace(name)
|
|
defer ctx.EndTrace()
|
|
|
|
cmd := Command(ctx, config, "soong "+name,
|
|
config.PrebuiltBuildTool("ninja"),
|
|
"-d", "keepdepfile",
|
|
"-w", "dupbuild=err",
|
|
"-j", strconv.Itoa(config.Parallel()),
|
|
"-f", filepath.Join(config.SoongOutDir(), file))
|
|
if config.IsVerbose() {
|
|
cmd.Args = append(cmd.Args, "-v")
|
|
}
|
|
cmd.Sandbox = soongSandbox
|
|
cmd.Stdin = ctx.Stdin()
|
|
cmd.Stdout = ctx.Stdout()
|
|
cmd.Stderr = ctx.Stderr()
|
|
|
|
defer ctx.ImportNinjaLog(filepath.Join(config.OutDir(), ".ninja_log"), time.Now())
|
|
cmd.RunOrFatal()
|
|
}
|
|
|
|
ninja("minibootstrap", ".minibootstrap/build.ninja")
|
|
ninja("bootstrap", ".bootstrap/build.ninja")
|
|
}
|