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

Commit 85c0097d authored by Liz Kammer's avatar Liz Kammer Committed by Gerrit Code Review
Browse files

Merge "bp2build: support full/lite protos in cc libs"

parents a86cbd4a 12615dbb
Loading
Loading
Loading
Loading
+12 −15
Original line number Diff line number Diff line
@@ -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
@@ -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.
@@ -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
+7 −0
Original line number Diff line number Diff line
@@ -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.
+60 −1
Original line number Diff line number Diff line
@@ -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
@@ -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()),
	}
@@ -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
}
+40 −2
Original line number Diff line number Diff line
@@ -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 {
@@ -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]
@@ -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
@@ -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 {
@@ -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}
		}
	}
+5 −5
Original line number Diff line number Diff line
@@ -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