Loading android/bazel.go +12 −15 Original line number Diff line number Diff line Loading @@ -340,7 +340,6 @@ var ( "pbtombstone", // depends on libprotobuf-cpp-lite, libtombstone_proto "crash_dump", // depends on unconverted module libprotobuf-cpp-lite "libprotobuf-cpp-full", "libprotobuf-cpp-lite", // Unsupported product&vendor suffix. b/204811222 and b/204810610. "libunwindstack_local", "libunwindstack_utils", // depends on unconverted module libunwindstack "libunwindstack", // depends on libdexfile_support, of unsupported module type art_cc_library_static Loading Loading @@ -375,19 +374,10 @@ var ( // APEX support "com.android.runtime", // http://b/194746715, apex, depends on 'libc_malloc_debug' "libadb_crypto", // Depends on libadb_protos "libadb_crypto_static", // Depends on libadb_protos_static "libadb_pairing_connection", // Depends on libadb_protos "libadb_pairing_connection_static", // Depends on libadb_protos_static "libadb_pairing_server", // Depends on libadb_protos "libadb_pairing_server_static", // Depends on libadb_protos_static "libadbd", // Depends on libadbd_core "libadbd_core", // Depends on libadb_protos "libadbd_services", // Depends on libadb_protos "libadbd_core", // http://b/208481704: requijres use_version_lib "libadbd_services", // http://b/208481704: requires use_version_lib "libadb_protos_static", // b/200601772: Requires cc_library proto support "libadb_protos", // b/200601772: Requires cc_library proto support "libapp_processes_protos_lite", // b/200601772: Requires cc_library proto support "libadbd", // depends on unconverted modules: libadbd_core, libadbd_services "libgtest_ndk_c++", // b/201816222: Requires sdk_version support. "libgtest_main_ndk_c++", // b/201816222: Requires sdk_version support. Loading Loading @@ -420,6 +410,13 @@ var ( "cap_names.h", // TODO(b/204913827) runfiles need to be handled in mixed builds "libcap", // TODO(b/204913827) runfiles need to be handled in mixed builds "libprotobuf-cpp-full", "libprotobuf-cpp-lite", // Unsupported product&vendor suffix. b/204811222 and b/204810610. // Depends on libprotobuf-cpp-* "libadb_crypto", "libadb_crypto_static", "libadb_pairing_connection", "libadb_pairing_connection_static", "libadb_pairing_server", "libadb_pairing_server_static", "libadb_protos_static", "libadb_protos", "libapp_processes_protos_lite", } // Used for quicker lookups Loading android/mutator.go +7 −0 Original line number Diff line number Diff line Loading @@ -221,6 +221,13 @@ var bp2buildMutators = map[string]RegisterMutatorFunc{} // See http://b/192523357 var bp2buildLock sync.Mutex // A minimal context for Bp2build conversion type Bp2buildMutatorContext interface { BazelConversionPathContext CreateBazelTargetModule(bazel.BazelTargetModuleProperties, CommonAttributes, interface{}) } // RegisterBp2BuildMutator registers specially crafted mutators for // converting Blueprint/Android modules into special modules that can // be code-generated into Bazel BUILD targets. Loading android/proto.go +60 −1 Original line number Diff line number Diff line Loading @@ -15,12 +15,17 @@ package android import ( "android/soong/bazel" "strings" "github.com/google/blueprint" "github.com/google/blueprint/proptools" ) const ( canonicalPathFromRootDefault = true ) // TODO(ccross): protos are often used to communicate between multiple modules. If the only // way to convert a proto to source is to reference it as a source file, and external modules cannot // reference source files in other modules, then every module that owns a proto file will need to Loading Loading @@ -90,7 +95,7 @@ func GetProtoFlags(ctx ModuleContext, p *ProtoProperties) ProtoFlags { Flags: flags, Deps: deps, OutTypeFlag: protoOutFlag, CanonicalPathFromRoot: proptools.BoolDefault(p.Proto.Canonical_path_from_root, true), CanonicalPathFromRoot: proptools.BoolDefault(p.Proto.Canonical_path_from_root, canonicalPathFromRootDefault), Dir: PathForModuleGen(ctx, "proto"), SubDir: PathForModuleGen(ctx, "proto", ctx.ModuleDir()), } Loading Loading @@ -146,3 +151,57 @@ func ProtoRule(rule *RuleBuilder, protoFile Path, flags ProtoFlags, deps Paths, rule.Command(). BuiltTool("dep_fixer").Flag(depFile.String()) } // Bp2buildProtoInfo contains information necessary to pass on to language specific conversion. type Bp2buildProtoInfo struct { Type *string Name string } type protoAttrs struct { Srcs bazel.LabelListAttribute Strip_import_prefix *string } // Bp2buildProtoProperties converts proto properties, creating a proto_library and returning the // information necessary for language-specific handling. func Bp2buildProtoProperties(ctx Bp2buildMutatorContext, module Module, srcs bazel.LabelListAttribute) (Bp2buildProtoInfo, bool) { var info Bp2buildProtoInfo if srcs.IsEmpty() { return info, false } m := module.base() info.Name = m.Name() + "_proto" attrs := protoAttrs{ Srcs: srcs, } 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 } } else if props.Proto.Type != info.Type && props.Proto.Type != nil { ctx.ModuleErrorf("Cannot handle arch-variant types for protos at this time.") } } } ctx.CreateBazelTargetModule( bazel.BazelTargetModuleProperties{Rule_class: "proto_library"}, CommonAttributes{Name: info.Name}, &attrs) return info, true } bazel/properties.go +40 −2 Original line number Diff line number Diff line Loading @@ -107,6 +107,14 @@ func (ll *LabelList) uniqueParentDirectories() []string { return dirs } // Add inserts the label Label at the end of the LabelList. func (ll *LabelList) Add(label *Label) { if label == nil { return } ll.Includes = append(ll.Includes, *label) } // Append appends the fields of other labelList to the corresponding fields of ll. func (ll *LabelList) Append(other LabelList) { if len(ll.Includes) > 0 || len(other.Includes) > 0 { Loading Loading @@ -366,6 +374,17 @@ func (ba *BoolAttribute) SortedConfigurationAxes() []ConfigurationAxis { // labelListSelectValues supports config-specific label_list typed Bazel attribute values. type labelListSelectValues map[string]LabelList func (ll labelListSelectValues) addSelects(label labelSelectValues) { for k, v := range label { if label == nil { continue } l := ll[k] (&l).Add(v) ll[k] = l } } func (ll labelListSelectValues) appendSelects(other labelListSelectValues) { for k, v := range other { l := ll[k] Loading Loading @@ -500,6 +519,25 @@ func (lla *LabelListAttribute) Append(other LabelListAttribute) { lla.ConfigurableValues.Append(other.ConfigurableValues) } // Add inserts the labels for each axis of LabelAttribute at the end of corresponding axis's // LabelList within the LabelListAttribute func (lla *LabelListAttribute) Add(label *LabelAttribute) { if label == nil { return } lla.Value.Add(label.Value) if lla.ConfigurableValues == nil && label.ConfigurableValues != nil { lla.ConfigurableValues = make(configurableLabelLists) } for axis, _ := range label.ConfigurableValues { if _, exists := lla.ConfigurableValues[axis]; !exists { lla.ConfigurableValues[axis] = make(labelListSelectValues) } lla.ConfigurableValues[axis].addSelects(label.ConfigurableValues[axis]) } } // HasConfigurableValues returns true if the attribute contains axis-specific label list values. func (lla LabelListAttribute) HasConfigurableValues() bool { return len(lla.ConfigurableValues) > 0 Loading Loading @@ -566,7 +604,7 @@ type OtherModuleContext interface { // LabelMapper is a function that takes a OtherModuleContext and returns a (potentially changed) // label and whether it was changed. type LabelMapper func(OtherModuleContext, string) (string, bool) type LabelMapper func(OtherModuleContext, Label) (string, bool) // LabelPartition contains descriptions of a partition for labels type LabelPartition struct { Loading @@ -588,7 +626,7 @@ type LabelPartitions map[string]LabelPartition // not. func (lf LabelPartition) filter(ctx OtherModuleContext, label Label) *Label { if lf.LabelMapper != nil { if newLabel, changed := lf.LabelMapper(ctx, label.Label); changed { if newLabel, changed := lf.LabelMapper(ctx, label); changed { return &Label{newLabel, label.OriginalModuleName} } } Loading bazel/properties_test.go +5 −5 Original line number Diff line number Diff line Loading @@ -313,16 +313,16 @@ func TestResolveExcludes(t *testing.T) { // labelAddSuffixForTypeMapper returns a LabelMapper that adds suffix to label name for modules of // typ func labelAddSuffixForTypeMapper(suffix, typ string) LabelMapper { return func(omc OtherModuleContext, label string) (string, bool) { m, ok := omc.ModuleFromName(label) return func(omc OtherModuleContext, label Label) (string, bool) { m, ok := omc.ModuleFromName(label.Label) if !ok { return label, false return label.Label, false } mTyp := omc.OtherModuleType(m) if typ == mTyp { return label + suffix, true return label.Label + suffix, true } return label, false return label.Label, false } } Loading Loading
android/bazel.go +12 −15 Original line number Diff line number Diff line Loading @@ -340,7 +340,6 @@ var ( "pbtombstone", // depends on libprotobuf-cpp-lite, libtombstone_proto "crash_dump", // depends on unconverted module libprotobuf-cpp-lite "libprotobuf-cpp-full", "libprotobuf-cpp-lite", // Unsupported product&vendor suffix. b/204811222 and b/204810610. "libunwindstack_local", "libunwindstack_utils", // depends on unconverted module libunwindstack "libunwindstack", // depends on libdexfile_support, of unsupported module type art_cc_library_static Loading Loading @@ -375,19 +374,10 @@ var ( // APEX support "com.android.runtime", // http://b/194746715, apex, depends on 'libc_malloc_debug' "libadb_crypto", // Depends on libadb_protos "libadb_crypto_static", // Depends on libadb_protos_static "libadb_pairing_connection", // Depends on libadb_protos "libadb_pairing_connection_static", // Depends on libadb_protos_static "libadb_pairing_server", // Depends on libadb_protos "libadb_pairing_server_static", // Depends on libadb_protos_static "libadbd", // Depends on libadbd_core "libadbd_core", // Depends on libadb_protos "libadbd_services", // Depends on libadb_protos "libadbd_core", // http://b/208481704: requijres use_version_lib "libadbd_services", // http://b/208481704: requires use_version_lib "libadb_protos_static", // b/200601772: Requires cc_library proto support "libadb_protos", // b/200601772: Requires cc_library proto support "libapp_processes_protos_lite", // b/200601772: Requires cc_library proto support "libadbd", // depends on unconverted modules: libadbd_core, libadbd_services "libgtest_ndk_c++", // b/201816222: Requires sdk_version support. "libgtest_main_ndk_c++", // b/201816222: Requires sdk_version support. Loading Loading @@ -420,6 +410,13 @@ var ( "cap_names.h", // TODO(b/204913827) runfiles need to be handled in mixed builds "libcap", // TODO(b/204913827) runfiles need to be handled in mixed builds "libprotobuf-cpp-full", "libprotobuf-cpp-lite", // Unsupported product&vendor suffix. b/204811222 and b/204810610. // Depends on libprotobuf-cpp-* "libadb_crypto", "libadb_crypto_static", "libadb_pairing_connection", "libadb_pairing_connection_static", "libadb_pairing_server", "libadb_pairing_server_static", "libadb_protos_static", "libadb_protos", "libapp_processes_protos_lite", } // Used for quicker lookups Loading
android/mutator.go +7 −0 Original line number Diff line number Diff line Loading @@ -221,6 +221,13 @@ var bp2buildMutators = map[string]RegisterMutatorFunc{} // See http://b/192523357 var bp2buildLock sync.Mutex // A minimal context for Bp2build conversion type Bp2buildMutatorContext interface { BazelConversionPathContext CreateBazelTargetModule(bazel.BazelTargetModuleProperties, CommonAttributes, interface{}) } // RegisterBp2BuildMutator registers specially crafted mutators for // converting Blueprint/Android modules into special modules that can // be code-generated into Bazel BUILD targets. Loading
android/proto.go +60 −1 Original line number Diff line number Diff line Loading @@ -15,12 +15,17 @@ package android import ( "android/soong/bazel" "strings" "github.com/google/blueprint" "github.com/google/blueprint/proptools" ) const ( canonicalPathFromRootDefault = true ) // TODO(ccross): protos are often used to communicate between multiple modules. If the only // way to convert a proto to source is to reference it as a source file, and external modules cannot // reference source files in other modules, then every module that owns a proto file will need to Loading Loading @@ -90,7 +95,7 @@ func GetProtoFlags(ctx ModuleContext, p *ProtoProperties) ProtoFlags { Flags: flags, Deps: deps, OutTypeFlag: protoOutFlag, CanonicalPathFromRoot: proptools.BoolDefault(p.Proto.Canonical_path_from_root, true), CanonicalPathFromRoot: proptools.BoolDefault(p.Proto.Canonical_path_from_root, canonicalPathFromRootDefault), Dir: PathForModuleGen(ctx, "proto"), SubDir: PathForModuleGen(ctx, "proto", ctx.ModuleDir()), } Loading Loading @@ -146,3 +151,57 @@ func ProtoRule(rule *RuleBuilder, protoFile Path, flags ProtoFlags, deps Paths, rule.Command(). BuiltTool("dep_fixer").Flag(depFile.String()) } // Bp2buildProtoInfo contains information necessary to pass on to language specific conversion. type Bp2buildProtoInfo struct { Type *string Name string } type protoAttrs struct { Srcs bazel.LabelListAttribute Strip_import_prefix *string } // Bp2buildProtoProperties converts proto properties, creating a proto_library and returning the // information necessary for language-specific handling. func Bp2buildProtoProperties(ctx Bp2buildMutatorContext, module Module, srcs bazel.LabelListAttribute) (Bp2buildProtoInfo, bool) { var info Bp2buildProtoInfo if srcs.IsEmpty() { return info, false } m := module.base() info.Name = m.Name() + "_proto" attrs := protoAttrs{ Srcs: srcs, } 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 } } else if props.Proto.Type != info.Type && props.Proto.Type != nil { ctx.ModuleErrorf("Cannot handle arch-variant types for protos at this time.") } } } ctx.CreateBazelTargetModule( bazel.BazelTargetModuleProperties{Rule_class: "proto_library"}, CommonAttributes{Name: info.Name}, &attrs) return info, true }
bazel/properties.go +40 −2 Original line number Diff line number Diff line Loading @@ -107,6 +107,14 @@ func (ll *LabelList) uniqueParentDirectories() []string { return dirs } // Add inserts the label Label at the end of the LabelList. func (ll *LabelList) Add(label *Label) { if label == nil { return } ll.Includes = append(ll.Includes, *label) } // Append appends the fields of other labelList to the corresponding fields of ll. func (ll *LabelList) Append(other LabelList) { if len(ll.Includes) > 0 || len(other.Includes) > 0 { Loading Loading @@ -366,6 +374,17 @@ func (ba *BoolAttribute) SortedConfigurationAxes() []ConfigurationAxis { // labelListSelectValues supports config-specific label_list typed Bazel attribute values. type labelListSelectValues map[string]LabelList func (ll labelListSelectValues) addSelects(label labelSelectValues) { for k, v := range label { if label == nil { continue } l := ll[k] (&l).Add(v) ll[k] = l } } func (ll labelListSelectValues) appendSelects(other labelListSelectValues) { for k, v := range other { l := ll[k] Loading Loading @@ -500,6 +519,25 @@ func (lla *LabelListAttribute) Append(other LabelListAttribute) { lla.ConfigurableValues.Append(other.ConfigurableValues) } // Add inserts the labels for each axis of LabelAttribute at the end of corresponding axis's // LabelList within the LabelListAttribute func (lla *LabelListAttribute) Add(label *LabelAttribute) { if label == nil { return } lla.Value.Add(label.Value) if lla.ConfigurableValues == nil && label.ConfigurableValues != nil { lla.ConfigurableValues = make(configurableLabelLists) } for axis, _ := range label.ConfigurableValues { if _, exists := lla.ConfigurableValues[axis]; !exists { lla.ConfigurableValues[axis] = make(labelListSelectValues) } lla.ConfigurableValues[axis].addSelects(label.ConfigurableValues[axis]) } } // HasConfigurableValues returns true if the attribute contains axis-specific label list values. func (lla LabelListAttribute) HasConfigurableValues() bool { return len(lla.ConfigurableValues) > 0 Loading Loading @@ -566,7 +604,7 @@ type OtherModuleContext interface { // LabelMapper is a function that takes a OtherModuleContext and returns a (potentially changed) // label and whether it was changed. type LabelMapper func(OtherModuleContext, string) (string, bool) type LabelMapper func(OtherModuleContext, Label) (string, bool) // LabelPartition contains descriptions of a partition for labels type LabelPartition struct { Loading @@ -588,7 +626,7 @@ type LabelPartitions map[string]LabelPartition // not. func (lf LabelPartition) filter(ctx OtherModuleContext, label Label) *Label { if lf.LabelMapper != nil { if newLabel, changed := lf.LabelMapper(ctx, label.Label); changed { if newLabel, changed := lf.LabelMapper(ctx, label); changed { return &Label{newLabel, label.OriginalModuleName} } } Loading
bazel/properties_test.go +5 −5 Original line number Diff line number Diff line Loading @@ -313,16 +313,16 @@ func TestResolveExcludes(t *testing.T) { // labelAddSuffixForTypeMapper returns a LabelMapper that adds suffix to label name for modules of // typ func labelAddSuffixForTypeMapper(suffix, typ string) LabelMapper { return func(omc OtherModuleContext, label string) (string, bool) { m, ok := omc.ModuleFromName(label) return func(omc OtherModuleContext, label Label) (string, bool) { m, ok := omc.ModuleFromName(label.Label) if !ok { return label, false return label.Label, false } mTyp := omc.OtherModuleType(m) if typ == mTyp { return label + suffix, true return label.Label + suffix, true } return label, false return label.Label, false } } Loading