Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 324a92e4 authored by Cole Faust's avatar Cole Faust
Browse files

Always merge build files

Previous behavior:

- Packge not listed in bp2buildKeepExistingBuildFile:
    - Use bp2build generated build file
- Package listed in bp2buildKeepExistingBuildFile:
    - Use handcrafted build file even if there were allowlisted bp2build
      modules in the same package.
- Package listed in bp2buildKeepExistingBuildFile and a soong module has
  a bp2build: { label } attribute:
    - Merge the handcrafted and bp2build generated build files

New behavior:

- Packge not listed in bp2buildKeepExistingBuildFile:
    - Use bp2build generated build file
- Package listed in bp2buildKeepExistingBuildFile:
    - Merge with bp2build generated build file.

Bug: 234167862
Test: ./build/bazel/ci/bp2build.sh
Change-Id: Ifbaf4f8f0f5158b5b2bd6d534eb2311e2e5f399b
parent f9f9ed7c
Loading
Loading
Loading
Loading
+11 −31
Original line number Diff line number Diff line
@@ -46,10 +46,7 @@ var (
		"bionic":                                Bp2BuildDefaultTrueRecursively,
		"bootable/recovery/tools/recovery_l10n": Bp2BuildDefaultTrue,

		"build/bazel/examples/apex/minimal":           Bp2BuildDefaultTrueRecursively,
		"build/bazel/examples/soong_config_variables": Bp2BuildDefaultTrueRecursively,
		"build/bazel/examples/python":                 Bp2BuildDefaultTrueRecursively,
		"build/bazel/examples/gensrcs":                Bp2BuildDefaultTrueRecursively,
		"build/bazel":                        Bp2BuildDefaultTrueRecursively,
		"build/make/target/product/security": Bp2BuildDefaultTrue,
		"build/make/tools/signapk":           Bp2BuildDefaultTrue,
		"build/make/tools/zipalign":          Bp2BuildDefaultTrueRecursively,
@@ -282,24 +279,7 @@ var (
		// This is actually build/bazel/build.BAZEL symlinked to ./BUILD
		".":/*recursive = */ false,

		// build/bazel/examples/apex/... BUILD files should be generated, so
		// build/bazel is not recursive. Instead list each subdirectory under
		// build/bazel explicitly.
		"build/bazel":/* recursive = */ false,
		"build/bazel/ci/dist":/* recursive = */ false,
		"build/bazel/examples/android_app":/* recursive = */ true,
		"build/bazel/examples/cc":/* recursive = */ true,
		"build/bazel/examples/java":/* recursive = */ true,
		"build/bazel/examples/partitions":/* recursive = */ true,
		"build/bazel/bazel_skylib":/* recursive = */ true,
		"build/bazel/rules":/* recursive = */ true,
		"build/bazel/rules_cc":/* recursive = */ true,
		"build/bazel/scripts":/* recursive = */ true,
		"build/bazel/tests":/* recursive = */ true,
		"build/bazel/platforms":/* recursive = */ true,
		"build/bazel/product_config":/* recursive = */ true,
		"build/bazel/product_variables":/* recursive = */ true,
		"build/bazel/vendor/google":/* recursive = */ true,
		"build/bazel":/* recursive = */ true,
		"build/bazel_common_rules":/* recursive = */ true,
		// build/make/tools/signapk BUILD file is generated, so build/make/tools is not recursive.
		"build/make/tools":/* recursive = */ false,
+29 −41
Original line number Diff line number Diff line
@@ -211,7 +211,7 @@ func (b *BazelModuleBase) GetBazelLabel(ctx BazelConversionPathContext, module b
	return "" // no label for unconverted module
}

type bp2BuildConversionAllowlist struct {
type Bp2BuildConversionAllowlist struct {
	// Configure modules in these directories to enable bp2build_available: true or false by default.
	defaultConfig allowlists.Bp2BuildConfig

@@ -241,14 +241,14 @@ type bp2BuildConversionAllowlist struct {

// GenerateCcLibraryStaticOnly returns whether a cc_library module should only
// generate a static version of itself based on the current global configuration.
func (a bp2BuildConversionAllowlist) GenerateCcLibraryStaticOnly(moduleName string) bool {
func (a Bp2BuildConversionAllowlist) GenerateCcLibraryStaticOnly(moduleName string) bool {
	return a.ccLibraryStaticOnly[moduleName]
}

// NewBp2BuildAllowlist creates a new, empty bp2BuildConversionAllowlist
// NewBp2BuildAllowlist creates a new, empty Bp2BuildConversionAllowlist
// which can be populated using builder pattern Set* methods
func NewBp2BuildAllowlist() bp2BuildConversionAllowlist {
	return bp2BuildConversionAllowlist{
func NewBp2BuildAllowlist() Bp2BuildConversionAllowlist {
	return Bp2BuildConversionAllowlist{
		allowlists.Bp2BuildConfig{},
		map[string]bool{},
		map[string]bool{},
@@ -259,7 +259,7 @@ func NewBp2BuildAllowlist() bp2BuildConversionAllowlist {
}

// SetDefaultConfig copies the entries from defaultConfig into the allowlist
func (a bp2BuildConversionAllowlist) SetDefaultConfig(defaultConfig allowlists.Bp2BuildConfig) bp2BuildConversionAllowlist {
func (a Bp2BuildConversionAllowlist) SetDefaultConfig(defaultConfig allowlists.Bp2BuildConfig) Bp2BuildConversionAllowlist {
	if a.defaultConfig == nil {
		a.defaultConfig = allowlists.Bp2BuildConfig{}
	}
@@ -271,7 +271,7 @@ func (a bp2BuildConversionAllowlist) SetDefaultConfig(defaultConfig allowlists.B
}

// SetKeepExistingBuildFile copies the entries from keepExistingBuildFile into the allowlist
func (a bp2BuildConversionAllowlist) SetKeepExistingBuildFile(keepExistingBuildFile map[string]bool) bp2BuildConversionAllowlist {
func (a Bp2BuildConversionAllowlist) SetKeepExistingBuildFile(keepExistingBuildFile map[string]bool) Bp2BuildConversionAllowlist {
	if a.keepExistingBuildFile == nil {
		a.keepExistingBuildFile = map[string]bool{}
	}
@@ -283,7 +283,7 @@ func (a bp2BuildConversionAllowlist) SetKeepExistingBuildFile(keepExistingBuildF
}

// SetModuleAlwaysConvertList copies the entries from moduleAlwaysConvert into the allowlist
func (a bp2BuildConversionAllowlist) SetModuleAlwaysConvertList(moduleAlwaysConvert []string) bp2BuildConversionAllowlist {
func (a Bp2BuildConversionAllowlist) SetModuleAlwaysConvertList(moduleAlwaysConvert []string) Bp2BuildConversionAllowlist {
	if a.moduleAlwaysConvert == nil {
		a.moduleAlwaysConvert = map[string]bool{}
	}
@@ -295,7 +295,7 @@ func (a bp2BuildConversionAllowlist) SetModuleAlwaysConvertList(moduleAlwaysConv
}

// SetModuleTypeAlwaysConvertList copies the entries from moduleTypeAlwaysConvert into the allowlist
func (a bp2BuildConversionAllowlist) SetModuleTypeAlwaysConvertList(moduleTypeAlwaysConvert []string) bp2BuildConversionAllowlist {
func (a Bp2BuildConversionAllowlist) SetModuleTypeAlwaysConvertList(moduleTypeAlwaysConvert []string) Bp2BuildConversionAllowlist {
	if a.moduleTypeAlwaysConvert == nil {
		a.moduleTypeAlwaysConvert = map[string]bool{}
	}
@@ -307,7 +307,7 @@ func (a bp2BuildConversionAllowlist) SetModuleTypeAlwaysConvertList(moduleTypeAl
}

// SetModuleDoNotConvertList copies the entries from moduleDoNotConvert into the allowlist
func (a bp2BuildConversionAllowlist) SetModuleDoNotConvertList(moduleDoNotConvert []string) bp2BuildConversionAllowlist {
func (a Bp2BuildConversionAllowlist) SetModuleDoNotConvertList(moduleDoNotConvert []string) Bp2BuildConversionAllowlist {
	if a.moduleDoNotConvert == nil {
		a.moduleDoNotConvert = map[string]bool{}
	}
@@ -319,7 +319,7 @@ func (a bp2BuildConversionAllowlist) SetModuleDoNotConvertList(moduleDoNotConver
}

// SetCcLibraryStaticOnlyList copies the entries from ccLibraryStaticOnly into the allowlist
func (a bp2BuildConversionAllowlist) SetCcLibraryStaticOnlyList(ccLibraryStaticOnly []string) bp2BuildConversionAllowlist {
func (a Bp2BuildConversionAllowlist) SetCcLibraryStaticOnlyList(ccLibraryStaticOnly []string) Bp2BuildConversionAllowlist {
	if a.ccLibraryStaticOnly == nil {
		a.ccLibraryStaticOnly = map[string]bool{}
	}
@@ -330,33 +330,15 @@ func (a bp2BuildConversionAllowlist) SetCcLibraryStaticOnlyList(ccLibraryStaticO
	return a
}

var bp2BuildAllowListKey = NewOnceKey("Bp2BuildAllowlist")
var bp2buildAllowlist OncePer

func GetBp2BuildAllowList() bp2BuildConversionAllowlist {
	return bp2buildAllowlist.Once(bp2BuildAllowListKey, func() interface{} {
		return NewBp2BuildAllowlist().SetDefaultConfig(allowlists.Bp2buildDefaultConfig).
			SetKeepExistingBuildFile(allowlists.Bp2buildKeepExistingBuildFile).
			SetModuleAlwaysConvertList(allowlists.Bp2buildModuleAlwaysConvertList).
			SetModuleTypeAlwaysConvertList(allowlists.Bp2buildModuleTypeAlwaysConvertList).
			SetModuleDoNotConvertList(allowlists.Bp2buildModuleDoNotConvertList).
			SetCcLibraryStaticOnlyList(allowlists.Bp2buildCcLibraryStaticOnlyList)
	}).(bp2BuildConversionAllowlist)
}

// ShouldKeepExistingBuildFileForDir returns whether an existing BUILD file should be
// added to the build symlink forest based on the current global configuration.
func ShouldKeepExistingBuildFileForDir(dir string) bool {
	return shouldKeepExistingBuildFileForDir(GetBp2BuildAllowList(), dir)
}

func shouldKeepExistingBuildFileForDir(allowlist bp2BuildConversionAllowlist, dir string) bool {
	if _, ok := allowlist.keepExistingBuildFile[dir]; ok {
func (a Bp2BuildConversionAllowlist) ShouldKeepExistingBuildFileForDir(dir string) bool {
	if _, ok := a.keepExistingBuildFile[dir]; ok {
		// Exact dir match
		return true
	}
	// Check if subtree match
	for prefix, recursive := range allowlist.keepExistingBuildFile {
	for prefix, recursive := range a.keepExistingBuildFile {
		if recursive {
			if strings.HasPrefix(dir, prefix+"/") {
				return true
@@ -367,6 +349,20 @@ func shouldKeepExistingBuildFileForDir(allowlist bp2BuildConversionAllowlist, di
	return false
}

var bp2BuildAllowListKey = NewOnceKey("Bp2BuildAllowlist")
var bp2buildAllowlist OncePer

func GetBp2BuildAllowList() Bp2BuildConversionAllowlist {
	return bp2buildAllowlist.Once(bp2BuildAllowListKey, func() interface{} {
		return NewBp2BuildAllowlist().SetDefaultConfig(allowlists.Bp2buildDefaultConfig).
			SetKeepExistingBuildFile(allowlists.Bp2buildKeepExistingBuildFile).
			SetModuleAlwaysConvertList(allowlists.Bp2buildModuleAlwaysConvertList).
			SetModuleTypeAlwaysConvertList(allowlists.Bp2buildModuleTypeAlwaysConvertList).
			SetModuleDoNotConvertList(allowlists.Bp2buildModuleDoNotConvertList).
			SetCcLibraryStaticOnlyList(allowlists.Bp2buildCcLibraryStaticOnlyList)
	}).(Bp2BuildConversionAllowlist)
}

// MixedBuildsEnabled returns true if a module is ready to be replaced by a
// converted or handcrafted Bazel target. As a side effect, calling this
// method will also log whether this module is mixed build enabled for
@@ -431,7 +427,7 @@ func (b *BazelModuleBase) shouldConvertWithBp2build(ctx bazelOtherModuleContext,
	}

	moduleName := module.Name()
	allowlist := ctx.Config().bp2buildPackageConfig
	allowlist := ctx.Config().Bp2buildPackageConfig
	moduleNameAllowed := allowlist.moduleAlwaysConvert[moduleName]
	moduleTypeAllowed := allowlist.moduleTypeAlwaysConvert[ctx.OtherModuleType(module)]
	allowlistConvert := moduleNameAllowed || moduleTypeAllowed
@@ -447,14 +443,6 @@ func (b *BazelModuleBase) shouldConvertWithBp2build(ctx bazelOtherModuleContext,
		return false
	}

	if allowlistConvert && shouldKeepExistingBuildFileForDir(allowlist, packagePath) {
		if moduleNameAllowed {
			ctx.ModuleErrorf("A module cannot be in a directory listed in keepExistingBuildFile"+
				" and also be in moduleAlwaysConvert. Directory: '%s'", packagePath)
			return false
		}
	}

	// This is a tristate value: true, false, or unset.
	if ok, directoryPath := bp2buildDefaultTrueRecursively(packagePath, allowlist.defaultConfig); ok {
		if moduleNameAllowed {
+9 −30
Original line number Diff line number Diff line
@@ -158,7 +158,7 @@ func (m TestBazelModule) GenerateBuildActions(blueprint.ModuleContext) {

type TestBazelConversionContext struct {
	omc       bazel.OtherModuleTestContext
	allowlist bp2BuildConversionAllowlist
	allowlist Bp2BuildConversionAllowlist
	errors    []string
}

@@ -183,7 +183,7 @@ func (bcc *TestBazelConversionContext) ModuleErrorf(format string, args ...inter
func (bcc *TestBazelConversionContext) Config() Config {
	return Config{
		&config{
			bp2buildPackageConfig: bcc.allowlist,
			Bp2buildPackageConfig: bcc.allowlist,
		},
	}
}
@@ -202,7 +202,7 @@ func TestBp2BuildAllowlist(t *testing.T) {
		shouldConvert  bool
		expectedErrors []string
		module         TestBazelModule
		allowlist      bp2BuildConversionAllowlist
		allowlist      Bp2BuildConversionAllowlist
	}{
		{
			description:   "allowlist enables module",
@@ -215,7 +215,7 @@ func TestBp2BuildAllowlist(t *testing.T) {
				},
				BazelModuleBase: bazelableBazelModuleBase,
			},
			allowlist: bp2BuildConversionAllowlist{
			allowlist: Bp2BuildConversionAllowlist{
				moduleAlwaysConvert: map[string]bool{
					"foo": true,
				},
@@ -233,7 +233,7 @@ func TestBp2BuildAllowlist(t *testing.T) {
				},
				BazelModuleBase: bazelableBazelModuleBase,
			},
			allowlist: bp2BuildConversionAllowlist{
			allowlist: Bp2BuildConversionAllowlist{
				moduleAlwaysConvert: map[string]bool{
					"foo": true,
				},
@@ -254,7 +254,7 @@ func TestBp2BuildAllowlist(t *testing.T) {
				},
				BazelModuleBase: bazelableBazelModuleBase,
			},
			allowlist: bp2BuildConversionAllowlist{
			allowlist: Bp2BuildConversionAllowlist{
				moduleAlwaysConvert: map[string]bool{
					"foo": true,
				},
@@ -263,27 +263,6 @@ func TestBp2BuildAllowlist(t *testing.T) {
				},
			},
		},
		{
			description:    "module in allowlist and existing BUILD file",
			shouldConvert:  false,
			expectedErrors: []string{"A module cannot be in a directory listed in keepExistingBuildFile and also be in moduleAlwaysConvert. Directory: 'existing/build/dir'"},
			module: TestBazelModule{
				TestModuleInfo: bazel.TestModuleInfo{
					ModuleName: "foo",
					Typ:        "rule1",
					Dir:        "existing/build/dir",
				},
				BazelModuleBase: bazelableBazelModuleBase,
			},
			allowlist: bp2BuildConversionAllowlist{
				moduleAlwaysConvert: map[string]bool{
					"foo": true,
				},
				keepExistingBuildFile: map[string]bool{
					"existing/build/dir": true,
				},
			},
		},
		{
			description:    "module allowlist and enabled directory",
			shouldConvert:  false,
@@ -296,7 +275,7 @@ func TestBp2BuildAllowlist(t *testing.T) {
				},
				BazelModuleBase: bazelableBazelModuleBase,
			},
			allowlist: bp2BuildConversionAllowlist{
			allowlist: Bp2BuildConversionAllowlist{
				moduleAlwaysConvert: map[string]bool{
					"foo": true,
				},
@@ -317,7 +296,7 @@ func TestBp2BuildAllowlist(t *testing.T) {
				},
				BazelModuleBase: bazelableBazelModuleBase,
			},
			allowlist: bp2BuildConversionAllowlist{
			allowlist: Bp2BuildConversionAllowlist{
				moduleAlwaysConvert: map[string]bool{
					"foo": true,
				},
@@ -344,7 +323,7 @@ func TestBp2BuildAllowlist(t *testing.T) {
					},
				},
			},
			allowlist: bp2BuildConversionAllowlist{
			allowlist: Bp2BuildConversionAllowlist{
				moduleAlwaysConvert: map[string]bool{
					"foo": true,
				},
+2 −2
Original line number Diff line number Diff line
@@ -189,7 +189,7 @@ type config struct {
	mockBpList string

	BuildMode                      SoongBuildMode
	bp2buildPackageConfig          bp2BuildConversionAllowlist
	Bp2buildPackageConfig          Bp2BuildConversionAllowlist
	Bp2buildSoongConfigDefinitions soongconfig.Bp2BuildSoongConfigDefinitions

	// If testAllowNonExistentPaths is true then PathForSource and PathForModuleSrc won't error
@@ -482,7 +482,7 @@ func NewConfig(moduleListFile string, buildMode SoongBuildMode, runGoTests bool,

	config.BuildMode = buildMode
	config.BazelContext, err = NewBazelContext(config)
	config.bp2buildPackageConfig = GetBp2BuildAllowList()
	config.Bp2buildPackageConfig = GetBp2BuildAllowList()

	return Config{config}, err
}
+2 −2
Original line number Diff line number Diff line
@@ -213,8 +213,8 @@ func (ctx *TestContext) FinalDepsMutators(f RegisterMutatorFunc) {
	ctx.finalDeps = append(ctx.finalDeps, f)
}

func (ctx *TestContext) RegisterBp2BuildConfig(config bp2BuildConversionAllowlist) {
	ctx.config.bp2buildPackageConfig = config
func (ctx *TestContext) RegisterBp2BuildConfig(config Bp2BuildConversionAllowlist) {
	ctx.config.Bp2buildPackageConfig = config
}

// PreArchBp2BuildMutators adds mutators to be register for converting Android Blueprint modules
Loading