Refactor the creation of soong_build calls.
They were a bit repetitive. In addition, make the environment checks more correct; they could probably use an integration test or two to make sure that when the environment changes, exactly those outputs are rebuilt that need to be, but for now, this is an improvement already. Test: Presubmits. Change-Id: Idd79b81ca6975d57d00e5bf4699d266152505ff8
This commit is contained in:
@@ -37,6 +37,12 @@ import (
|
||||
const (
|
||||
availableEnvFile = "soong.environment.available"
|
||||
usedEnvFile = "soong.environment.used"
|
||||
|
||||
soongBuildTag = "build"
|
||||
bp2buildTag = "bp2build"
|
||||
jsonModuleGraphTag = "modulegraph"
|
||||
queryviewTag = "queryview"
|
||||
soongDocsTag = "soong_docs"
|
||||
)
|
||||
|
||||
func writeEnvironmentFile(ctx Context, envFile string, envDeps map[string]string) error {
|
||||
@@ -116,7 +122,7 @@ func (c BlueprintConfig) PrimaryBuilderInvocations() []bootstrap.PrimaryBuilderI
|
||||
func environmentArgs(config Config, suffix string) []string {
|
||||
return []string{
|
||||
"--available_env", shared.JoinPath(config.SoongOutDir(), availableEnvFile),
|
||||
"--used_env", shared.JoinPath(config.SoongOutDir(), usedEnvFile+suffix),
|
||||
"--used_env", shared.JoinPath(config.SoongOutDir(), usedEnvFile+"."+suffix),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -134,156 +140,135 @@ func writeEmptyGlobFile(ctx Context, path string) {
|
||||
}
|
||||
}
|
||||
|
||||
func primaryBuilderInvocation(config Config, name string, output string, specificArgs []string) bootstrap.PrimaryBuilderInvocation {
|
||||
commonArgs := make([]string, 0, 0)
|
||||
|
||||
if !config.skipSoongTests {
|
||||
commonArgs = append(commonArgs, "-t")
|
||||
}
|
||||
|
||||
commonArgs = append(commonArgs, "-l", filepath.Join(config.FileListDir(), "Android.bp.list"))
|
||||
|
||||
if os.Getenv("SOONG_DELVE") != "" {
|
||||
commonArgs = append(commonArgs, "--delve_listen", os.Getenv("SOONG_DELVE"))
|
||||
commonArgs = append(commonArgs, "--delve_path", shared.ResolveDelveBinary())
|
||||
}
|
||||
|
||||
allArgs := make([]string, 0, 0)
|
||||
allArgs = append(allArgs, specificArgs...)
|
||||
allArgs = append(allArgs,
|
||||
"--globListDir", name,
|
||||
"--globFile", config.NamedGlobFile(name))
|
||||
|
||||
allArgs = append(allArgs, commonArgs...)
|
||||
allArgs = append(allArgs, environmentArgs(config, name)...)
|
||||
allArgs = append(allArgs, "Android.bp")
|
||||
|
||||
return bootstrap.PrimaryBuilderInvocation{
|
||||
Inputs: []string{"Android.bp"},
|
||||
Outputs: []string{output},
|
||||
Args: allArgs,
|
||||
}
|
||||
}
|
||||
|
||||
func bootstrapBlueprint(ctx Context, config Config) {
|
||||
ctx.BeginTrace(metrics.RunSoong, "blueprint bootstrap")
|
||||
defer ctx.EndTrace()
|
||||
|
||||
var args bootstrap.Args
|
||||
|
||||
bootstrapGlobFile := shared.JoinPath(config.SoongOutDir(), ".bootstrap/build-globs.ninja")
|
||||
bp2buildGlobFile := shared.JoinPath(config.SoongOutDir(), ".bootstrap/build-globs.bp2build.ninja")
|
||||
queryviewGlobFile := shared.JoinPath(config.SoongOutDir(), ".bootstrap/build-globs.queryview.ninja")
|
||||
soongDocsGlobFile := shared.JoinPath(config.SoongOutDir(), ".bootstrap/build-globs.soong_docs.ninja")
|
||||
moduleGraphGlobFile := shared.JoinPath(config.SoongOutDir(), ".bootstrap/build-globs.modulegraph.ninja")
|
||||
|
||||
// The glob .ninja files are subninja'd. However, they are generated during
|
||||
// the build itself so we write an empty file so that the subninja doesn't
|
||||
// fail on clean builds
|
||||
writeEmptyGlobFile(ctx, bootstrapGlobFile)
|
||||
writeEmptyGlobFile(ctx, bp2buildGlobFile)
|
||||
writeEmptyGlobFile(ctx, queryviewGlobFile)
|
||||
writeEmptyGlobFile(ctx, soongDocsGlobFile)
|
||||
writeEmptyGlobFile(ctx, moduleGraphGlobFile)
|
||||
|
||||
bootstrapDepFile := shared.JoinPath(config.SoongOutDir(), ".bootstrap/build.ninja.d")
|
||||
|
||||
args.RunGoTests = !config.skipSoongTests
|
||||
args.UseValidations = true // Use validations to depend on tests
|
||||
args.SoongOutDir = config.SoongOutDir()
|
||||
args.OutDir = config.OutDir()
|
||||
args.ModuleListFile = filepath.Join(config.FileListDir(), "Android.bp.list")
|
||||
args.OutFile = shared.JoinPath(config.SoongOutDir(), ".bootstrap/build.ninja")
|
||||
// The primary builder (aka soong_build) will use bootstrapGlobFile as the globFile to generate build.ninja(.d)
|
||||
// Building soong_build does not require a glob file
|
||||
// Using "" instead of "<soong_build_glob>.ninja" will ensure that an unused glob file is not written to out/soong/.bootstrap during StagePrimary
|
||||
args.Subninjas = []string{bootstrapGlobFile, bp2buildGlobFile, moduleGraphGlobFile, queryviewGlobFile, soongDocsGlobFile}
|
||||
args.EmptyNinjaFile = config.EmptyNinjaFile()
|
||||
|
||||
args.DelveListen = os.Getenv("SOONG_DELVE")
|
||||
if args.DelveListen != "" {
|
||||
args.DelvePath = shared.ResolveDelveBinary()
|
||||
mainSoongBuildExtraArgs := []string{"-o", config.MainNinjaFile()}
|
||||
if config.EmptyNinjaFile() {
|
||||
mainSoongBuildExtraArgs = append(mainSoongBuildExtraArgs, "--empty-ninja-file")
|
||||
}
|
||||
|
||||
commonArgs := bootstrap.PrimaryBuilderExtraFlags(args, config.MainNinjaFile())
|
||||
mainSoongBuildInputs := []string{"Android.bp"}
|
||||
mainSoongBuildInvocation := primaryBuilderInvocation(
|
||||
config,
|
||||
soongBuildTag,
|
||||
config.MainNinjaFile(),
|
||||
mainSoongBuildExtraArgs)
|
||||
|
||||
if config.bazelBuildMode() == mixedBuild {
|
||||
mainSoongBuildInputs = append(mainSoongBuildInputs, config.Bp2BuildMarkerFile())
|
||||
// Mixed builds call Bazel from soong_build and they therefore need the
|
||||
// Bazel workspace to be available. Make that so by adding a dependency on
|
||||
// the bp2build marker file to the action that invokes soong_build .
|
||||
mainSoongBuildInvocation.Inputs = append(mainSoongBuildInvocation.Inputs,
|
||||
config.Bp2BuildMarkerFile())
|
||||
}
|
||||
|
||||
soongBuildArgs := []string{
|
||||
"--globListDir", "build",
|
||||
"--globFile", bootstrapGlobFile,
|
||||
bp2buildInvocation := primaryBuilderInvocation(
|
||||
config,
|
||||
bp2buildTag,
|
||||
config.Bp2BuildMarkerFile(),
|
||||
[]string{
|
||||
"--bp2build_marker", config.Bp2BuildMarkerFile(),
|
||||
})
|
||||
|
||||
jsonModuleGraphInvocation := primaryBuilderInvocation(
|
||||
config,
|
||||
jsonModuleGraphTag,
|
||||
config.ModuleGraphFile(),
|
||||
[]string{
|
||||
"--module_graph_file", config.ModuleGraphFile(),
|
||||
})
|
||||
|
||||
queryviewInvocation := primaryBuilderInvocation(
|
||||
config,
|
||||
queryviewTag,
|
||||
config.QueryviewMarkerFile(),
|
||||
[]string{
|
||||
"--bazel_queryview_dir", filepath.Join(config.SoongOutDir(), "queryview"),
|
||||
})
|
||||
|
||||
soongDocsInvocation := primaryBuilderInvocation(
|
||||
config,
|
||||
soongDocsTag,
|
||||
config.SoongDocsHtml(),
|
||||
[]string{
|
||||
"--soong_docs", config.SoongDocsHtml(),
|
||||
})
|
||||
|
||||
globFiles := []string{
|
||||
config.NamedGlobFile(soongBuildTag),
|
||||
config.NamedGlobFile(bp2buildTag),
|
||||
config.NamedGlobFile(jsonModuleGraphTag),
|
||||
config.NamedGlobFile(queryviewTag),
|
||||
config.NamedGlobFile(soongDocsTag),
|
||||
}
|
||||
|
||||
soongBuildArgs = append(soongBuildArgs, commonArgs...)
|
||||
soongBuildArgs = append(soongBuildArgs, environmentArgs(config, "")...)
|
||||
soongBuildArgs = append(soongBuildArgs, "Android.bp")
|
||||
|
||||
mainSoongBuildInvocation := bootstrap.PrimaryBuilderInvocation{
|
||||
Inputs: mainSoongBuildInputs,
|
||||
Outputs: []string{config.MainNinjaFile()},
|
||||
Args: soongBuildArgs,
|
||||
// The glob .ninja files are subninja'd. However, they are generated during
|
||||
// the build itself so we write an empty file if the file does not exist yet
|
||||
// so that the subninja doesn't fail on clean builds
|
||||
for _, globFile := range globFiles {
|
||||
writeEmptyGlobFile(ctx, globFile)
|
||||
}
|
||||
|
||||
bp2buildArgs := []string{
|
||||
"--bp2build_marker", config.Bp2BuildMarkerFile(),
|
||||
"--globListDir", "bp2build",
|
||||
"--globFile", bp2buildGlobFile,
|
||||
}
|
||||
var blueprintArgs bootstrap.Args
|
||||
|
||||
bp2buildArgs = append(bp2buildArgs, commonArgs...)
|
||||
bp2buildArgs = append(bp2buildArgs, environmentArgs(config, ".bp2build")...)
|
||||
bp2buildArgs = append(bp2buildArgs, "Android.bp")
|
||||
|
||||
bp2buildInvocation := bootstrap.PrimaryBuilderInvocation{
|
||||
Inputs: []string{"Android.bp"},
|
||||
Outputs: []string{config.Bp2BuildMarkerFile()},
|
||||
Args: bp2buildArgs,
|
||||
}
|
||||
|
||||
queryviewArgs := []string{
|
||||
"--bazel_queryview_dir", filepath.Join(config.SoongOutDir(), "queryview"),
|
||||
"--globListDir", "queryview",
|
||||
"--globFile", queryviewGlobFile,
|
||||
}
|
||||
|
||||
queryviewArgs = append(queryviewArgs, commonArgs...)
|
||||
queryviewArgs = append(queryviewArgs, environmentArgs(config, ".queryview")...)
|
||||
queryviewArgs = append(queryviewArgs, "Android.bp")
|
||||
|
||||
queryviewInvocation := bootstrap.PrimaryBuilderInvocation{
|
||||
Inputs: []string{"Android.bp"},
|
||||
Outputs: []string{config.QueryviewMarkerFile()},
|
||||
Args: queryviewArgs,
|
||||
}
|
||||
|
||||
soongDocsArgs := []string{
|
||||
"--soong_docs", config.SoongDocsHtml(),
|
||||
"--globListDir", "soong_docs",
|
||||
"--globFile", soongDocsGlobFile,
|
||||
}
|
||||
|
||||
soongDocsArgs = append(soongDocsArgs, commonArgs...)
|
||||
soongDocsArgs = append(soongDocsArgs, environmentArgs(config, ".soong_docs")...)
|
||||
soongDocsArgs = append(soongDocsArgs, "Android.bp")
|
||||
|
||||
soongDocsInvocation := bootstrap.PrimaryBuilderInvocation{
|
||||
Inputs: []string{"Android.bp"},
|
||||
Outputs: []string{config.SoongDocsHtml()},
|
||||
Args: soongDocsArgs,
|
||||
}
|
||||
|
||||
moduleGraphArgs := []string{
|
||||
"--module_graph_file", config.ModuleGraphFile(),
|
||||
"--globListDir", "modulegraph",
|
||||
"--globFile", moduleGraphGlobFile,
|
||||
}
|
||||
|
||||
moduleGraphArgs = append(moduleGraphArgs, commonArgs...)
|
||||
moduleGraphArgs = append(moduleGraphArgs, environmentArgs(config, ".modulegraph")...)
|
||||
moduleGraphArgs = append(moduleGraphArgs, "Android.bp")
|
||||
|
||||
moduleGraphInvocation := bootstrap.PrimaryBuilderInvocation{
|
||||
Inputs: []string{"Android.bp"},
|
||||
Outputs: []string{config.ModuleGraphFile()},
|
||||
Args: moduleGraphArgs,
|
||||
}
|
||||
|
||||
args.PrimaryBuilderInvocations = []bootstrap.PrimaryBuilderInvocation{
|
||||
bp2buildInvocation,
|
||||
mainSoongBuildInvocation,
|
||||
moduleGraphInvocation,
|
||||
queryviewInvocation,
|
||||
soongDocsInvocation,
|
||||
}
|
||||
blueprintArgs.ModuleListFile = filepath.Join(config.FileListDir(), "Android.bp.list")
|
||||
blueprintArgs.OutFile = shared.JoinPath(config.SoongOutDir(), ".bootstrap/build.ninja")
|
||||
blueprintArgs.EmptyNinjaFile = false
|
||||
|
||||
blueprintCtx := blueprint.NewContext()
|
||||
blueprintCtx.SetIgnoreUnknownModuleTypes(true)
|
||||
blueprintConfig := BlueprintConfig{
|
||||
soongOutDir: config.SoongOutDir(),
|
||||
toolDir: config.HostToolDir(),
|
||||
outDir: config.OutDir(),
|
||||
runGoTests: !config.skipSoongTests,
|
||||
useValidations: true,
|
||||
debugCompilation: os.Getenv("SOONG_DELVE") != "",
|
||||
subninjas: args.Subninjas,
|
||||
primaryBuilderInvocations: args.PrimaryBuilderInvocations,
|
||||
soongOutDir: config.SoongOutDir(),
|
||||
toolDir: config.HostToolDir(),
|
||||
outDir: config.OutDir(),
|
||||
runGoTests: !config.skipSoongTests,
|
||||
useValidations: !config.skipSoongTests,
|
||||
// If we want to debug soong_build, we need to compile it for debugging
|
||||
debugCompilation: os.Getenv("SOONG_DELVE") != "",
|
||||
subninjas: globFiles,
|
||||
primaryBuilderInvocations: []bootstrap.PrimaryBuilderInvocation{
|
||||
mainSoongBuildInvocation,
|
||||
bp2buildInvocation,
|
||||
jsonModuleGraphInvocation,
|
||||
queryviewInvocation,
|
||||
soongDocsInvocation},
|
||||
}
|
||||
|
||||
args.EmptyNinjaFile = false
|
||||
bootstrapDeps := bootstrap.RunBlueprint(args, bootstrap.DoEverything, blueprintCtx, blueprintConfig)
|
||||
err := deptools.WriteDepFile(bootstrapDepFile, args.OutFile, bootstrapDeps)
|
||||
bootstrapDeps := bootstrap.RunBlueprint(blueprintArgs, bootstrap.DoEverything, blueprintCtx, blueprintConfig)
|
||||
bootstrapDepFile := shared.JoinPath(config.SoongOutDir(), ".bootstrap/build.ninja.d")
|
||||
err := deptools.WriteDepFile(bootstrapDepFile, blueprintArgs.OutFile, bootstrapDeps)
|
||||
if err != nil {
|
||||
ctx.Fatalf("Error writing depfile '%s': %s", bootstrapDepFile, err)
|
||||
}
|
||||
@@ -343,12 +328,22 @@ func runSoong(ctx Context, config Config) {
|
||||
ctx.BeginTrace(metrics.RunSoong, "environment check")
|
||||
defer ctx.EndTrace()
|
||||
|
||||
soongBuildEnvFile := filepath.Join(config.SoongOutDir(), usedEnvFile)
|
||||
checkEnvironmentFile(soongBuildEnv, soongBuildEnvFile)
|
||||
checkEnvironmentFile(soongBuildEnv, filepath.Join(config.SoongOutDir(), usedEnvFile+".build"))
|
||||
|
||||
if integratedBp2Build {
|
||||
bp2buildEnvFile := filepath.Join(config.SoongOutDir(), usedEnvFile+".bp2build")
|
||||
checkEnvironmentFile(soongBuildEnv, bp2buildEnvFile)
|
||||
if integratedBp2Build || config.Bp2Build() {
|
||||
checkEnvironmentFile(soongBuildEnv, filepath.Join(config.SoongOutDir(), usedEnvFile+".bp2build"))
|
||||
}
|
||||
|
||||
if config.JsonModuleGraph() {
|
||||
checkEnvironmentFile(soongBuildEnv, filepath.Join(config.SoongOutDir(), usedEnvFile+".modulegraph"))
|
||||
}
|
||||
|
||||
if config.Queryview() {
|
||||
checkEnvironmentFile(soongBuildEnv, filepath.Join(config.SoongOutDir(), usedEnvFile+".queryview"))
|
||||
}
|
||||
|
||||
if config.SoongDocs() {
|
||||
checkEnvironmentFile(soongBuildEnv, filepath.Join(config.SoongOutDir(), usedEnvFile+".soong_docs"))
|
||||
}
|
||||
}()
|
||||
|
||||
|
Reference in New Issue
Block a user