4133ce6912
This CL adds a new CONVERT_TO_BAZEL env var, and a bp2build goal. It reuses the queryview architecture, but registers no mutators before converting to BUILD files. This gives us a blank slate of the module graph to work with, and create a shadow/alternate pipeline of mutators to converge the Bazel BUILD graph to be semantically equivalent with the Android.bp graph (after apply its current set of mutators). The command to do so is: $ CONVERT_TO_BAZEL=true m bp2build To not clobber with queryview, the generated files are in out/soong/bp2build. Test: CONVERT_TO_BAZEL=true m bp2build && bazel query --config=bp2build //... Test: m queryview && bazel query --config=queryview //.. Test: soong tests Test: TH presubmit Fixes: 174465461 Signed-off-by: Jingwen Chen <jingwen@google.com> Change-Id: I4dd0ccc73abc345d70a50ca2803d6f400cd8c863
112 lines
4.1 KiB
Go
112 lines
4.1 KiB
Go
// Copyright 2020 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 android
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
|
|
"github.com/google/blueprint"
|
|
)
|
|
|
|
// The Bazel QueryView singleton is responsible for generating the Ninja actions
|
|
// for calling the soong_build primary builder in the main build.ninja file.
|
|
func init() {
|
|
RegisterSingletonType("bazel_queryview", BazelQueryViewSingleton)
|
|
RegisterSingletonType("bazel_converter", BazelConverterSingleton)
|
|
}
|
|
|
|
// BazelQueryViewSingleton is the singleton responsible for registering the
|
|
// soong_build build statement that will convert the Soong module graph after
|
|
// applying *all* mutators, enabing the feature to query the final state of the
|
|
// Soong graph. This mode is meant for querying the build graph state, and not meant
|
|
// for generating BUILD files to be checked in.
|
|
func BazelQueryViewSingleton() Singleton {
|
|
return &bazelQueryViewSingleton{}
|
|
}
|
|
|
|
// BazelConverterSingleton is the singleton responsible for registering the soong_build
|
|
// build statement that will convert the Soong module graph by applying an alternate
|
|
// pipeline of mutators, with the goal of reaching semantic equivalence between the original
|
|
// Blueprint and final BUILD files. Using this mode, the goal is to be able to
|
|
// build with these BUILD files directly in the source tree.
|
|
func BazelConverterSingleton() Singleton {
|
|
return &bazelConverterSingleton{}
|
|
}
|
|
|
|
type bazelQueryViewSingleton struct{}
|
|
type bazelConverterSingleton struct{}
|
|
|
|
func generateBuildActionsForBazelConversion(ctx SingletonContext, converterMode bool) {
|
|
name := "queryview"
|
|
additionalEnvVars := ""
|
|
descriptionTemplate := "[EXPERIMENTAL, PRE-PRODUCTION] Creating the Bazel QueryView workspace with %s at $outDir"
|
|
if converterMode {
|
|
name = "bp2build"
|
|
additionalEnvVars = "CONVERT_TO_BAZEL=true"
|
|
descriptionTemplate = "[EXPERIMENTAL, PRE-PRODUCTION] Converting all Android.bp to Bazel BUILD files with %s at $outDir"
|
|
}
|
|
|
|
// Create a build and rule statement, using the Bazel QueryView's WORKSPACE
|
|
// file as the output file marker.
|
|
var deps Paths
|
|
moduleListFilePath := pathForBuildToolDep(ctx, ctx.Config().moduleListFile)
|
|
deps = append(deps, moduleListFilePath)
|
|
deps = append(deps, pathForBuildToolDep(ctx, ctx.Config().ProductVariablesFileName))
|
|
|
|
bazelQueryViewDirectory := PathForOutput(ctx, name)
|
|
bazelQueryViewWorkspaceFile := bazelQueryViewDirectory.Join(ctx, "WORKSPACE")
|
|
primaryBuilder := primaryBuilderPath(ctx)
|
|
bazelQueryView := ctx.Rule(pctx, "bazelQueryView",
|
|
blueprint.RuleParams{
|
|
Command: fmt.Sprintf(
|
|
"rm -rf ${outDir}/* && "+
|
|
"%s %s --bazel_queryview_dir ${outDir} %s && "+
|
|
"echo WORKSPACE: `cat %s` > ${outDir}/.queryview-depfile.d",
|
|
additionalEnvVars,
|
|
primaryBuilder.String(),
|
|
strings.Join(os.Args[1:], " "),
|
|
moduleListFilePath.String(), // Use the contents of Android.bp.list as the depfile.
|
|
),
|
|
CommandDeps: []string{primaryBuilder.String()},
|
|
Description: fmt.Sprintf(
|
|
descriptionTemplate,
|
|
primaryBuilder.Base()),
|
|
Deps: blueprint.DepsGCC,
|
|
Depfile: "${outDir}/.queryview-depfile.d",
|
|
},
|
|
"outDir")
|
|
|
|
ctx.Build(pctx, BuildParams{
|
|
Rule: bazelQueryView,
|
|
Output: bazelQueryViewWorkspaceFile,
|
|
Inputs: deps,
|
|
Args: map[string]string{
|
|
"outDir": bazelQueryViewDirectory.String(),
|
|
},
|
|
})
|
|
|
|
// Add a phony target for generating the workspace
|
|
ctx.Phony(name, bazelQueryViewWorkspaceFile)
|
|
}
|
|
|
|
func (c *bazelQueryViewSingleton) GenerateBuildActions(ctx SingletonContext) {
|
|
generateBuildActionsForBazelConversion(ctx, false)
|
|
}
|
|
|
|
func (c *bazelConverterSingleton) GenerateBuildActions(ctx SingletonContext) {
|
|
generateBuildActionsForBazelConversion(ctx, true)
|
|
}
|