Delete ApiBp2build soong_build mode
This feature is obsolete. This makes a large number of codepaths "dead code" (such as module-specific implementations of ApiBp2build functionality). These will be deleted in a followup CL. Bug: 284029211 Test: Presubmits Change-Id: Ib53b99f1fe8c24380d219caf44e9bb3b96724fa0
This commit is contained in:
parent
079efbda94
commit
73f411b72c
16 changed files with 8 additions and 642 deletions
|
@ -510,12 +510,6 @@ func (b *BazelModuleBase) shouldConvertWithBp2build(ctx shouldConvertModuleConte
|
|||
}
|
||||
|
||||
module := p.module
|
||||
// In api_bp2build mode, all soong modules that can provide API contributions should be converted
|
||||
// This is irrespective of its presence/absence in bp2build allowlists
|
||||
if ctx.Config().BuildMode == ApiBp2build {
|
||||
_, providesApis := module.(ApiProvider)
|
||||
return providesApis
|
||||
}
|
||||
|
||||
propValue := b.bazelProperties.Bazel_module.Bp2build_available
|
||||
packagePath := moduleDirWithPossibleOverride(ctx, module, p.moduleDir)
|
||||
|
|
|
@ -87,7 +87,6 @@ type CmdArgs struct {
|
|||
SymlinkForestMarker string
|
||||
Bp2buildMarker string
|
||||
BazelQueryViewDir string
|
||||
BazelApiBp2buildDir string
|
||||
ModuleGraphFile string
|
||||
ModuleActionsFile string
|
||||
DocFile string
|
||||
|
@ -121,9 +120,6 @@ const (
|
|||
// express build semantics.
|
||||
GenerateQueryView
|
||||
|
||||
// Generate BUILD files for API contributions to API surfaces
|
||||
ApiBp2build
|
||||
|
||||
// Create a JSON representation of the module graph and exit.
|
||||
GenerateModuleGraph
|
||||
|
||||
|
@ -641,7 +637,6 @@ func NewConfig(cmdArgs CmdArgs, availableEnv map[string]string) (Config, error)
|
|||
setBuildMode(cmdArgs.SymlinkForestMarker, SymlinkForest)
|
||||
setBuildMode(cmdArgs.Bp2buildMarker, Bp2build)
|
||||
setBuildMode(cmdArgs.BazelQueryViewDir, GenerateQueryView)
|
||||
setBuildMode(cmdArgs.BazelApiBp2buildDir, ApiBp2build)
|
||||
setBuildMode(cmdArgs.ModuleGraphFile, GenerateModuleGraph)
|
||||
setBuildMode(cmdArgs.DocFile, GenerateDocFile)
|
||||
setBazelMode(cmdArgs.BazelMode, "--bazel-mode", BazelProdMode)
|
||||
|
|
|
@ -197,13 +197,6 @@ func (ctx *Context) RegisterForBazelConversion() {
|
|||
RegisterMutatorsForBazelConversion(ctx, bp2buildPreArchMutators)
|
||||
}
|
||||
|
||||
// RegisterForApiBazelConversion is similar to RegisterForBazelConversion except that
|
||||
// it only generates API targets in the generated workspace
|
||||
func (ctx *Context) RegisterForApiBazelConversion() {
|
||||
registerModuleTypes(ctx)
|
||||
RegisterMutatorsForApiBazelConversion(ctx, bp2buildPreArchMutators)
|
||||
}
|
||||
|
||||
// Register the pipeline of singletons, module types, and mutators for
|
||||
// generating build.ninja and other files for Kati, from Android.bp files.
|
||||
func (ctx *Context) Register() {
|
||||
|
|
|
@ -467,12 +467,6 @@ func (ctx *TestContext) RegisterForBazelConversion() {
|
|||
RegisterMutatorsForBazelConversion(ctx.Context, ctx.bp2buildPreArch)
|
||||
}
|
||||
|
||||
// RegisterForApiBazelConversion prepares a test context for API bp2build conversion.
|
||||
func (ctx *TestContext) RegisterForApiBazelConversion() {
|
||||
ctx.config.BuildMode = ApiBp2build
|
||||
RegisterMutatorsForApiBazelConversion(ctx.Context, ctx.bp2buildPreArch)
|
||||
}
|
||||
|
||||
func (ctx *TestContext) ParseFileList(rootDir string, filePaths []string) (deps []string, errs []error) {
|
||||
// This function adapts the old style ParseFileList calls that are spread throughout the tests
|
||||
// to the new style that takes a config.
|
||||
|
|
|
@ -61,7 +61,6 @@ bootstrap_go_package {
|
|||
"cc_test_conversion_test.go",
|
||||
"cc_yasm_conversion_test.go",
|
||||
"conversion_test.go",
|
||||
"droidstubs_conversion_test.go",
|
||||
"filegroup_conversion_test.go",
|
||||
"genrule_conversion_test.go",
|
||||
"gensrcs_conversion_test.go",
|
||||
|
|
|
@ -175,9 +175,6 @@ const (
|
|||
// This mode is used for discovering and introspecting the existing Soong
|
||||
// module graph.
|
||||
QueryView
|
||||
|
||||
// ApiBp2build - generate BUILD files for API contribution targets
|
||||
ApiBp2build
|
||||
)
|
||||
|
||||
type unconvertedDepsMode int
|
||||
|
@ -196,8 +193,6 @@ func (mode CodegenMode) String() string {
|
|||
return "Bp2Build"
|
||||
case QueryView:
|
||||
return "QueryView"
|
||||
case ApiBp2build:
|
||||
return "ApiBp2build"
|
||||
default:
|
||||
return fmt.Sprintf("%d", mode)
|
||||
}
|
||||
|
@ -774,10 +769,6 @@ func GenerateBazelTargets(ctx *CodegenContext, generateFilegroups bool) (convers
|
|||
errs = append(errs, err)
|
||||
}
|
||||
targets = append(targets, t)
|
||||
case ApiBp2build:
|
||||
if aModule, ok := m.(android.Module); ok && aModule.IsConvertedByBp2build() {
|
||||
targets, errs = generateBazelTargets(bpCtx, aModule)
|
||||
}
|
||||
default:
|
||||
errs = append(errs, fmt.Errorf("Unknown code-generation mode: %s", ctx.Mode()))
|
||||
return
|
||||
|
|
|
@ -1879,30 +1879,6 @@ filegroup {
|
|||
})
|
||||
}
|
||||
|
||||
func TestGenerateApiBazelTargets(t *testing.T) {
|
||||
bp := `
|
||||
custom {
|
||||
name: "foo",
|
||||
api: "foo.txt",
|
||||
}
|
||||
`
|
||||
expectedBazelTarget := MakeBazelTarget(
|
||||
"custom_api_contribution",
|
||||
"foo",
|
||||
AttrNameToString{
|
||||
"api": `"foo.txt"`,
|
||||
},
|
||||
)
|
||||
registerCustomModule := func(ctx android.RegistrationContext) {
|
||||
ctx.RegisterModuleType("custom", customModuleFactoryHostAndDevice)
|
||||
}
|
||||
RunApiBp2BuildTestCase(t, registerCustomModule, Bp2buildTestCase{
|
||||
Blueprint: bp,
|
||||
ExpectedBazelTargets: []string{expectedBazelTarget},
|
||||
Description: "Generating API contribution Bazel targets for custom module",
|
||||
})
|
||||
}
|
||||
|
||||
func TestGenerateConfigSetting(t *testing.T) {
|
||||
bp := `
|
||||
custom {
|
||||
|
|
|
@ -2839,205 +2839,6 @@ cc_library {
|
|||
)
|
||||
}
|
||||
|
||||
func TestCcApiContributionsWithHdrs(t *testing.T) {
|
||||
bp := `
|
||||
cc_library {
|
||||
name: "libfoo",
|
||||
stubs: { symbol_file: "libfoo.map.txt", versions: ["28", "29", "current"] },
|
||||
llndk: { symbol_file: "libfoo.map.txt", override_export_include_dirs: ["dir2"]},
|
||||
export_include_dirs: ["dir1"],
|
||||
}
|
||||
`
|
||||
expectedBazelTargets := []string{
|
||||
MakeBazelTarget(
|
||||
"cc_api_library_headers",
|
||||
"libfoo.module-libapi.headers",
|
||||
AttrNameToString{
|
||||
"export_includes": `["dir1"]`,
|
||||
}),
|
||||
MakeBazelTarget(
|
||||
"cc_api_library_headers",
|
||||
"libfoo.vendorapi.headers",
|
||||
AttrNameToString{
|
||||
"export_includes": `["dir2"]`,
|
||||
}),
|
||||
MakeBazelTarget(
|
||||
"cc_api_contribution",
|
||||
"libfoo.contribution",
|
||||
AttrNameToString{
|
||||
"api": `"libfoo.map.txt"`,
|
||||
"library_name": `"libfoo"`,
|
||||
"api_surfaces": `[
|
||||
"module-libapi",
|
||||
"vendorapi",
|
||||
]`,
|
||||
"hdrs": `[
|
||||
":libfoo.module-libapi.headers",
|
||||
":libfoo.vendorapi.headers",
|
||||
]`,
|
||||
}),
|
||||
}
|
||||
RunApiBp2BuildTestCase(t, cc.RegisterLibraryBuildComponents, Bp2buildTestCase{
|
||||
Blueprint: bp,
|
||||
Description: "cc API contributions to module-libapi and vendorapi",
|
||||
ExpectedBazelTargets: expectedBazelTargets,
|
||||
})
|
||||
}
|
||||
|
||||
func TestCcApiSurfaceCombinations(t *testing.T) {
|
||||
testCases := []struct {
|
||||
bp string
|
||||
expectedApi string
|
||||
expectedApiSurfaces string
|
||||
description string
|
||||
}{
|
||||
{
|
||||
bp: `
|
||||
cc_library {
|
||||
name: "a",
|
||||
stubs: {symbol_file: "a.map.txt"},
|
||||
}`,
|
||||
expectedApi: `"a.map.txt"`,
|
||||
expectedApiSurfaces: `["module-libapi"]`,
|
||||
description: "Library that contributes to module-libapi",
|
||||
},
|
||||
{
|
||||
bp: `
|
||||
cc_library {
|
||||
name: "a",
|
||||
llndk: {symbol_file: "a.map.txt"},
|
||||
}`,
|
||||
expectedApi: `"a.map.txt"`,
|
||||
expectedApiSurfaces: `["vendorapi"]`,
|
||||
description: "Library that contributes to vendorapi",
|
||||
},
|
||||
{
|
||||
bp: `
|
||||
cc_library {
|
||||
name: "a",
|
||||
llndk: {symbol_file: "a.map.txt"},
|
||||
stubs: {symbol_file: "a.map.txt"},
|
||||
}`,
|
||||
expectedApi: `"a.map.txt"`,
|
||||
expectedApiSurfaces: `[
|
||||
"module-libapi",
|
||||
"vendorapi",
|
||||
]`,
|
||||
description: "Library that contributes to module-libapi and vendorapi",
|
||||
},
|
||||
}
|
||||
for _, testCase := range testCases {
|
||||
expectedBazelTargets := []string{
|
||||
MakeBazelTarget(
|
||||
"cc_api_contribution",
|
||||
"a.contribution",
|
||||
AttrNameToString{
|
||||
"library_name": `"a"`,
|
||||
"hdrs": `[]`,
|
||||
"api": testCase.expectedApi,
|
||||
"api_surfaces": testCase.expectedApiSurfaces,
|
||||
},
|
||||
),
|
||||
}
|
||||
RunApiBp2BuildTestCase(t, cc.RegisterLibraryBuildComponents, Bp2buildTestCase{
|
||||
Blueprint: testCase.bp,
|
||||
Description: testCase.description,
|
||||
ExpectedBazelTargets: expectedBazelTargets,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// llndk struct property in Soong provides users with several options to configure the exported include dirs
|
||||
// Test the generated bazel targets for the different configurations
|
||||
func TestCcVendorApiHeaders(t *testing.T) {
|
||||
testCases := []struct {
|
||||
bp string
|
||||
expectedIncludes string
|
||||
expectedSystemIncludes string
|
||||
description string
|
||||
}{
|
||||
{
|
||||
bp: `
|
||||
cc_library {
|
||||
name: "a",
|
||||
export_include_dirs: ["include"],
|
||||
export_system_include_dirs: ["base_system_include"],
|
||||
llndk: {
|
||||
symbol_file: "a.map.txt",
|
||||
export_headers_as_system: true,
|
||||
},
|
||||
}
|
||||
`,
|
||||
expectedIncludes: "",
|
||||
expectedSystemIncludes: `[
|
||||
"base_system_include",
|
||||
"include",
|
||||
]`,
|
||||
description: "Headers are exported as system to API surface",
|
||||
},
|
||||
{
|
||||
bp: `
|
||||
cc_library {
|
||||
name: "a",
|
||||
export_include_dirs: ["include"],
|
||||
export_system_include_dirs: ["base_system_include"],
|
||||
llndk: {
|
||||
symbol_file: "a.map.txt",
|
||||
override_export_include_dirs: ["llndk_include"],
|
||||
},
|
||||
}
|
||||
`,
|
||||
expectedIncludes: `["llndk_include"]`,
|
||||
expectedSystemIncludes: `["base_system_include"]`,
|
||||
description: "Non-system Headers are ovverriden before export to API surface",
|
||||
},
|
||||
{
|
||||
bp: `
|
||||
cc_library {
|
||||
name: "a",
|
||||
export_include_dirs: ["include"],
|
||||
export_system_include_dirs: ["base_system_include"],
|
||||
llndk: {
|
||||
symbol_file: "a.map.txt",
|
||||
override_export_include_dirs: ["llndk_include"],
|
||||
export_headers_as_system: true,
|
||||
},
|
||||
}
|
||||
`,
|
||||
expectedIncludes: "", // includes are set to nil
|
||||
expectedSystemIncludes: `[
|
||||
"base_system_include",
|
||||
"llndk_include",
|
||||
]`,
|
||||
description: "System Headers are extended before export to API surface",
|
||||
},
|
||||
}
|
||||
for _, testCase := range testCases {
|
||||
attrs := AttrNameToString{}
|
||||
if testCase.expectedIncludes != "" {
|
||||
attrs["export_includes"] = testCase.expectedIncludes
|
||||
}
|
||||
if testCase.expectedSystemIncludes != "" {
|
||||
attrs["export_system_includes"] = testCase.expectedSystemIncludes
|
||||
}
|
||||
|
||||
expectedBazelTargets := []string{
|
||||
MakeBazelTarget("cc_api_library_headers", "a.vendorapi.headers", attrs),
|
||||
// Create a target for cc_api_contribution target
|
||||
MakeBazelTarget("cc_api_contribution", "a.contribution", AttrNameToString{
|
||||
"api": `"a.map.txt"`,
|
||||
"api_surfaces": `["vendorapi"]`,
|
||||
"hdrs": `[":a.vendorapi.headers"]`,
|
||||
"library_name": `"a"`,
|
||||
}),
|
||||
}
|
||||
RunApiBp2BuildTestCase(t, cc.RegisterLibraryBuildComponents, Bp2buildTestCase{
|
||||
Blueprint: testCase.bp,
|
||||
ExpectedBazelTargets: expectedBazelTargets,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestCcLibraryStubsAcrossConfigsDuplicatesRemoved(t *testing.T) {
|
||||
runCcLibraryTestCase(t, Bp2buildTestCase{
|
||||
Description: "stub target generation of the same lib across configs should not result in duplicates",
|
||||
|
|
|
@ -123,69 +123,6 @@ cc_library_headers {
|
|||
})
|
||||
}
|
||||
|
||||
func TestCcApiHeaders(t *testing.T) {
|
||||
fs := map[string]string{
|
||||
"bar/Android.bp": `cc_library_headers { name: "bar_headers", }`,
|
||||
}
|
||||
bp := `
|
||||
cc_library_headers {
|
||||
name: "foo_headers",
|
||||
export_include_dirs: ["dir1", "dir2"],
|
||||
export_header_lib_headers: ["bar_headers"],
|
||||
|
||||
arch: {
|
||||
arm: {
|
||||
export_include_dirs: ["dir_arm"],
|
||||
},
|
||||
x86: {
|
||||
export_include_dirs: ["dir_x86"],
|
||||
},
|
||||
},
|
||||
|
||||
target: {
|
||||
android: {
|
||||
export_include_dirs: ["dir1", "dir_android"],
|
||||
},
|
||||
windows: {
|
||||
export_include_dirs: ["dir_windows"],
|
||||
},
|
||||
}
|
||||
}
|
||||
`
|
||||
expectedBazelTargets := []string{
|
||||
MakeBazelTarget("cc_api_library_headers", "foo_headers.contribution.arm", AttrNameToString{
|
||||
"export_includes": `["dir_arm"]`,
|
||||
"arch": `"arm"`,
|
||||
}),
|
||||
MakeBazelTarget("cc_api_library_headers", "foo_headers.contribution.x86", AttrNameToString{
|
||||
"export_includes": `["dir_x86"]`,
|
||||
"arch": `"x86"`,
|
||||
}),
|
||||
MakeBazelTarget("cc_api_library_headers", "foo_headers.contribution.androidos", AttrNameToString{
|
||||
"export_includes": `["dir_android"]`, // common includes are deduped
|
||||
}),
|
||||
// Windows headers are not exported
|
||||
MakeBazelTarget("cc_api_library_headers", "foo_headers.contribution", AttrNameToString{
|
||||
"export_includes": `[
|
||||
"dir1",
|
||||
"dir2",
|
||||
]`,
|
||||
"deps": `[
|
||||
"//bar:bar_headers.contribution",
|
||||
":foo_headers.contribution.arm",
|
||||
":foo_headers.contribution.x86",
|
||||
":foo_headers.contribution.androidos",
|
||||
]`,
|
||||
}),
|
||||
}
|
||||
RunApiBp2BuildTestCase(t, cc.RegisterLibraryHeadersBuildComponents, Bp2buildTestCase{
|
||||
Blueprint: bp,
|
||||
Description: "Header library contributions to API surfaces",
|
||||
ExpectedBazelTargets: expectedBazelTargets,
|
||||
Filesystem: fs,
|
||||
})
|
||||
}
|
||||
|
||||
// header_libs has "variant_prepend" tag. In bp2build output,
|
||||
// variant info(select) should go before general info.
|
||||
func TestCcLibraryHeadersOsSpecificHeader(t *testing.T) {
|
||||
|
|
|
@ -145,7 +145,7 @@ func createBuildFiles(buildToTargets map[string]BazelTargets, mode CodegenMode)
|
|||
targets.sort()
|
||||
|
||||
var content string
|
||||
if mode == Bp2Build || mode == ApiBp2build {
|
||||
if mode == Bp2Build {
|
||||
content = `# READ THIS FIRST:
|
||||
# This file was automatically generated by bp2build for the Bazel migration project.
|
||||
# Feel free to edit or test it, but do *not* check it into your version control system.
|
||||
|
|
|
@ -1,104 +0,0 @@
|
|||
// Copyright 2022 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 bp2build
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"android/soong/android"
|
||||
"android/soong/java"
|
||||
)
|
||||
|
||||
func registerJavaApiModules(ctx android.RegistrationContext) {
|
||||
java.RegisterSdkLibraryBuildComponents(ctx)
|
||||
java.RegisterStubsBuildComponents(ctx)
|
||||
}
|
||||
|
||||
func TestDroidstubsApiContributions(t *testing.T) {
|
||||
bp := `
|
||||
droidstubs {
|
||||
name: "framework-stubs",
|
||||
check_api: {
|
||||
current: {
|
||||
api_file: "framework.current.txt",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
// Modules without check_api should not generate a Bazel API target
|
||||
droidstubs {
|
||||
name: "framework-docs",
|
||||
}
|
||||
|
||||
// java_sdk_library is a macro that creates droidstubs
|
||||
java_sdk_library {
|
||||
name: "module-stubs",
|
||||
srcs: ["A.java"],
|
||||
|
||||
// These api surfaces are added by default, but add them explicitly to make
|
||||
// this test hermetic
|
||||
public: {
|
||||
enabled: true,
|
||||
},
|
||||
system: {
|
||||
enabled: true,
|
||||
},
|
||||
|
||||
// Disable other api surfaces to keep unit test scope limited
|
||||
module_lib: {
|
||||
enabled: false,
|
||||
},
|
||||
test: {
|
||||
enabled: false,
|
||||
},
|
||||
}
|
||||
`
|
||||
expectedBazelTargets := []string{
|
||||
MakeBazelTargetNoRestrictions(
|
||||
"java_api_contribution",
|
||||
"framework-stubs.contribution",
|
||||
AttrNameToString{
|
||||
"api": `"framework.current.txt"`,
|
||||
"api_surface": `"publicapi"`,
|
||||
"target_compatible_with": `["//build/bazel/platforms/os:android"]`,
|
||||
}),
|
||||
MakeBazelTargetNoRestrictions(
|
||||
"java_api_contribution",
|
||||
"module-stubs.stubs.source.contribution",
|
||||
AttrNameToString{
|
||||
"api": `"api/current.txt"`,
|
||||
"api_surface": `"publicapi"`,
|
||||
"target_compatible_with": `["//build/bazel/platforms/os:android"]`,
|
||||
}),
|
||||
MakeBazelTargetNoRestrictions(
|
||||
"java_api_contribution",
|
||||
"module-stubs.stubs.source.system.contribution",
|
||||
AttrNameToString{
|
||||
"api": `"api/system-current.txt"`,
|
||||
"api_surface": `"systemapi"`,
|
||||
"target_compatible_with": `["//build/bazel/platforms/os:android"]`,
|
||||
}),
|
||||
}
|
||||
RunApiBp2BuildTestCase(t, registerJavaApiModules, Bp2buildTestCase{
|
||||
Blueprint: bp,
|
||||
ExpectedBazelTargets: expectedBazelTargets,
|
||||
Filesystem: map[string]string{
|
||||
"api/current.txt": "",
|
||||
"api/removed.txt": "",
|
||||
"api/system-current.txt": "",
|
||||
"api/system-removed.txt": "",
|
||||
},
|
||||
})
|
||||
}
|
|
@ -108,15 +108,6 @@ func RunBp2BuildTestCase(t *testing.T, registerModuleTypes func(ctx android.Regi
|
|||
runBp2BuildTestCaseWithSetup(t, bp2buildSetup, tc)
|
||||
}
|
||||
|
||||
func RunApiBp2BuildTestCase(t *testing.T, registerModuleTypes func(ctx android.RegistrationContext), tc Bp2buildTestCase) {
|
||||
t.Helper()
|
||||
apiBp2BuildSetup := android.GroupFixturePreparers(
|
||||
android.FixtureRegisterWithContext(registerModuleTypes),
|
||||
SetApiBp2BuildTestRunner,
|
||||
)
|
||||
runBp2BuildTestCaseWithSetup(t, apiBp2BuildSetup, tc)
|
||||
}
|
||||
|
||||
func runBp2BuildTestCaseWithSetup(t *testing.T, extraPreparer android.FixturePreparer, tc Bp2buildTestCase) {
|
||||
t.Helper()
|
||||
dir := "."
|
||||
|
@ -180,27 +171,14 @@ func runBp2BuildTestCaseWithSetup(t *testing.T, extraPreparer android.FixturePre
|
|||
}
|
||||
|
||||
// SetBp2BuildTestRunner customizes the test fixture mechanism to run tests in Bp2Build mode.
|
||||
var SetBp2BuildTestRunner = android.FixtureSetTestRunner(&bazelTestRunner{Bp2Build})
|
||||
var SetBp2BuildTestRunner = android.FixtureSetTestRunner(&bazelTestRunner{})
|
||||
|
||||
// SetApiBp2BuildTestRunner customizes the test fixture mechanism to run tests in ApiBp2build mode.
|
||||
var SetApiBp2BuildTestRunner = android.FixtureSetTestRunner(&bazelTestRunner{ApiBp2build})
|
||||
|
||||
// bazelTestRunner customizes the test fixture mechanism to run tests of the bp2build and
|
||||
// apiBp2build build modes.
|
||||
type bazelTestRunner struct {
|
||||
mode CodegenMode
|
||||
}
|
||||
// bazelTestRunner customizes the test fixture mechanism to run tests of the bp2build build mode.
|
||||
type bazelTestRunner struct{}
|
||||
|
||||
func (b *bazelTestRunner) FinalPreparer(result *android.TestResult) android.CustomTestResult {
|
||||
ctx := result.TestContext
|
||||
switch b.mode {
|
||||
case Bp2Build:
|
||||
ctx.RegisterForBazelConversion()
|
||||
case ApiBp2build:
|
||||
ctx.RegisterForApiBazelConversion()
|
||||
default:
|
||||
panic(fmt.Errorf("unknown build mode: %d", b.mode))
|
||||
}
|
||||
ctx.RegisterForBazelConversion()
|
||||
|
||||
return &BazelTestResult{TestResult: result}
|
||||
}
|
||||
|
@ -214,11 +192,7 @@ func (b *bazelTestRunner) PostParseProcessor(result android.CustomTestResult) {
|
|||
return
|
||||
}
|
||||
|
||||
codegenMode := Bp2Build
|
||||
if ctx.Config().BuildMode == android.ApiBp2build {
|
||||
codegenMode = ApiBp2build
|
||||
}
|
||||
codegenCtx := NewCodegenContext(config, ctx.Context, codegenMode, "")
|
||||
codegenCtx := NewCodegenContext(config, ctx.Context, Bp2Build, "")
|
||||
res, errs := GenerateBazelTargets(codegenCtx, false)
|
||||
if bazelResult.CollateErrs(errs) {
|
||||
return
|
||||
|
|
|
@ -27,7 +27,6 @@ import (
|
|||
|
||||
"android/soong/android"
|
||||
"android/soong/android/allowlists"
|
||||
"android/soong/bazel"
|
||||
"android/soong/bp2build"
|
||||
"android/soong/shared"
|
||||
"android/soong/ui/metrics/bp2build_metrics_proto"
|
||||
|
@ -76,7 +75,6 @@ func init() {
|
|||
flag.StringVar(&cmdlineArgs.ModuleActionsFile, "module_actions_file", "", "JSON file to output inputs/outputs of actions of modules")
|
||||
flag.StringVar(&cmdlineArgs.DocFile, "soong_docs", "", "build documentation file to output")
|
||||
flag.StringVar(&cmdlineArgs.BazelQueryViewDir, "bazel_queryview_dir", "", "path to the bazel queryview directory relative to --top")
|
||||
flag.StringVar(&cmdlineArgs.BazelApiBp2buildDir, "bazel_api_bp2build_dir", "", "path to the bazel api_bp2build directory relative to --top")
|
||||
flag.StringVar(&cmdlineArgs.Bp2buildMarker, "bp2build_marker", "", "If set, run bp2build, touch the specified marker file then exit")
|
||||
flag.StringVar(&cmdlineArgs.SymlinkForestMarker, "symlink_forest_marker", "", "If set, create the bp2build symlink forest, touch the specified marker file, then exit")
|
||||
flag.StringVar(&cmdlineArgs.OutFile, "o", "build.ninja", "the Ninja file to output")
|
||||
|
@ -169,120 +167,6 @@ func runQueryView(queryviewDir, queryviewMarker string, ctx *android.Context) {
|
|||
touch(shared.JoinPath(topDir, queryviewMarker))
|
||||
}
|
||||
|
||||
// Run the code-generation phase to convert API contributions to BUILD files.
|
||||
// Return marker file for the new synthetic workspace
|
||||
func runApiBp2build(ctx *android.Context, extraNinjaDeps []string) string {
|
||||
ctx.EventHandler.Begin("api_bp2build")
|
||||
defer ctx.EventHandler.End("api_bp2build")
|
||||
// api_bp2build does not run the typical pipeline of soong mutators.
|
||||
// Hoevever, it still runs the defaults mutator which can create dependencies.
|
||||
// These dependencies might not always exist (e.g. in tests)
|
||||
ctx.SetAllowMissingDependencies(ctx.Config().AllowMissingDependencies())
|
||||
ctx.RegisterForApiBazelConversion()
|
||||
|
||||
// Register the Android.bp files in the tree
|
||||
// Add them to the workspace's .d file
|
||||
ctx.SetModuleListFile(cmdlineArgs.ModuleListFile)
|
||||
if paths, err := ctx.ListModulePaths("."); err == nil {
|
||||
extraNinjaDeps = append(extraNinjaDeps, paths...)
|
||||
} else {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// Run the loading and analysis phase
|
||||
ninjaDeps, err := bootstrap.RunBlueprint(cmdlineArgs.Args,
|
||||
bootstrap.StopBeforePrepareBuildActions,
|
||||
ctx.Context,
|
||||
ctx.Config())
|
||||
maybeQuit(err, "")
|
||||
ninjaDeps = append(ninjaDeps, extraNinjaDeps...)
|
||||
|
||||
// Add the globbed dependencies
|
||||
ninjaDeps = append(ninjaDeps, writeBuildGlobsNinjaFile(ctx)...)
|
||||
|
||||
// Run codegen to generate BUILD files
|
||||
codegenContext := bp2build.NewCodegenContext(ctx.Config(), ctx, bp2build.ApiBp2build, topDir)
|
||||
absoluteApiBp2buildDir := shared.JoinPath(topDir, cmdlineArgs.BazelApiBp2buildDir)
|
||||
// Always generate bp2build_all_srcs filegroups in api_bp2build.
|
||||
// This is necessary to force each Android.bp file to create an equivalent BUILD file
|
||||
// and prevent package boundray issues.
|
||||
// e.g.
|
||||
// Source
|
||||
// f/b/Android.bp
|
||||
// java_library{
|
||||
// name: "foo",
|
||||
// api: "api/current.txt",
|
||||
// }
|
||||
//
|
||||
// f/b/api/Android.bp <- will cause package boundary issues
|
||||
//
|
||||
// Gen
|
||||
// f/b/BUILD
|
||||
// java_contribution{
|
||||
// name: "foo.contribution",
|
||||
// api: "//f/b/api:current.txt",
|
||||
// }
|
||||
//
|
||||
// If we don't generate f/b/api/BUILD, foo.contribution will be unbuildable.
|
||||
err = createBazelWorkspace(codegenContext, absoluteApiBp2buildDir, true)
|
||||
maybeQuit(err, "")
|
||||
ninjaDeps = append(ninjaDeps, codegenContext.AdditionalNinjaDeps()...)
|
||||
|
||||
// Create soong_injection repository
|
||||
soongInjectionFiles, workspaceFiles, err := bp2build.CreateSoongInjectionDirFiles(codegenContext, bp2build.CreateCodegenMetrics())
|
||||
maybeQuit(err, "")
|
||||
absoluteSoongInjectionDir := shared.JoinPath(topDir, ctx.Config().SoongOutDir(), bazel.SoongInjectionDirName)
|
||||
for _, file := range soongInjectionFiles {
|
||||
// The API targets in api_bp2build workspace do not have any dependency on api_bp2build.
|
||||
// But we need to create these files to prevent errors during Bazel analysis.
|
||||
// These need to be created in Read-Write mode.
|
||||
// This is because the subsequent step (bp2build in api domain analysis) creates them in Read-Write mode
|
||||
// to allow users to edit/experiment in the synthetic workspace.
|
||||
writeReadWriteFile(absoluteSoongInjectionDir, file)
|
||||
}
|
||||
for _, file := range workspaceFiles {
|
||||
writeReadWriteFile(absoluteApiBp2buildDir, file)
|
||||
}
|
||||
|
||||
workspace := shared.JoinPath(ctx.Config().SoongOutDir(), "api_bp2build")
|
||||
// Create the symlink forest
|
||||
symlinkDeps, _, _ := bp2build.PlantSymlinkForest(
|
||||
ctx.Config().IsEnvTrue("BP2BUILD_VERBOSE"),
|
||||
topDir,
|
||||
workspace,
|
||||
cmdlineArgs.BazelApiBp2buildDir,
|
||||
apiBuildFileExcludes(ctx))
|
||||
ninjaDeps = append(ninjaDeps, symlinkDeps...)
|
||||
|
||||
workspaceMarkerFile := workspace + ".marker"
|
||||
writeDepFile(workspaceMarkerFile, ctx.EventHandler, ninjaDeps)
|
||||
touch(shared.JoinPath(topDir, workspaceMarkerFile))
|
||||
return workspaceMarkerFile
|
||||
}
|
||||
|
||||
// With some exceptions, api_bp2build does not have any dependencies on the checked-in BUILD files
|
||||
// Exclude them from the generated workspace to prevent unrelated errors during the loading phase
|
||||
func apiBuildFileExcludes(ctx *android.Context) []string {
|
||||
ret := bazelArtifacts()
|
||||
srcs, err := getExistingBazelRelatedFiles(topDir)
|
||||
maybeQuit(err, "Error determining existing Bazel-related files")
|
||||
for _, src := range srcs {
|
||||
// Exclude all src BUILD files
|
||||
if src != "WORKSPACE" &&
|
||||
src != "BUILD" &&
|
||||
src != "BUILD.bazel" &&
|
||||
!strings.HasPrefix(src, "build/bazel") &&
|
||||
!strings.HasPrefix(src, "external/bazel-skylib") &&
|
||||
!strings.HasPrefix(src, "prebuilts/clang") {
|
||||
ret = append(ret, src)
|
||||
}
|
||||
}
|
||||
// Android.bp files for api surfaces are mounted to out/, but out/ should not be a
|
||||
// dep for api_bp2build. Otherwise, api_bp2build will be run every single time
|
||||
ret = append(ret, ctx.Config().OutDir())
|
||||
return ret
|
||||
}
|
||||
|
||||
func writeNinjaHint(ctx *android.Context) error {
|
||||
ctx.BeginEvent("ninja_hint")
|
||||
defer ctx.EndEvent("ninja_hint")
|
||||
|
@ -551,9 +435,6 @@ func main() {
|
|||
// Run the alternate pipeline of bp2build mutators and singleton to convert
|
||||
// Blueprint to BUILD files before everything else.
|
||||
finalOutputFile = runBp2Build(ctx, extraNinjaDeps, metricsDir)
|
||||
case android.ApiBp2build:
|
||||
finalOutputFile = runApiBp2build(ctx, extraNinjaDeps)
|
||||
writeMetrics(configuration, ctx.EventHandler, metricsDir)
|
||||
default:
|
||||
ctx.Register()
|
||||
isMixedBuildsEnabled := configuration.IsMixedBuildsEnabled()
|
||||
|
|
|
@ -407,38 +407,6 @@ EOF
|
|||
fi
|
||||
}
|
||||
|
||||
# Smoke test to verify api_bp2build worksapce does not contain any errors
|
||||
function test_api_bp2build_empty_build() {
|
||||
setup
|
||||
run_soong api_bp2build
|
||||
run_bazel build --config=android --config=api_bp2build //:empty
|
||||
}
|
||||
|
||||
# Verify that an *_api_contribution target can refer to an api file from
|
||||
# another Bazel package.
|
||||
function test_api_export_from_another_bazel_package() {
|
||||
setup
|
||||
# Parent dir Android.bp
|
||||
mkdir -p foo
|
||||
cat > foo/Android.bp << 'EOF'
|
||||
cc_library {
|
||||
name: "libfoo",
|
||||
stubs: {
|
||||
symbol_file: "api/libfoo.map.txt",
|
||||
},
|
||||
}
|
||||
EOF
|
||||
# Child dir Android.bp
|
||||
mkdir -p foo/api
|
||||
cat > foo/api/Android.bp << 'EOF'
|
||||
package{}
|
||||
EOF
|
||||
touch foo/api/libfoo.map.txt
|
||||
# Run test
|
||||
run_soong api_bp2build
|
||||
run_bazel build --config=android --config=api_bp2build //foo:libfoo.contribution
|
||||
}
|
||||
|
||||
function test_bazel_standalone_output_paths_contain_product_name {
|
||||
setup
|
||||
mkdir -p a
|
||||
|
|
|
@ -70,7 +70,6 @@ type configImpl struct {
|
|||
checkbuild bool
|
||||
dist bool
|
||||
jsonModuleGraph bool
|
||||
apiBp2build bool // Generate BUILD files for Soong modules that contribute APIs
|
||||
bp2build bool
|
||||
queryview bool
|
||||
reportMkMetrics bool // Collect and report mk2bp migration progress metrics.
|
||||
|
@ -869,8 +868,6 @@ func (c *configImpl) parseArgs(ctx Context, args []string) {
|
|||
c.jsonModuleGraph = true
|
||||
} else if arg == "bp2build" {
|
||||
c.bp2build = true
|
||||
} else if arg == "api_bp2build" {
|
||||
c.apiBp2build = true
|
||||
} else if arg == "queryview" {
|
||||
c.queryview = true
|
||||
} else if arg == "soong_docs" {
|
||||
|
@ -970,7 +967,7 @@ func (c *configImpl) SoongBuildInvocationNeeded() bool {
|
|||
return true
|
||||
}
|
||||
|
||||
if !c.JsonModuleGraph() && !c.Bp2Build() && !c.Queryview() && !c.SoongDocs() && !c.ApiBp2build() {
|
||||
if !c.JsonModuleGraph() && !c.Bp2Build() && !c.Queryview() && !c.SoongDocs() {
|
||||
// Command line was empty, the default Ninja target is built
|
||||
return true
|
||||
}
|
||||
|
@ -1068,10 +1065,6 @@ func (c *configImpl) QueryviewMarkerFile() string {
|
|||
return shared.JoinPath(c.SoongOutDir(), "queryview.marker")
|
||||
}
|
||||
|
||||
func (c *configImpl) ApiBp2buildMarkerFile() string {
|
||||
return shared.JoinPath(c.SoongOutDir(), "api_bp2build.marker")
|
||||
}
|
||||
|
||||
func (c *configImpl) ModuleGraphFile() string {
|
||||
return shared.JoinPath(c.SoongOutDir(), "module-graph.json")
|
||||
}
|
||||
|
@ -1113,10 +1106,6 @@ func (c *configImpl) Bp2Build() bool {
|
|||
return c.bp2build
|
||||
}
|
||||
|
||||
func (c *configImpl) ApiBp2build() bool {
|
||||
return c.apiBp2build
|
||||
}
|
||||
|
||||
func (c *configImpl) Queryview() bool {
|
||||
return c.queryview
|
||||
}
|
||||
|
@ -1308,7 +1297,7 @@ func (c *configImpl) canSupportRBE() bool {
|
|||
|
||||
func (c *configImpl) UseRBE() bool {
|
||||
// These alternate modes of running Soong do not use RBE / reclient.
|
||||
if c.Bp2Build() || c.Queryview() || c.ApiBp2build() || c.JsonModuleGraph() {
|
||||
if c.Bp2Build() || c.Queryview() || c.JsonModuleGraph() {
|
||||
return false
|
||||
}
|
||||
|
||||
|
|
|
@ -41,7 +41,6 @@ const (
|
|||
bp2buildWorkspaceTag = "bp2build_workspace"
|
||||
jsonModuleGraphTag = "modulegraph"
|
||||
queryviewTag = "queryview"
|
||||
apiBp2buildTag = "api_bp2build"
|
||||
soongDocsTag = "soong_docs"
|
||||
|
||||
// bootstrapEpoch is used to determine if an incremental build is incompatible with the current
|
||||
|
@ -264,7 +263,6 @@ func bootstrapGlobFileList(config Config) []string {
|
|||
config.NamedGlobFile(bp2buildFilesTag),
|
||||
config.NamedGlobFile(jsonModuleGraphTag),
|
||||
config.NamedGlobFile(queryviewTag),
|
||||
config.NamedGlobFile(apiBp2buildTag),
|
||||
config.NamedGlobFile(soongDocsTag),
|
||||
}
|
||||
}
|
||||
|
@ -305,9 +303,6 @@ func bootstrapBlueprint(ctx Context, config Config) {
|
|||
}
|
||||
|
||||
queryviewDir := filepath.Join(config.SoongOutDir(), "queryview")
|
||||
// The BUILD files will be generated in out/soong/.api_bp2build (no symlinks to src files)
|
||||
// The final workspace will be generated in out/soong/api_bp2build
|
||||
apiBp2buildDir := filepath.Join(config.SoongOutDir(), ".api_bp2build")
|
||||
|
||||
pbfs := []PrimaryBuilderFactory{
|
||||
{
|
||||
|
@ -354,15 +349,6 @@ func bootstrapBlueprint(ctx Context, config Config) {
|
|||
"--bazel_queryview_dir", queryviewDir,
|
||||
),
|
||||
},
|
||||
{
|
||||
name: apiBp2buildTag,
|
||||
description: fmt.Sprintf("generating BUILD files for API contributions at %s", apiBp2buildDir),
|
||||
config: config,
|
||||
output: config.ApiBp2buildMarkerFile(),
|
||||
specificArgs: append(baseArgs,
|
||||
"--bazel_api_bp2build_dir", apiBp2buildDir,
|
||||
),
|
||||
},
|
||||
{
|
||||
name: soongDocsTag,
|
||||
description: fmt.Sprintf("generating Soong docs at %s", config.SoongDocsHtml()),
|
||||
|
@ -533,10 +519,6 @@ func runSoong(ctx Context, config Config) {
|
|||
checkEnvironmentFile(ctx, soongBuildEnv, config.UsedEnvFile(queryviewTag))
|
||||
}
|
||||
|
||||
if config.ApiBp2build() {
|
||||
checkEnvironmentFile(ctx, soongBuildEnv, config.UsedEnvFile(apiBp2buildTag))
|
||||
}
|
||||
|
||||
if config.SoongDocs() {
|
||||
checkEnvironmentFile(ctx, soongBuildEnv, config.UsedEnvFile(soongDocsTag))
|
||||
}
|
||||
|
@ -608,10 +590,6 @@ func runSoong(ctx Context, config Config) {
|
|||
targets = append(targets, config.QueryviewMarkerFile())
|
||||
}
|
||||
|
||||
if config.ApiBp2build() {
|
||||
targets = append(targets, config.ApiBp2buildMarkerFile())
|
||||
}
|
||||
|
||||
if config.SoongDocs() {
|
||||
targets = append(targets, config.SoongDocsHtml())
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue