Merge "Stop using single-hyphen metalava options" into main
diff --git a/android/filegroup.go b/android/filegroup.go
index 3b86655..6cc9232 100644
--- a/android/filegroup.go
+++ b/android/filegroup.go
@@ -24,6 +24,7 @@
"android/soong/ui/metrics/bp2build_metrics_proto"
"github.com/google/blueprint"
+ "github.com/google/blueprint/proptools"
)
func init() {
@@ -141,8 +142,14 @@
attrs)
} else {
if fg.ShouldConvertToProtoLibrary(ctx) {
+ pkgToSrcs := partitionSrcsByPackage(ctx.ModuleDir(), bazel.MakeLabelList(srcs.Value.Includes))
+ if len(pkgToSrcs) > 1 {
+ ctx.ModuleErrorf("TODO: Add bp2build support for multiple package .protosrcs in filegroup")
+ return
+ }
+ pkg := SortedKeys(pkgToSrcs)[0]
attrs := &ProtoAttrs{
- Srcs: srcs,
+ Srcs: bazel.MakeLabelListAttribute(pkgToSrcs[pkg]),
Strip_import_prefix: fg.properties.Path,
}
@@ -151,13 +158,39 @@
// TODO(b/246997908): we can remove this tag if we could figure out a solution for this bug.
"manual",
}
+ if pkg != ctx.ModuleDir() {
+ // Since we are creating the proto_library in a subpackage, create an import_prefix relative to the current package
+ if rel, err := filepath.Rel(ctx.ModuleDir(), pkg); err != nil {
+ ctx.ModuleErrorf("Could not get relative path for %v %v", pkg, err)
+ } else if rel != "." {
+ attrs.Import_prefix = &rel
+ // Strip the package prefix
+ attrs.Strip_import_prefix = proptools.StringPtr("")
+ }
+ }
+
ctx.CreateBazelTargetModule(
bazel.BazelTargetModuleProperties{Rule_class: "proto_library"},
CommonAttributes{
- Name: fg.Name() + convertedProtoLibrarySuffix,
+ Name: fg.Name() + "_proto",
+ Dir: proptools.StringPtr(pkg),
Tags: bazel.MakeStringListAttribute(tags),
},
attrs)
+
+ // Create an alias in the current dir. The actual target might exist in a different package, but rdeps
+ // can reliabily use this alias
+ ctx.CreateBazelTargetModule(
+ bazel.BazelTargetModuleProperties{Rule_class: "alias"},
+ CommonAttributes{
+ Name: fg.Name() + convertedProtoLibrarySuffix,
+ // TODO(b/246997908): we can remove this tag if we could figure out a solution for this bug.
+ Tags: bazel.MakeStringListAttribute(tags),
+ },
+ &bazelAliasAttributes{
+ Actual: bazel.MakeLabelAttribute("//" + pkg + ":" + fg.Name() + "_proto"),
+ },
+ )
}
// TODO(b/242847534): Still convert to a filegroup because other unconverted
diff --git a/android/module.go b/android/module.go
index b982019..19502ba 100644
--- a/android/module.go
+++ b/android/module.go
@@ -1021,6 +1021,11 @@
Applicable_licenses bazel.LabelListAttribute
Testonly *bool
+
+ // Dir is neither a Soong nor Bazel target attribute
+ // If set, the bazel target will be created in this directory
+ // If unset, the bazel target will default to be created in the directory of the visited soong module
+ Dir *string
}
// constraintAttributes represents Bazel attributes pertaining to build constraints,
@@ -1429,10 +1434,17 @@
ctx.ModuleErrorf("Could not convert product variable enabled property")
}
- if *flag {
+ if flag == nil {
+ // soong config var is not used to set `enabled`. nothing to do.
+ continue
+ } else if *flag {
axis := productConfigProp.ConfigurationAxis()
result.SetSelectValue(axis, bazel.ConditionsDefaultConfigKey, bazel.MakeLabelList([]bazel.Label{{Label: "@platforms//:incompatible"}}))
result.SetSelectValue(axis, productConfigProp.SelectKey(), bazel.LabelList{Includes: []bazel.Label{}})
+ } else if scp, isSoongConfigProperty := productConfigProp.(SoongConfigProperty); isSoongConfigProperty && scp.value == bazel.ConditionsDefaultConfigKey {
+ // productVariableConfigEnableAttribute runs only if `enabled: false` is set at the top-level outside soong_config_variables
+ // conditions_default { enabled: false} is a no-op in this case
+ continue
} else {
// TODO(b/210546943): handle negative case where `enabled: false`
ctx.ModuleErrorf("`enabled: false` is not currently supported for configuration variables. See b/210546943")
diff --git a/android/mutator.go b/android/mutator.go
index 2ec051e..6bcac93 100644
--- a/android/mutator.go
+++ b/android/mutator.go
@@ -17,6 +17,7 @@
import (
"android/soong/bazel"
"android/soong/ui/metrics/bp2build_metrics_proto"
+ "path/filepath"
"github.com/google/blueprint"
)
@@ -757,6 +758,27 @@
mod.base().addBp2buildInfo(info)
}
+// Returns the directory in which the bazel target will be generated
+// If ca.Dir is not nil, use that
+// Otherwise default to the directory of the soong module
+func dirForBazelTargetGeneration(t *topDownMutatorContext, ca *CommonAttributes) string {
+ dir := t.OtherModuleDir(t.Module())
+ if ca.Dir != nil {
+ dir = *ca.Dir
+ // Restrict its use to dirs that contain an Android.bp file.
+ // There are several places in bp2build where we use the existence of Android.bp/BUILD on the filesystem
+ // to curate a compatible label for src files (e.g. headers for cc).
+ // If we arbritrarily create BUILD files, then it might render those curated labels incompatible.
+ if exists, _, _ := t.Config().fs.Exists(filepath.Join(dir, "Android.bp")); !exists {
+ t.ModuleErrorf("Cannot use ca.Dir to create a BazelTarget in dir: %v since it does not contain an Android.bp file", dir)
+ }
+
+ // Set ca.Dir to nil so that it does not get emitted to the BUILD files
+ ca.Dir = nil
+ }
+ return dir
+}
+
func (t *topDownMutatorContext) CreateBazelConfigSetting(
csa bazel.ConfigSettingAttributes,
ca CommonAttributes,
@@ -851,7 +873,7 @@
constraintAttributes := commonAttrs.fillCommonBp2BuildModuleAttrs(t, enabledProperty)
mod := t.Module()
info := bp2buildInfo{
- Dir: t.OtherModuleDir(mod),
+ Dir: dirForBazelTargetGeneration(t, &commonAttrs),
BazelProps: bazelProps,
CommonAttrs: commonAttrs,
ConstraintAttrs: constraintAttributes,
diff --git a/android/prebuilt_build_tool.go b/android/prebuilt_build_tool.go
index e5edf91..aeae20f 100644
--- a/android/prebuilt_build_tool.go
+++ b/android/prebuilt_build_tool.go
@@ -102,6 +102,10 @@
// prebuilt_build_tool is to declare prebuilts to be used during the build, particularly for use
// in genrules with the "tools" property.
func prebuiltBuildToolFactory() Module {
+ return NewPrebuiltBuildTool()
+}
+
+func NewPrebuiltBuildTool() Module {
module := &prebuiltBuildTool{}
module.AddProperties(&module.properties)
InitSingleSourcePrebuiltModule(module, &module.properties, "Src")
diff --git a/android/proto.go b/android/proto.go
index cebbd59..aad521b 100644
--- a/android/proto.go
+++ b/android/proto.go
@@ -15,6 +15,7 @@
package android
import (
+ "path/filepath"
"strings"
"android/soong/bazel"
@@ -156,12 +157,12 @@
// Bp2buildProtoInfo contains information necessary to pass on to language specific conversion.
type Bp2buildProtoInfo struct {
Type *string
- Name string
Proto_libs bazel.LabelList
}
type ProtoAttrs struct {
Srcs bazel.LabelListAttribute
+ Import_prefix *string
Strip_import_prefix *string
Deps bazel.LabelListAttribute
}
@@ -172,6 +173,35 @@
"external/protobuf/src": "//external/protobuf:libprotobuf-proto",
}
+// Partitions srcs by the pkg it is in
+// srcs has been created using `TransformSubpackagePaths`
+// This function uses existence of Android.bp/BUILD files to create a label that is compatible with the package structure of bp2build workspace
+func partitionSrcsByPackage(currentDir string, srcs bazel.LabelList) map[string]bazel.LabelList {
+ getPackageFromLabel := func(label string) string {
+ // Remove any preceding //
+ label = strings.TrimPrefix(label, "//")
+ split := strings.Split(label, ":")
+ if len(split) == 1 {
+ // e.g. foo.proto
+ return currentDir
+ } else if split[0] == "" {
+ // e.g. :foo.proto
+ return currentDir
+ } else {
+ return split[0]
+ }
+ }
+
+ pkgToSrcs := map[string]bazel.LabelList{}
+ for _, src := range srcs.Includes {
+ pkg := getPackageFromLabel(src.Label)
+ list := pkgToSrcs[pkg]
+ list.Add(&src)
+ pkgToSrcs[pkg] = list
+ }
+ return pkgToSrcs
+}
+
// Bp2buildProtoProperties converts proto properties, creating a proto_library and returning the
// information necessary for language-specific handling.
func Bp2buildProtoProperties(ctx Bp2buildMutatorContext, m *ModuleBase, srcs bazel.LabelListAttribute) (Bp2buildProtoInfo, bool) {
@@ -197,54 +227,73 @@
}
}
- info.Name = m.Name() + "_proto"
+ name := m.Name() + "_proto"
+
+ depsFromFilegroup := protoLibraries
if len(directProtoSrcs.Includes) > 0 {
- attrs := ProtoAttrs{
- Srcs: bazel.MakeLabelListAttribute(directProtoSrcs),
- }
- attrs.Deps.Append(bazel.MakeLabelListAttribute(protoLibraries))
+ pkgToSrcs := partitionSrcsByPackage(ctx.ModuleDir(), directProtoSrcs)
+ for _, pkg := range SortedStringKeys(pkgToSrcs) {
+ srcs := pkgToSrcs[pkg]
+ attrs := ProtoAttrs{
+ Srcs: bazel.MakeLabelListAttribute(srcs),
+ }
+ attrs.Deps.Append(bazel.MakeLabelListAttribute(depsFromFilegroup))
- for axis, configToProps := range m.GetArchVariantProperties(ctx, &ProtoProperties{}) {
- for _, rawProps := range configToProps {
- var props *ProtoProperties
- var ok bool
- if props, ok = rawProps.(*ProtoProperties); !ok {
- ctx.ModuleErrorf("Could not cast ProtoProperties to expected type")
- }
- if axis == bazel.NoConfigAxis {
- info.Type = props.Proto.Type
-
- if !proptools.BoolDefault(props.Proto.Canonical_path_from_root, canonicalPathFromRootDefault) {
- // an empty string indicates to strips the package path
- path := ""
- attrs.Strip_import_prefix = &path
+ for axis, configToProps := range m.GetArchVariantProperties(ctx, &ProtoProperties{}) {
+ for _, rawProps := range configToProps {
+ var props *ProtoProperties
+ var ok bool
+ if props, ok = rawProps.(*ProtoProperties); !ok {
+ ctx.ModuleErrorf("Could not cast ProtoProperties to expected type")
}
+ if axis == bazel.NoConfigAxis {
+ info.Type = props.Proto.Type
- for _, dir := range props.Proto.Include_dirs {
- if dep, ok := includeDirsToProtoDeps[dir]; ok {
- attrs.Deps.Add(bazel.MakeLabelAttribute(dep))
- } else {
- ctx.PropertyErrorf("Could not find the proto_library target for include dir", dir)
+ if !proptools.BoolDefault(props.Proto.Canonical_path_from_root, canonicalPathFromRootDefault) {
+ // an empty string indicates to strips the package path
+ path := ""
+ attrs.Strip_import_prefix = &path
}
+
+ for _, dir := range props.Proto.Include_dirs {
+ if dep, ok := includeDirsToProtoDeps[dir]; ok {
+ attrs.Deps.Add(bazel.MakeLabelAttribute(dep))
+ } else {
+ ctx.PropertyErrorf("Could not find the proto_library target for include dir", dir)
+ }
+ }
+ } else if props.Proto.Type != info.Type && props.Proto.Type != nil {
+ ctx.ModuleErrorf("Cannot handle arch-variant types for protos at this time.")
}
- } else if props.Proto.Type != info.Type && props.Proto.Type != nil {
- ctx.ModuleErrorf("Cannot handle arch-variant types for protos at this time.")
}
}
+
+ tags := ApexAvailableTagsWithoutTestApexes(ctx.(TopDownMutatorContext), ctx.Module())
+
+ // Since we are creating the proto_library in a subpackage, create an import_prefix relative to the current package
+ if rel, err := filepath.Rel(ctx.ModuleDir(), pkg); err != nil {
+ ctx.ModuleErrorf("Could not get relative path for %v %v", pkg, err)
+ } else if rel != "." {
+ attrs.Import_prefix = &rel
+ }
+
+ ctx.CreateBazelTargetModule(
+ bazel.BazelTargetModuleProperties{Rule_class: "proto_library"},
+ CommonAttributes{Name: name, Dir: proptools.StringPtr(pkg), Tags: tags},
+ &attrs,
+ )
+
+ l := ""
+ if pkg == ctx.ModuleDir() { // same package that the original module lives in
+ l = ":" + name
+ } else {
+ l = "//" + pkg + ":" + name
+ }
+ protoLibraries.Add(&bazel.Label{
+ Label: l,
+ })
}
-
- tags := ApexAvailableTagsWithoutTestApexes(ctx.(TopDownMutatorContext), ctx.Module())
-
- ctx.CreateBazelTargetModule(
- bazel.BazelTargetModuleProperties{Rule_class: "proto_library"},
- CommonAttributes{Name: info.Name, Tags: tags},
- &attrs,
- )
-
- protoLibraries.Add(&bazel.Label{
- Label: ":" + info.Name,
- })
}
info.Proto_libs = protoLibraries
diff --git a/bp2build/build_conversion.go b/bp2build/build_conversion.go
index 6f41f37..6ca4bb4 100644
--- a/bp2build/build_conversion.go
+++ b/bp2build/build_conversion.go
@@ -29,6 +29,7 @@
"android/soong/bazel"
"android/soong/starlark_fmt"
"android/soong/ui/metrics/bp2build_metrics_proto"
+
"github.com/google/blueprint"
"github.com/google/blueprint/bootstrap"
"github.com/google/blueprint/proptools"
@@ -94,16 +95,16 @@
// statements (use LoadStatements for that), since the targets are usually not
// adjacent to the load statements at the top of the BUILD file.
func (targets BazelTargets) String() string {
- var res string
+ var res strings.Builder
for i, target := range targets {
if target.ruleClass != "package" {
- res += target.content
+ res.WriteString(target.content)
}
if i != len(targets)-1 {
- res += "\n\n"
+ res.WriteString("\n\n")
}
}
- return res
+ return res.String()
}
// LoadStatements return the string representation of the sorted and deduplicated
diff --git a/bp2build/build_conversion_test.go b/bp2build/build_conversion_test.go
index 4d1d171..8ee0439 100644
--- a/bp2build/build_conversion_test.go
+++ b/bp2build/build_conversion_test.go
@@ -1949,3 +1949,46 @@
actual, _ := prettyPrintAttribute(lla, 0)
android.AssertStringEquals(t, "Print the common value if all keys in an axis have the same value", `[":libfoo.impl"]`, actual)
}
+
+// If CommonAttributes.Dir is set, the bazel target should be created in that dir
+func TestCreateBazelTargetInDifferentDir(t *testing.T) {
+ t.Parallel()
+ bp := `
+ custom {
+ name: "foo",
+ dir: "subdir",
+ }
+ `
+ registerCustomModule := func(ctx android.RegistrationContext) {
+ ctx.RegisterModuleType("custom", customModuleFactoryHostAndDevice)
+ }
+ // Check that foo is not created in root dir
+ RunBp2BuildTestCase(t, registerCustomModule, Bp2buildTestCase{
+ Description: "foo is not created in root dir because it sets dir explicitly",
+ Blueprint: bp,
+ Filesystem: map[string]string{
+ "subdir/Android.bp": "",
+ },
+ ExpectedBazelTargets: []string{},
+ })
+ // Check that foo is created in `subdir`
+ RunBp2BuildTestCase(t, registerCustomModule, Bp2buildTestCase{
+ Description: "foo is created in `subdir` because it sets dir explicitly",
+ Blueprint: bp,
+ Filesystem: map[string]string{
+ "subdir/Android.bp": "",
+ },
+ Dir: "subdir",
+ ExpectedBazelTargets: []string{
+ MakeBazelTarget("custom", "foo", AttrNameToString{}),
+ },
+ })
+ // Check that we cannot create target in different dir if it is does not an Android.bp
+ RunBp2BuildTestCase(t, registerCustomModule, Bp2buildTestCase{
+ Description: "foo cannot be created in `subdir` because it does not contain an Android.bp file",
+ Blueprint: bp,
+ Dir: "subdir",
+ ExpectedErr: fmt.Errorf("Cannot use ca.Dir to create a BazelTarget in dir: subdir since it does not contain an Android.bp file"),
+ })
+
+}
diff --git a/bp2build/bzl_conversion_test.go b/bp2build/bzl_conversion_test.go
index 9d9f456..402d4b0 100644
--- a/bp2build/bzl_conversion_test.go
+++ b/bp2build/bzl_conversion_test.go
@@ -94,6 +94,7 @@
# bazel_module end
"bool_prop": attr.bool(),
"bool_ptr_prop": attr.bool(),
+ "dir": attr.string(),
"embedded_prop": attr.string(),
"int64_ptr_prop": attr.int(),
# nested_props start
@@ -126,6 +127,7 @@
"arch_paths_exclude": attr.string_list(),
"bool_prop": attr.bool(),
"bool_ptr_prop": attr.bool(),
+ "dir": attr.string(),
"embedded_prop": attr.string(),
"int64_ptr_prop": attr.int(),
# nested_props start
@@ -158,6 +160,7 @@
"arch_paths_exclude": attr.string_list(),
"bool_prop": attr.bool(),
"bool_ptr_prop": attr.bool(),
+ "dir": attr.string(),
"embedded_prop": attr.string(),
"int64_ptr_prop": attr.int(),
# nested_props start
diff --git a/bp2build/cc_library_conversion_test.go b/bp2build/cc_library_conversion_test.go
index 6b17fc4..e425b36 100644
--- a/bp2build/cc_library_conversion_test.go
+++ b/bp2build/cc_library_conversion_test.go
@@ -2434,12 +2434,18 @@
}), MakeBazelTarget("cc_library_shared", "a", AttrNameToString{
"dynamic_deps": `[":libprotobuf-cpp-lite"]`,
"whole_archive_deps": `[":a_cc_proto_lite"]`,
- }), MakeBazelTargetNoRestrictions("proto_library", "a_fg_proto_bp2build_converted", AttrNameToString{
+ }), MakeBazelTargetNoRestrictions("proto_library", "a_fg_proto_proto", AttrNameToString{
"srcs": `["a_fg.proto"]`,
"tags": `[
"apex_available=//apex_available:anyapex",
"manual",
]`,
+ }), MakeBazelTargetNoRestrictions("alias", "a_fg_proto_bp2build_converted", AttrNameToString{
+ "actual": `"//.:a_fg_proto_proto"`,
+ "tags": `[
+ "apex_available=//apex_available:anyapex",
+ "manual",
+ ]`,
}), MakeBazelTargetNoRestrictions("filegroup", "a_fg_proto", AttrNameToString{
"srcs": `["a_fg.proto"]`,
}),
@@ -2476,12 +2482,18 @@
}), MakeBazelTarget("cc_library_shared", "a", AttrNameToString{
"dynamic_deps": `[":libprotobuf-cpp-lite"]`,
"whole_archive_deps": `[":a_cc_proto_lite"]`,
- }), MakeBazelTargetNoRestrictions("proto_library", "a_fg_proto_bp2build_converted", AttrNameToString{
+ }), MakeBazelTargetNoRestrictions("proto_library", "a_fg_proto_proto", AttrNameToString{
"srcs": `["a_fg.proto"]`,
"tags": `[
"apex_available=//apex_available:anyapex",
"manual",
]`,
+ }), MakeBazelTargetNoRestrictions("alias", "a_fg_proto_bp2build_converted", AttrNameToString{
+ "actual": `"//.:a_fg_proto_proto"`,
+ "tags": `[
+ "apex_available=//apex_available:anyapex",
+ "manual",
+ ]`,
}), MakeBazelTargetNoRestrictions("filegroup", "a_fg_proto", AttrNameToString{
"srcs": `["a_fg.proto"]`,
}),
@@ -4903,3 +4915,67 @@
},
})
}
+
+// Bazel enforces that proto_library and the .proto file are in the same bazel package
+func TestGenerateProtoLibraryInSamePackage(t *testing.T) {
+ tc := Bp2buildTestCase{
+ Description: "cc_library depends on .proto files from multiple packages",
+ ModuleTypeUnderTest: "cc_library",
+ ModuleTypeUnderTestFactory: cc.LibraryFactory,
+ Blueprint: `
+cc_library_static {
+ name: "foo",
+ srcs: [
+ "foo.proto",
+ "bar/bar.proto", // Different package because there is a bar/Android.bp
+ "baz/subbaz/baz.proto", // Different package because there is baz/subbaz/Android.bp
+ ],
+}
+` + simpleModuleDoNotConvertBp2build("cc_library", "libprotobuf-cpp-lite"),
+ Filesystem: map[string]string{
+ "bar/Android.bp": "",
+ "baz/subbaz/Android.bp": "",
+ },
+ }
+
+ // We will run the test 3 times and check in the root, bar and baz/subbaz directories
+ // Root dir
+ tc.ExpectedBazelTargets = []string{
+ MakeBazelTarget("cc_library_static", "foo", AttrNameToString{
+ "local_includes": `["."]`,
+ "deps": `[":libprotobuf-cpp-lite"]`,
+ "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`,
+ }),
+ MakeBazelTarget("proto_library", "foo_proto", AttrNameToString{
+ "srcs": `["foo.proto"]`,
+ }),
+ MakeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", AttrNameToString{
+ "deps": `[
+ ":foo_proto",
+ "//bar:foo_proto",
+ "//baz/subbaz:foo_proto",
+ ]`,
+ }),
+ }
+ runCcLibraryTestCase(t, tc)
+
+ // bar dir
+ tc.Dir = "bar"
+ tc.ExpectedBazelTargets = []string{
+ MakeBazelTarget("proto_library", "foo_proto", AttrNameToString{
+ "srcs": `["//bar:bar.proto"]`,
+ "import_prefix": `"bar"`,
+ }),
+ }
+ runCcLibraryTestCase(t, tc)
+
+ // baz/subbaz dir
+ tc.Dir = "baz/subbaz"
+ tc.ExpectedBazelTargets = []string{
+ MakeBazelTarget("proto_library", "foo_proto", AttrNameToString{
+ "srcs": `["//baz/subbaz:baz.proto"]`,
+ "import_prefix": `"baz/subbaz"`,
+ }),
+ }
+ runCcLibraryTestCase(t, tc)
+}
diff --git a/bp2build/filegroup_conversion_test.go b/bp2build/filegroup_conversion_test.go
index 7ce559d..cb2e207 100644
--- a/bp2build/filegroup_conversion_test.go
+++ b/bp2build/filegroup_conversion_test.go
@@ -137,7 +137,7 @@
path: "proto",
}`,
ExpectedBazelTargets: []string{
- MakeBazelTargetNoRestrictions("proto_library", "foo_bp2build_converted", AttrNameToString{
+ MakeBazelTargetNoRestrictions("proto_library", "foo_proto", AttrNameToString{
"srcs": `["proto/foo.proto"]`,
"strip_import_prefix": `"proto"`,
"tags": `[
@@ -145,6 +145,13 @@
"manual",
]`,
}),
+ MakeBazelTargetNoRestrictions("alias", "foo_bp2build_converted", AttrNameToString{
+ "actual": `"//.:foo_proto"`,
+ "tags": `[
+ "apex_available=//apex_available:anyapex",
+ "manual",
+ ]`,
+ }),
MakeBazelTargetNoRestrictions("filegroup", "foo", AttrNameToString{
"srcs": `["proto/foo.proto"]`}),
}})
@@ -170,3 +177,27 @@
]`}),
}})
}
+
+func TestFilegroupWithProtoInDifferentPackage(t *testing.T) {
+ runFilegroupTestCase(t, Bp2buildTestCase{
+ Description: "filegroup with .proto in different package",
+ Filesystem: map[string]string{
+ "subdir/Android.bp": "",
+ },
+ Blueprint: `
+filegroup {
+ name: "foo",
+ srcs: ["subdir/foo.proto"],
+}`,
+ Dir: "subdir", // check in subdir
+ ExpectedBazelTargets: []string{
+ MakeBazelTargetNoRestrictions("proto_library", "foo_proto", AttrNameToString{
+ "srcs": `["//subdir:foo.proto"]`,
+ "import_prefix": `"subdir"`,
+ "strip_import_prefix": `""`,
+ "tags": `[
+ "apex_available=//apex_available:anyapex",
+ "manual",
+ ]`}),
+ }})
+}
diff --git a/bp2build/soong_config_module_type_conversion_test.go b/bp2build/soong_config_module_type_conversion_test.go
index 1ff47f2..8302ce8 100644
--- a/bp2build/soong_config_module_type_conversion_test.go
+++ b/bp2build/soong_config_module_type_conversion_test.go
@@ -1243,6 +1243,24 @@
srcs: ["main.cc"],
defaults: ["alphabet_sample_cc_defaults"],
enabled: false,
+}
+
+alphabet_cc_defaults {
+ name: "alphabet_sample_cc_defaults_conditions_default",
+ soong_config_variables: {
+ special_build: {
+ conditions_default: {
+ enabled: false,
+ },
+ },
+ },
+}
+
+cc_binary {
+ name: "alphabet_binary_conditions_default",
+ srcs: ["main.cc"],
+ defaults: ["alphabet_sample_cc_defaults_conditions_default"],
+ enabled: false,
}`
runSoongConfigModuleTypeTest(t, Bp2buildTestCase{
@@ -1259,7 +1277,13 @@
"//build/bazel/product_config/config_settings:alphabet_module__special_build": [],
"//conditions:default": ["@platforms//:incompatible"],
}),
-)`}})
+)`,
+ MakeBazelTarget("cc_binary", "alphabet_binary_conditions_default", AttrNameToString{
+ "local_includes": `["."]`,
+ "srcs": `["main.cc"]`,
+ "target_compatible_with": `["@platforms//:incompatible"]`,
+ }),
+ }})
}
func TestSoongConfigModuleType_ProductVariableIgnoredIfEnabledByDefault(t *testing.T) {
@@ -1520,3 +1544,58 @@
runSoongConfigModuleTypeTest(t, bp2buildTestCase)
}
}
+
+func TestNoPanicIfEnabledIsNotUsed(t *testing.T) {
+ bp := `
+soong_config_string_variable {
+ name: "my_string_variable",
+ values: ["val1", "val2"],
+}
+soong_config_module_type {
+ name: "special_cc_defaults",
+ module_type: "cc_defaults",
+ config_namespace: "my_namespace",
+ variables: ["my_string_variable"],
+ properties: [
+ "cflags",
+ "enabled",
+ ],
+}
+special_cc_defaults {
+ name: "my_special_cc_defaults",
+ soong_config_variables: {
+ my_string_variable: {
+ val1: {
+ cflags: ["-DFOO"],
+ },
+ val2: {
+ cflags: ["-DBAR"],
+ },
+ },
+ },
+}
+cc_binary {
+ name: "my_binary",
+ enabled: false,
+ defaults: ["my_special_cc_defaults"],
+}
+`
+ tc := Bp2buildTestCase{
+ Description: "Soong config vars is not used to set `enabled` property",
+ ModuleTypeUnderTest: "cc_binary",
+ ModuleTypeUnderTestFactory: cc.BinaryFactory,
+ Blueprint: bp,
+ ExpectedBazelTargets: []string{
+ MakeBazelTarget("cc_binary", "my_binary", AttrNameToString{
+ "copts": `select({
+ "//build/bazel/product_config/config_settings:my_namespace__my_string_variable__val1": ["-DFOO"],
+ "//build/bazel/product_config/config_settings:my_namespace__my_string_variable__val2": ["-DBAR"],
+ "//conditions:default": [],
+ })`,
+ "local_includes": `["."]`,
+ "target_compatible_with": `["@platforms//:incompatible"]`,
+ }),
+ },
+ }
+ runSoongConfigModuleTypeTest(t, tc)
+}
diff --git a/bp2build/testing.go b/bp2build/testing.go
index 140b214..18ae82d 100644
--- a/bp2build/testing.go
+++ b/bp2build/testing.go
@@ -336,6 +336,8 @@
Api *string // File describing the APIs of this module
Test_config_setting *bool // Used to test generation of config_setting targets
+
+ Dir *string // Dir in which the Bazel Target will be created
}
type customModule struct {
@@ -461,6 +463,10 @@
Api bazel.LabelAttribute
}
+func (m *customModule) dir() *string {
+ return m.props.Dir
+}
+
func (m *customModule) ConvertWithBp2build(ctx android.TopDownMutatorContext) {
if p := m.props.One_to_many_prop; p != nil && *p {
customBp2buildOneToMany(ctx, m)
@@ -508,7 +514,7 @@
Rule_class: "custom",
}
- ctx.CreateBazelTargetModule(props, android.CommonAttributes{Name: m.Name()}, attrs)
+ ctx.CreateBazelTargetModule(props, android.CommonAttributes{Name: m.Name(), Dir: m.dir()}, attrs)
if proptools.Bool(m.props.Test_config_setting) {
m.createConfigSetting(ctx)
diff --git a/java/aapt2.go b/java/aapt2.go
index 4cff8a7..3bb70b5 100644
--- a/java/aapt2.go
+++ b/java/aapt2.go
@@ -146,21 +146,25 @@
var aapt2LinkRule = pctx.AndroidStaticRule("aapt2Link",
blueprint.RuleParams{
- Command: `rm -rf $genDir && ` +
- `${config.Aapt2Cmd} link -o $out $flags --java $genDir --proguard $proguardOptions ` +
- `--output-text-symbols ${rTxt} $inFlags && ` +
- `${config.SoongZipCmd} -write_if_changed -jar -o $genJar -C $genDir -D $genDir &&` +
- `${config.ExtractJarPackagesCmd} -i $genJar -o $extraPackages --prefix '--extra-packages ' && ` +
- `rm -rf $genDir`,
+ Command: `$preamble` +
+ `${config.Aapt2Cmd} link -o $out $flags --proguard $proguardOptions ` +
+ `--output-text-symbols ${rTxt} $inFlags` +
+ `$postamble`,
CommandDeps: []string{
"${config.Aapt2Cmd}",
"${config.SoongZipCmd}",
- "${config.ExtractJarPackagesCmd}",
},
Restat: true,
},
- "flags", "inFlags", "proguardOptions", "genDir", "genJar", "rTxt", "extraPackages")
+ "flags", "inFlags", "proguardOptions", "rTxt", "extraPackages", "preamble", "postamble")
+
+var aapt2ExtractExtraPackagesRule = pctx.AndroidStaticRule("aapt2ExtractExtraPackages",
+ blueprint.RuleParams{
+ Command: `${config.ExtractJarPackagesCmd} -i $in -o $out --prefix '--extra-packages '`,
+ CommandDeps: []string{"${config.ExtractJarPackagesCmd}"},
+ Restat: true,
+ })
var fileListToFileRule = pctx.AndroidStaticRule("fileListToFile",
blueprint.RuleParams{
@@ -176,12 +180,10 @@
})
func aapt2Link(ctx android.ModuleContext,
- packageRes, genJar, proguardOptions, rTxt, extraPackages android.WritablePath,
+ packageRes, genJar, proguardOptions, rTxt android.WritablePath,
flags []string, deps android.Paths,
compiledRes, compiledOverlay, assetPackages android.Paths, splitPackages android.WritablePaths) {
- genDir := android.PathForModuleGen(ctx, "aapt2", "R")
-
var inFlags []string
if len(compiledRes) > 0 {
@@ -218,7 +220,7 @@
}
// Set auxiliary outputs as implicit outputs to establish correct dependency chains.
- implicitOutputs := append(splitPackages, proguardOptions, genJar, rTxt, extraPackages)
+ implicitOutputs := append(splitPackages, proguardOptions, rTxt)
linkOutput := packageRes
// AAPT2 ignores assets in overlays. Merge them after linking.
@@ -233,25 +235,49 @@
})
}
+ // Note the absence of splitPackages. The caller is supposed to compose and provide --split flag
+ // values via the flags parameter when it wants to split outputs.
+ // TODO(b/174509108): Perhaps we can process it in this func while keeping the code reasonably
+ // tidy.
+ args := map[string]string{
+ "flags": strings.Join(flags, " "),
+ "inFlags": strings.Join(inFlags, " "),
+ "proguardOptions": proguardOptions.String(),
+ "rTxt": rTxt.String(),
+ }
+
+ if genJar != nil {
+ // Generating java source files from aapt2 was requested, use aapt2LinkAndGenRule and pass it
+ // genJar and genDir args.
+ genDir := android.PathForModuleGen(ctx, "aapt2", "R")
+ ctx.Variable(pctx, "aapt2GenDir", genDir.String())
+ ctx.Variable(pctx, "aapt2GenJar", genJar.String())
+ implicitOutputs = append(implicitOutputs, genJar)
+ args["preamble"] = `rm -rf $aapt2GenDir && `
+ args["postamble"] = `&& ${config.SoongZipCmd} -write_if_changed -jar -o $aapt2GenJar -C $aapt2GenDir -D $aapt2GenDir && ` +
+ `rm -rf $aapt2GenDir`
+ args["flags"] += " --java $aapt2GenDir"
+ }
+
ctx.Build(pctx, android.BuildParams{
Rule: aapt2LinkRule,
Description: "aapt2 link",
Implicits: deps,
Output: linkOutput,
ImplicitOutputs: implicitOutputs,
- // Note the absence of splitPackages. The caller is supposed to compose and provide --split flag
- // values via the flags parameter when it wants to split outputs.
- // TODO(b/174509108): Perhaps we can process it in this func while keeping the code reasonably
- // tidy.
- Args: map[string]string{
- "flags": strings.Join(flags, " "),
- "inFlags": strings.Join(inFlags, " "),
- "proguardOptions": proguardOptions.String(),
- "genDir": genDir.String(),
- "genJar": genJar.String(),
- "rTxt": rTxt.String(),
- "extraPackages": extraPackages.String(),
- },
+ Args: args,
+ })
+}
+
+// aapt2ExtractExtraPackages takes a srcjar generated by aapt2 or a classes jar generated by ResourceProcessorBusyBox
+// and converts it to a text file containing a list of --extra_package arguments for passing to Make modules so they
+// correctly generate R.java entries for packages provided by transitive dependencies.
+func aapt2ExtractExtraPackages(ctx android.ModuleContext, out android.WritablePath, in android.Path) {
+ ctx.Build(pctx, android.BuildParams{
+ Rule: aapt2ExtractExtraPackagesRule,
+ Description: "aapt2 extract extra packages",
+ Input: in,
+ Output: out,
})
}
diff --git a/java/aar.go b/java/aar.go
index 180e1d7..1e38efc 100644
--- a/java/aar.go
+++ b/java/aar.go
@@ -376,13 +376,12 @@
}
packageRes := android.PathForModuleOut(ctx, "package-res.apk")
- // the subdir "android" is required to be filtered by package names
- srcJar := android.PathForModuleGen(ctx, "android", "R.srcjar")
proguardOptionsFile := android.PathForModuleGen(ctx, "proguard.options")
rTxt := android.PathForModuleOut(ctx, "R.txt")
// This file isn't used by Soong, but is generated for exporting
extraPackages := android.PathForModuleOut(ctx, "extra_packages")
var transitiveRJars android.Paths
+ var srcJar android.WritablePath
var compiledResDirs []android.Paths
for _, dir := range resDirs {
@@ -459,15 +458,19 @@
})
}
+ if !a.useResourceProcessorBusyBox() {
+ // the subdir "android" is required to be filtered by package names
+ srcJar = android.PathForModuleGen(ctx, "android", "R.srcjar")
+ }
+
// No need to specify assets from dependencies to aapt2Link for libraries, all transitive assets will be
// provided to the final app aapt2Link step.
var transitiveAssets android.Paths
if !a.isLibrary {
transitiveAssets = android.ReverseSliceInPlace(staticDeps.assets())
}
- aapt2Link(ctx, packageRes, srcJar, proguardOptionsFile, rTxt, extraPackages,
+ aapt2Link(ctx, packageRes, srcJar, proguardOptionsFile, rTxt,
linkFlags, linkDeps, compiledRes, compiledOverlay, transitiveAssets, splitPackages)
-
// Extract assets from the resource package output so that they can be used later in aapt2link
// for modules that depend on this one.
if android.PrefixInList(linkFlags, "-A ") {
@@ -484,8 +487,11 @@
if a.useResourceProcessorBusyBox() {
rJar := android.PathForModuleOut(ctx, "busybox/R.jar")
resourceProcessorBusyBoxGenerateBinaryR(ctx, rTxt, a.mergedManifestFile, rJar, staticDeps, a.isLibrary)
+ aapt2ExtractExtraPackages(ctx, extraPackages, rJar)
transitiveRJars = append(transitiveRJars, rJar)
a.rJar = rJar
+ } else {
+ aapt2ExtractExtraPackages(ctx, extraPackages, srcJar)
}
a.aaptSrcJar = srcJar
@@ -731,9 +737,10 @@
ctx.CheckbuildFile(a.aapt.proguardOptionsFile)
ctx.CheckbuildFile(a.aapt.exportPackage)
- ctx.CheckbuildFile(a.aapt.aaptSrcJar)
if a.useResourceProcessorBusyBox() {
ctx.CheckbuildFile(a.aapt.rJar)
+ } else {
+ ctx.CheckbuildFile(a.aapt.aaptSrcJar)
}
// apps manifests are handled by aapt, don't let Module see them
@@ -1063,8 +1070,6 @@
aapt2CompileZip(ctx, flata, a.aarPath, "res", compileFlags)
a.exportPackage = android.PathForModuleOut(ctx, "package-res.apk")
- // the subdir "android" is required to be filtered by package names
- srcJar := android.PathForModuleGen(ctx, "android", "R.srcjar")
proguardOptionsFile := android.PathForModuleGen(ctx, "proguard.options")
a.rTxt = android.PathForModuleOut(ctx, "R.txt")
a.extraAaptPackagesFile = android.PathForModuleOut(ctx, "extra_packages")
@@ -1100,12 +1105,14 @@
}
transitiveAssets := android.ReverseSliceInPlace(staticDeps.assets())
- aapt2Link(ctx, a.exportPackage, srcJar, proguardOptionsFile, a.rTxt, a.extraAaptPackagesFile,
+ aapt2Link(ctx, a.exportPackage, nil, proguardOptionsFile, a.rTxt,
linkFlags, linkDeps, nil, overlayRes, transitiveAssets, nil)
a.rJar = android.PathForModuleOut(ctx, "busybox/R.jar")
resourceProcessorBusyBoxGenerateBinaryR(ctx, a.rTxt, a.manifest, a.rJar, nil, true)
+ aapt2ExtractExtraPackages(ctx, a.extraAaptPackagesFile, a.rJar)
+
resourcesNodesDepSetBuilder := android.NewDepSetBuilder[*resourcesNode](android.TOPOLOGICAL)
resourcesNodesDepSetBuilder.Direct(&resourcesNode{
resPackage: a.exportPackage,
@@ -1305,7 +1312,11 @@
}
func (a *AndroidLibrary) ConvertWithBp2build(ctx android.TopDownMutatorContext) {
- commonAttrs, bp2buildInfo := a.convertLibraryAttrsBp2Build(ctx)
+ commonAttrs, bp2buildInfo, supported := a.convertLibraryAttrsBp2Build(ctx)
+ if !supported {
+ return
+ }
+
depLabels := bp2buildInfo.DepLabels
deps := depLabels.Deps
diff --git a/java/app.go b/java/app.go
index 224bc88..e277aed 100755
--- a/java/app.go
+++ b/java/app.go
@@ -1022,7 +1022,13 @@
case ".aapt.proguardOptionsFile":
return []android.Path{a.proguardOptionsFile}, nil
case ".aapt.srcjar":
- return []android.Path{a.aaptSrcJar}, nil
+ if a.aaptSrcJar != nil {
+ return []android.Path{a.aaptSrcJar}, nil
+ }
+ case ".aapt.jar":
+ if a.rJar != nil {
+ return []android.Path{a.rJar}, nil
+ }
case ".export-package.apk":
return []android.Path{a.exportPackage}, nil
}
@@ -1613,7 +1619,10 @@
// ConvertWithBp2build is used to convert android_app to Bazel.
func (a *AndroidApp) ConvertWithBp2build(ctx android.TopDownMutatorContext) {
- commonAttrs, bp2BuildInfo := a.convertLibraryAttrsBp2Build(ctx)
+ commonAttrs, bp2BuildInfo, supported := a.convertLibraryAttrsBp2Build(ctx)
+ if !supported {
+ return
+ }
depLabels := bp2BuildInfo.DepLabels
deps := depLabels.Deps
diff --git a/java/java.go b/java/java.go
index d1265f2..0d39a6a 100644
--- a/java/java.go
+++ b/java/java.go
@@ -26,6 +26,7 @@
"android/soong/bazel"
"android/soong/bazel/cquery"
"android/soong/remoteexec"
+ "android/soong/ui/metrics/bp2build_metrics_proto"
"github.com/google/blueprint"
"github.com/google/blueprint/proptools"
@@ -2827,7 +2828,7 @@
// which has other non-attribute information needed for bp2build conversion
// that needs different handling depending on the module types, and thus needs
// to be returned to the calling function.
-func (m *Library) convertLibraryAttrsBp2Build(ctx android.TopDownMutatorContext) (*javaCommonAttributes, *bp2BuildJavaInfo) {
+func (m *Library) convertLibraryAttrsBp2Build(ctx android.TopDownMutatorContext) (*javaCommonAttributes, *bp2BuildJavaInfo, bool) {
var srcs bazel.LabelListAttribute
var deps bazel.LabelListAttribute
var staticDeps bazel.LabelListAttribute
@@ -2838,6 +2839,10 @@
if archProps, ok := _props.(*CommonProperties); ok {
archSrcs := android.BazelLabelForModuleSrcExcludes(ctx, archProps.Srcs, archProps.Exclude_srcs)
srcs.SetSelectValue(axis, config, archSrcs)
+ if archProps.Jarjar_rules != nil {
+ ctx.MarkBp2buildUnconvertible(bp2build_metrics_proto.UnconvertedReasonType_PROPERTY_UNSUPPORTED, "jarjar_rules")
+ return &javaCommonAttributes{}, &bp2BuildJavaInfo{}, false
+ }
}
}
}
@@ -3005,7 +3010,7 @@
hasKotlin: hasKotlin,
}
- return commonAttrs, bp2BuildInfo
+ return commonAttrs, bp2BuildInfo, true
}
type javaLibraryAttributes struct {
@@ -3035,7 +3040,10 @@
}
func javaLibraryBp2Build(ctx android.TopDownMutatorContext, m *Library) {
- commonAttrs, bp2BuildInfo := m.convertLibraryAttrsBp2Build(ctx)
+ commonAttrs, bp2BuildInfo, supported := m.convertLibraryAttrsBp2Build(ctx)
+ if !supported {
+ return
+ }
depLabels := bp2BuildInfo.DepLabels
deps := depLabels.Deps
@@ -3082,7 +3090,10 @@
// JavaBinaryHostBp2Build is for java_binary_host bp2build.
func javaBinaryHostBp2Build(ctx android.TopDownMutatorContext, m *Binary) {
- commonAttrs, bp2BuildInfo := m.convertLibraryAttrsBp2Build(ctx)
+ commonAttrs, bp2BuildInfo, supported := m.convertLibraryAttrsBp2Build(ctx)
+ if !supported {
+ return
+ }
depLabels := bp2BuildInfo.DepLabels
deps := depLabels.Deps
@@ -3166,7 +3177,10 @@
// javaTestHostBp2Build is for java_test_host bp2build.
func javaTestHostBp2Build(ctx android.TopDownMutatorContext, m *TestHost) {
- commonAttrs, bp2BuildInfo := m.convertLibraryAttrsBp2Build(ctx)
+ commonAttrs, bp2BuildInfo, supported := m.convertLibraryAttrsBp2Build(ctx)
+ if !supported {
+ return
+ }
depLabels := bp2BuildInfo.DepLabels
deps := depLabels.Deps
diff --git a/java/plugin.go b/java/plugin.go
index 731dfda..5127298 100644
--- a/java/plugin.go
+++ b/java/plugin.go
@@ -66,7 +66,10 @@
// ConvertWithBp2build is used to convert android_app to Bazel.
func (p *Plugin) ConvertWithBp2build(ctx android.TopDownMutatorContext) {
pluginName := p.Name()
- commonAttrs, bp2BuildInfo := p.convertLibraryAttrsBp2Build(ctx)
+ commonAttrs, bp2BuildInfo, supported := p.convertLibraryAttrsBp2Build(ctx)
+ if !supported {
+ return
+ }
depLabels := bp2BuildInfo.DepLabels
deps := depLabels.Deps
diff --git a/python/bp2build.go b/python/bp2build.go
index 60cabc4..41e9f49 100644
--- a/python/bp2build.go
+++ b/python/bp2build.go
@@ -73,7 +73,6 @@
if !partitionedSrcs["proto"].IsEmpty() {
protoInfo, _ := android.Bp2buildProtoProperties(ctx, &m.ModuleBase, partitionedSrcs["proto"])
- protoLabel := bazel.Label{Label: ":" + protoInfo.Name}
pyProtoLibraryName := m.Name() + "_py_proto"
ctx.CreateBazelTargetModule(bazel.BazelTargetModuleProperties{
@@ -82,7 +81,7 @@
}, android.CommonAttributes{
Name: pyProtoLibraryName,
}, &bazelPythonProtoLibraryAttributes{
- Deps: bazel.MakeSingleLabelListAttribute(protoLabel),
+ Deps: bazel.MakeLabelListAttribute(protoInfo.Proto_libs),
})
attrs.Deps.Add(bazel.MakeLabelAttribute(":" + pyProtoLibraryName))
diff --git a/ui/build/config.go b/ui/build/config.go
index e5c9a50..cecc8fa 100644
--- a/ui/build/config.go
+++ b/ui/build/config.go
@@ -15,7 +15,6 @@
package build
import (
- "context"
"encoding/json"
"errors"
"fmt"
@@ -40,9 +39,6 @@
const (
envConfigDir = "vendor/google/tools/soong_config"
jsonSuffix = "json"
-
- configFetcher = "vendor/google/tools/soong/expconfigfetcher"
- envConfigFetchTimeout = 20 * time.Second
)
var (
@@ -174,87 +170,6 @@
}
}
-// fetchEnvConfig optionally fetches a configuration file that can then subsequently be
-// loaded into Soong environment to control certain aspects of build behavior (e.g., enabling RBE).
-// If a configuration file already exists on disk, the fetch is run in the background
-// so as to NOT block the rest of the build execution.
-func fetchEnvConfig(ctx Context, config *configImpl, envConfigName string) error {
- configName := envConfigName + "." + jsonSuffix
- expConfigFetcher := &smpb.ExpConfigFetcher{Filename: &configName}
- defer func() {
- ctx.Metrics.ExpConfigFetcher(expConfigFetcher)
- }()
- if !config.GoogleProdCredsExist() {
- status := smpb.ExpConfigFetcher_MISSING_GCERT
- expConfigFetcher.Status = &status
- return nil
- }
-
- s, err := os.Stat(configFetcher)
- if err != nil {
- if os.IsNotExist(err) {
- return nil
- }
- return err
- }
- if s.Mode()&0111 == 0 {
- status := smpb.ExpConfigFetcher_ERROR
- expConfigFetcher.Status = &status
- return fmt.Errorf("configuration fetcher binary %v is not executable: %v", configFetcher, s.Mode())
- }
-
- configExists := false
- outConfigFilePath := filepath.Join(config.OutDir(), configName)
- if _, err := os.Stat(outConfigFilePath); err == nil {
- configExists = true
- }
-
- tCtx, cancel := context.WithTimeout(ctx, envConfigFetchTimeout)
- fetchStart := time.Now()
- cmd := exec.CommandContext(tCtx, configFetcher, "-output_config_dir", config.OutDir(),
- "-output_config_name", configName)
- if err := cmd.Start(); err != nil {
- status := smpb.ExpConfigFetcher_ERROR
- expConfigFetcher.Status = &status
- return err
- }
-
- fetchCfg := func() error {
- if err := cmd.Wait(); err != nil {
- status := smpb.ExpConfigFetcher_ERROR
- expConfigFetcher.Status = &status
- return err
- }
- fetchEnd := time.Now()
- expConfigFetcher.Micros = proto.Uint64(uint64(fetchEnd.Sub(fetchStart).Microseconds()))
- expConfigFetcher.Filename = proto.String(outConfigFilePath)
-
- if _, err := os.Stat(outConfigFilePath); err != nil {
- status := smpb.ExpConfigFetcher_NO_CONFIG
- expConfigFetcher.Status = &status
- return err
- }
- status := smpb.ExpConfigFetcher_CONFIG
- expConfigFetcher.Status = &status
- return nil
- }
-
- // If a config file does not exist, wait for the config file to be fetched. Otherwise
- // fetch the config file in the background and return immediately.
- if !configExists {
- defer cancel()
- return fetchCfg()
- }
-
- go func() {
- defer cancel()
- if err := fetchCfg(); err != nil {
- ctx.Verbosef("Failed to fetch config file %v: %v\n", configName, err)
- }
- }()
- return nil
-}
-
func loadEnvConfig(ctx Context, config *configImpl, bc string) error {
if bc == "" {
return nil
@@ -368,9 +283,6 @@
bc := os.Getenv("ANDROID_BUILD_ENVIRONMENT_CONFIG")
if bc != "" {
- if err := fetchEnvConfig(ctx, ret, bc); err != nil {
- ctx.Verbosef("Failed to fetch config file: %v\n", err)
- }
if err := loadEnvConfig(ctx, ret, bc); err != nil {
ctx.Fatalln("Failed to parse env config files: %v", err)
}