Merge "Handle xsd config more like other partitions" into main
This commit is contained in:
@@ -4029,43 +4029,26 @@ type XsdConfigBp2buildTargets interface {
|
|||||||
JavaBp2buildTargetName() string
|
JavaBp2buildTargetName() string
|
||||||
}
|
}
|
||||||
|
|
||||||
// PartitionXsdSrcs partitions srcs into xsd_config modules and others
|
// XsdModuleToTargetName is a function that takes an XsdConfigBp2buildTarget
|
||||||
// Since xsd_config are soong modules, we cannot use file extension for partitioning
|
type XsdModuleToTargetName func(xsd XsdConfigBp2buildTargets) string
|
||||||
func PartitionXsdSrcs(ctx BazelConversionPathContext, srcs []string) ([]string, []string) {
|
|
||||||
//isXsd returns true if src is a soong module of type xsd_config
|
// XsdLabelMapper returns a bazel.LabelMapper for partitioning XSD sources/headers given an
|
||||||
isXsd := func(src string) bool {
|
// XsdModuleToTargetName function.
|
||||||
mod, exists := ctx.ModuleFromName(src)
|
func XsdLabelMapper(targetName XsdModuleToTargetName) bazel.LabelMapper {
|
||||||
|
return func(ctx bazel.OtherModuleContext, label bazel.Label) (string, bool) {
|
||||||
|
mod, exists := ctx.ModuleFromName(label.OriginalModuleName)
|
||||||
if !exists {
|
if !exists {
|
||||||
return false
|
return label.Label, false
|
||||||
}
|
}
|
||||||
_, _isXsd := mod.(XsdConfigBp2buildTargets)
|
xsdMod, isXsd := mod.(XsdConfigBp2buildTargets)
|
||||||
return _isXsd
|
|
||||||
}
|
|
||||||
nonXsd := []string{}
|
|
||||||
xsd := []string{}
|
|
||||||
|
|
||||||
for _, src := range srcs {
|
|
||||||
if isXsd(src) {
|
|
||||||
xsd = append(xsd, src)
|
|
||||||
} else {
|
|
||||||
nonXsd = append(nonXsd, src)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nonXsd, xsd
|
|
||||||
}
|
|
||||||
|
|
||||||
// Replaces //a/b/my_xsd_config with //a/b/my_xsd_config-{cpp|java}
|
|
||||||
// The new target name is provided by the `targetName` callback function
|
|
||||||
func XsdConfigBp2buildTarget(ctx BazelConversionPathContext, mod blueprint.Module, targetName func(xsd XsdConfigBp2buildTargets) string) string {
|
|
||||||
xsd, isXsd := mod.(XsdConfigBp2buildTargets)
|
|
||||||
if !isXsd {
|
if !isXsd {
|
||||||
ctx.ModuleErrorf("xsdConfigJavaTarget called on %v, which is not an xsd_config", mod)
|
return label.Label, false
|
||||||
}
|
}
|
||||||
ret := BazelModuleLabel(ctx, mod)
|
|
||||||
// Remove the base module name
|
// Remove the base module name
|
||||||
ret = strings.TrimSuffix(ret, mod.Name())
|
ret := strings.TrimSuffix(label.Label, mod.Name())
|
||||||
// Append the language specific target name
|
// Append the language specific target name
|
||||||
ret += targetName(xsd)
|
ret += targetName(xsdMod)
|
||||||
return ret
|
return ret, true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -288,6 +288,41 @@ func SubtractBazelLabelList(haystack LabelList, needle LabelList) LabelList {
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FirstUniqueBazelLabelListAttribute takes a LabelListAttribute and makes the LabelList for
|
||||||
|
// each axis/configuration by keeping the first instance of a Label and omitting all subsequent
|
||||||
|
// repetitions.
|
||||||
|
func FirstUniqueBazelLabelListAttribute(attr LabelListAttribute) LabelListAttribute {
|
||||||
|
var result LabelListAttribute
|
||||||
|
result.Value = FirstUniqueBazelLabelList(attr.Value)
|
||||||
|
if attr.HasConfigurableValues() {
|
||||||
|
result.ConfigurableValues = make(configurableLabelLists)
|
||||||
|
}
|
||||||
|
for axis, configToLabels := range attr.ConfigurableValues {
|
||||||
|
for c, l := range configToLabels {
|
||||||
|
result.SetSelectValue(axis, c, FirstUniqueBazelLabelList(l))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// SubtractBazelLabelListAttribute subtract needle from haystack for LabelList in each
|
||||||
|
// axis/configuration.
|
||||||
|
func SubtractBazelLabelListAttribute(haystack LabelListAttribute, needle LabelListAttribute) LabelListAttribute {
|
||||||
|
var result LabelListAttribute
|
||||||
|
result.Value = SubtractBazelLabelList(haystack.Value, needle.Value)
|
||||||
|
if haystack.HasConfigurableValues() {
|
||||||
|
result.ConfigurableValues = make(configurableLabelLists)
|
||||||
|
}
|
||||||
|
for axis, configToLabels := range haystack.ConfigurableValues {
|
||||||
|
for haystackConfig, haystackLabels := range configToLabels {
|
||||||
|
result.SetSelectValue(axis, haystackConfig, SubtractBazelLabelList(haystackLabels, needle.SelectValue(axis, haystackConfig)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
type Attribute interface {
|
type Attribute interface {
|
||||||
HasConfigurableValues() bool
|
HasConfigurableValues() bool
|
||||||
}
|
}
|
||||||
|
@@ -125,6 +125,63 @@ func TestSubtractBazelLabelList(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSubtractBazelLabelListAttribute(t *testing.T) {
|
||||||
|
testCases := []struct {
|
||||||
|
haystack LabelListAttribute
|
||||||
|
needle LabelListAttribute
|
||||||
|
expected LabelListAttribute
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
haystack: LabelListAttribute{
|
||||||
|
Value: makeLabelList(
|
||||||
|
[]string{"a", "b", "a", "c"},
|
||||||
|
[]string{"x", "x", "y", "z"},
|
||||||
|
),
|
||||||
|
ConfigurableValues: configurableLabelLists{
|
||||||
|
ArchConfigurationAxis: labelListSelectValues{
|
||||||
|
"arm": makeLabelList([]string{"arm_1", "arm_2"}, []string{}),
|
||||||
|
"x86": makeLabelList([]string{"x86_3", "x86_4", "x86_5"}, []string{"x86_5"}),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
needle: LabelListAttribute{
|
||||||
|
Value: makeLabelList(
|
||||||
|
[]string{"d", "a"},
|
||||||
|
[]string{"x", "y2", "z2"},
|
||||||
|
),
|
||||||
|
ConfigurableValues: configurableLabelLists{
|
||||||
|
ArchConfigurationAxis: labelListSelectValues{
|
||||||
|
"arm": makeLabelList([]string{"arm_1", "arm_3"}, []string{}),
|
||||||
|
"x86": makeLabelList([]string{"x86_3", "x86_4"}, []string{"x86_6"}),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expected: LabelListAttribute{
|
||||||
|
Value: makeLabelList(
|
||||||
|
[]string{"b", "c"},
|
||||||
|
[]string{"x", "x", "y", "z"},
|
||||||
|
),
|
||||||
|
ConfigurableValues: configurableLabelLists{
|
||||||
|
ArchConfigurationAxis: labelListSelectValues{
|
||||||
|
"arm": makeLabelList([]string{"arm_2"}, []string{}),
|
||||||
|
"x86": makeLabelList([]string{"x86_5"}, []string{"x86_5"}),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
ForceSpecifyEmptyList: false,
|
||||||
|
EmitEmptyList: false,
|
||||||
|
Prepend: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tc := range testCases {
|
||||||
|
got := SubtractBazelLabelListAttribute(tc.haystack, tc.needle)
|
||||||
|
if !reflect.DeepEqual(tc.expected, got) {
|
||||||
|
t.Fatalf("Expected\n%v, but got\n%v", tc.expected, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestFirstUniqueBazelLabelList(t *testing.T) {
|
func TestFirstUniqueBazelLabelList(t *testing.T) {
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
originalLabelList LabelList
|
originalLabelList LabelList
|
||||||
@@ -167,6 +224,46 @@ func TestFirstUniqueBazelLabelList(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestFirstUniqueBazelLabelListAttribute(t *testing.T) {
|
||||||
|
testCases := []struct {
|
||||||
|
originalLabelList LabelListAttribute
|
||||||
|
expectedUniqueLabelList LabelListAttribute
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
originalLabelList: LabelListAttribute{
|
||||||
|
Value: makeLabelList(
|
||||||
|
[]string{"a", "b", "a", "c"},
|
||||||
|
[]string{"x", "x", "y", "z"},
|
||||||
|
),
|
||||||
|
ConfigurableValues: configurableLabelLists{
|
||||||
|
ArchConfigurationAxis: labelListSelectValues{
|
||||||
|
"arm": makeLabelList([]string{"1", "2", "1"}, []string{}),
|
||||||
|
"x86": makeLabelList([]string{"3", "4", "4"}, []string{"5", "5"}),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expectedUniqueLabelList: LabelListAttribute{
|
||||||
|
Value: makeLabelList(
|
||||||
|
[]string{"a", "b", "c"},
|
||||||
|
[]string{"x", "y", "z"},
|
||||||
|
),
|
||||||
|
ConfigurableValues: configurableLabelLists{
|
||||||
|
ArchConfigurationAxis: labelListSelectValues{
|
||||||
|
"arm": makeLabelList([]string{"1", "2"}, []string{}),
|
||||||
|
"x86": makeLabelList([]string{"3", "4"}, []string{"5"}),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tc := range testCases {
|
||||||
|
actualUniqueLabelList := FirstUniqueBazelLabelListAttribute(tc.originalLabelList)
|
||||||
|
if !reflect.DeepEqual(tc.expectedUniqueLabelList, actualUniqueLabelList) {
|
||||||
|
t.Fatalf("Expected %v, got %v", tc.expectedUniqueLabelList, actualUniqueLabelList)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestUniqueSortedBazelLabelList(t *testing.T) {
|
func TestUniqueSortedBazelLabelList(t *testing.T) {
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
originalLabelList LabelList
|
originalLabelList LabelList
|
||||||
|
144
cc/bp2build.go
144
cc/bp2build.go
@@ -43,6 +43,10 @@ const (
|
|||||||
|
|
||||||
rScriptSrcPartition = "renderScript"
|
rScriptSrcPartition = "renderScript"
|
||||||
|
|
||||||
|
xsdSrcPartition = "xsd"
|
||||||
|
|
||||||
|
hdrPartition = "hdr"
|
||||||
|
|
||||||
stubsSuffix = "_stub_libs_current"
|
stubsSuffix = "_stub_libs_current"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -155,6 +159,7 @@ func groupSrcsByExtension(ctx android.BazelConversionPathContext, srcs bazel.Lab
|
|||||||
lSrcPartition: bazel.LabelPartition{Extensions: []string{".l"}},
|
lSrcPartition: bazel.LabelPartition{Extensions: []string{".l"}},
|
||||||
llSrcPartition: bazel.LabelPartition{Extensions: []string{".ll"}},
|
llSrcPartition: bazel.LabelPartition{Extensions: []string{".ll"}},
|
||||||
rScriptSrcPartition: bazel.LabelPartition{Extensions: []string{".fs", ".rscript"}},
|
rScriptSrcPartition: bazel.LabelPartition{Extensions: []string{".fs", ".rscript"}},
|
||||||
|
xsdSrcPartition: bazel.LabelPartition{LabelMapper: android.XsdLabelMapper(xsdConfigCppTarget)},
|
||||||
// C++ is the "catch-all" group, and comprises generated sources because we don't
|
// C++ is the "catch-all" group, and comprises generated sources because we don't
|
||||||
// know the language of these sources until the genrule is executed.
|
// know the language of these sources until the genrule is executed.
|
||||||
cppSrcPartition: bazel.LabelPartition{Extensions: []string{".cpp", ".cc", ".cxx", ".mm"}, LabelMapper: addSuffixForFilegroup("_cpp_srcs"), Keep_remainder: true},
|
cppSrcPartition: bazel.LabelPartition{Extensions: []string{".cpp", ".cc", ".cxx", ".mm"}, LabelMapper: addSuffixForFilegroup("_cpp_srcs"), Keep_remainder: true},
|
||||||
@@ -165,6 +170,14 @@ func groupSrcsByExtension(ctx android.BazelConversionPathContext, srcs bazel.Lab
|
|||||||
return bazel.PartitionLabelListAttribute(ctx, &srcs, labels)
|
return bazel.PartitionLabelListAttribute(ctx, &srcs, labels)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func partitionHeaders(ctx android.BazelConversionPathContext, hdrs bazel.LabelListAttribute) bazel.PartitionToLabelListAttribute {
|
||||||
|
labels := bazel.LabelPartitions{
|
||||||
|
xsdSrcPartition: bazel.LabelPartition{LabelMapper: android.XsdLabelMapper(xsdConfigCppTarget)},
|
||||||
|
hdrPartition: bazel.LabelPartition{Keep_remainder: true},
|
||||||
|
}
|
||||||
|
return bazel.PartitionLabelListAttribute(ctx, &hdrs, labels)
|
||||||
|
}
|
||||||
|
|
||||||
// bp2BuildParseLibProps returns the attributes for a variant of a cc_library.
|
// bp2BuildParseLibProps returns the attributes for a variant of a cc_library.
|
||||||
func bp2BuildParseLibProps(ctx android.BazelConversionPathContext, module *Module, isStatic bool) staticOrSharedAttributes {
|
func bp2BuildParseLibProps(ctx android.BazelConversionPathContext, module *Module, isStatic bool) staticOrSharedAttributes {
|
||||||
lib, ok := module.compiler.(*libraryDecorator)
|
lib, ok := module.compiler.(*libraryDecorator)
|
||||||
@@ -403,7 +416,8 @@ type compilerAttributes struct {
|
|||||||
srcs bazel.LabelListAttribute
|
srcs bazel.LabelListAttribute
|
||||||
|
|
||||||
// xsd config sources
|
// xsd config sources
|
||||||
xsdInSrcs bazel.StringListAttribute
|
xsdSrcs bazel.LabelListAttribute
|
||||||
|
exportXsdSrcs bazel.LabelListAttribute
|
||||||
|
|
||||||
// Lex sources and options
|
// Lex sources and options
|
||||||
lSrcs bazel.LabelListAttribute
|
lSrcs bazel.LabelListAttribute
|
||||||
@@ -494,14 +508,11 @@ func parseCommandLineFlags(soongFlags []string, filterOut ...filterOutFn) []stri
|
|||||||
func (ca *compilerAttributes) bp2buildForAxisAndConfig(ctx android.BazelConversionPathContext, axis bazel.ConfigurationAxis, config string, props *BaseCompilerProperties) {
|
func (ca *compilerAttributes) bp2buildForAxisAndConfig(ctx android.BazelConversionPathContext, axis bazel.ConfigurationAxis, config string, props *BaseCompilerProperties) {
|
||||||
// If there's arch specific srcs or exclude_srcs, generate a select entry for it.
|
// If there's arch specific srcs or exclude_srcs, generate a select entry for it.
|
||||||
// TODO(b/186153868): do this for OS specific srcs and exclude_srcs too.
|
// TODO(b/186153868): do this for OS specific srcs and exclude_srcs too.
|
||||||
srcsList, xsdList, ok := parseSrcs(ctx, props)
|
srcsList, ok := parseSrcs(ctx, props)
|
||||||
|
|
||||||
if ok {
|
if ok {
|
||||||
ca.srcs.SetSelectValue(axis, config, srcsList)
|
ca.srcs.SetSelectValue(axis, config, srcsList)
|
||||||
}
|
}
|
||||||
if len(xsdList) > 0 {
|
|
||||||
ca.xsdInSrcs.SetSelectValue(axis, config, xsdList)
|
|
||||||
}
|
|
||||||
|
|
||||||
localIncludeDirs := props.Local_include_dirs
|
localIncludeDirs := props.Local_include_dirs
|
||||||
if axis == bazel.NoConfigAxis {
|
if axis == bazel.NoConfigAxis {
|
||||||
@@ -568,9 +579,11 @@ func (ca *compilerAttributes) convertProductVariables(ctx android.BazelConversio
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ca *compilerAttributes) finalize(ctx android.BazelConversionPathContext, implementationHdrs bazel.LabelListAttribute) {
|
func (ca *compilerAttributes) finalize(ctx android.BazelConversionPathContext, implementationHdrs, exportHdrs bazel.LabelListAttribute) {
|
||||||
ca.srcs.ResolveExcludes()
|
ca.srcs.ResolveExcludes()
|
||||||
partitionedSrcs := groupSrcsByExtension(ctx, ca.srcs)
|
partitionedSrcs := groupSrcsByExtension(ctx, ca.srcs)
|
||||||
|
partitionedImplHdrs := partitionHeaders(ctx, implementationHdrs)
|
||||||
|
partitionedHdrs := partitionHeaders(ctx, exportHdrs)
|
||||||
|
|
||||||
ca.protoSrcs = partitionedSrcs[protoSrcPartition]
|
ca.protoSrcs = partitionedSrcs[protoSrcPartition]
|
||||||
ca.aidlSrcs = partitionedSrcs[aidlSrcPartition]
|
ca.aidlSrcs = partitionedSrcs[aidlSrcPartition]
|
||||||
@@ -580,10 +593,19 @@ func (ca *compilerAttributes) finalize(ctx android.BazelConversionPathContext, i
|
|||||||
if lla.IsEmpty() {
|
if lla.IsEmpty() {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
lla.Append(implementationHdrs)
|
lla.Append(partitionedImplHdrs[hdrPartition])
|
||||||
partitionedSrcs[p] = lla
|
partitionedSrcs[p] = lla
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ca.hdrs = partitionedHdrs[hdrPartition]
|
||||||
|
|
||||||
|
ca.includesFromHeaders(ctx, partitionedImplHdrs[hdrPartition], partitionedHdrs[hdrPartition])
|
||||||
|
|
||||||
|
xsdSrcs := bazel.SubtractBazelLabelListAttribute(partitionedSrcs[xsdSrcPartition], partitionedHdrs[xsdSrcPartition])
|
||||||
|
xsdSrcs.Append(partitionedImplHdrs[xsdSrcPartition])
|
||||||
|
ca.exportXsdSrcs = partitionedHdrs[xsdSrcPartition]
|
||||||
|
ca.xsdSrcs = bazel.FirstUniqueBazelLabelListAttribute(xsdSrcs)
|
||||||
|
|
||||||
ca.srcs = partitionedSrcs[cppSrcPartition]
|
ca.srcs = partitionedSrcs[cppSrcPartition]
|
||||||
ca.cSrcs = partitionedSrcs[cSrcPartition]
|
ca.cSrcs = partitionedSrcs[cSrcPartition]
|
||||||
ca.asSrcs = partitionedSrcs[asSrcPartition]
|
ca.asSrcs = partitionedSrcs[asSrcPartition]
|
||||||
@@ -604,11 +626,11 @@ func (ca *compilerAttributes) finalize(ctx android.BazelConversionPathContext, i
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Parse srcs from an arch or OS's props value.
|
// Parse srcs from an arch or OS's props value.
|
||||||
func parseSrcs(ctx android.BazelConversionPathContext, props *BaseCompilerProperties) (bazel.LabelList, []string, bool) {
|
func parseSrcs(ctx android.BazelConversionPathContext, props *BaseCompilerProperties) (bazel.LabelList, bool) {
|
||||||
anySrcs := false
|
anySrcs := false
|
||||||
// Add srcs-like dependencies such as generated files.
|
// Add srcs-like dependencies such as generated files.
|
||||||
// First create a LabelList containing these dependencies, then merge the values with srcs.
|
// First create a LabelList containing these dependencies, then merge the values with srcs.
|
||||||
genSrcs, xsd := android.PartitionXsdSrcs(ctx, props.Generated_sources)
|
genSrcs := props.Generated_sources
|
||||||
generatedSrcsLabelList := android.BazelLabelForModuleDepsExcludes(ctx, genSrcs, props.Exclude_generated_sources)
|
generatedSrcsLabelList := android.BazelLabelForModuleDepsExcludes(ctx, genSrcs, props.Exclude_generated_sources)
|
||||||
if len(props.Generated_sources) > 0 || len(props.Exclude_generated_sources) > 0 {
|
if len(props.Generated_sources) > 0 || len(props.Exclude_generated_sources) > 0 {
|
||||||
anySrcs = true
|
anySrcs = true
|
||||||
@@ -620,7 +642,7 @@ func parseSrcs(ctx android.BazelConversionPathContext, props *BaseCompilerProper
|
|||||||
anySrcs = true
|
anySrcs = true
|
||||||
}
|
}
|
||||||
|
|
||||||
return bazel.AppendBazelLabelLists(allSrcsLabelList, generatedSrcsLabelList), xsd, anySrcs
|
return bazel.AppendBazelLabelLists(allSrcsLabelList, generatedSrcsLabelList), anySrcs
|
||||||
}
|
}
|
||||||
|
|
||||||
func bp2buildStdVal(std *string, prefix string, useGnu bool) *string {
|
func bp2buildStdVal(std *string, prefix string, useGnu bool) *string {
|
||||||
@@ -667,8 +689,43 @@ func packageFromLabel(label string) (string, bool) {
|
|||||||
return split[0][2:], true
|
return split[0][2:], true
|
||||||
}
|
}
|
||||||
|
|
||||||
// includesFromLabelList extracts relative/absolute includes from a bazel.LabelList>
|
// includesFromHeaders gets the include directories needed from generated headers
|
||||||
func includesFromLabelList(labelList bazel.LabelList) (relative, absolute []string) {
|
func (ca *compilerAttributes) includesFromHeaders(ctx android.BazelConversionPathContext, implHdrs, hdrs bazel.LabelListAttribute) {
|
||||||
|
local, absolute := includesFromLabelListAttribute(implHdrs, ca.localIncludes, ca.absoluteIncludes)
|
||||||
|
localExport, absoluteExport := includesFromLabelListAttribute(hdrs, ca.includes.Includes, ca.includes.AbsoluteIncludes)
|
||||||
|
|
||||||
|
ca.localIncludes = local
|
||||||
|
ca.absoluteIncludes = absolute
|
||||||
|
|
||||||
|
ca.includes.Includes = localExport
|
||||||
|
ca.includes.AbsoluteIncludes = absoluteExport
|
||||||
|
}
|
||||||
|
|
||||||
|
// includesFromLabelList extracts the packages from a LabelListAttribute that should be includes and
|
||||||
|
// combines them with existing local/absolute includes.
|
||||||
|
func includesFromLabelListAttribute(attr bazel.LabelListAttribute, existingLocal, existingAbsolute bazel.StringListAttribute) (bazel.StringListAttribute, bazel.StringListAttribute) {
|
||||||
|
localAttr := existingLocal.Clone()
|
||||||
|
absoluteAttr := existingAbsolute.Clone()
|
||||||
|
if !attr.Value.IsEmpty() {
|
||||||
|
l, a := includesFromLabelList(attr.Value, existingLocal.Value, existingAbsolute.Value)
|
||||||
|
localAttr.SetSelectValue(bazel.NoConfigAxis, "", l)
|
||||||
|
absoluteAttr.SetSelectValue(bazel.NoConfigAxis, "", a)
|
||||||
|
}
|
||||||
|
for axis, configToLabels := range attr.ConfigurableValues {
|
||||||
|
for c, labels := range configToLabels {
|
||||||
|
local := existingLocal.SelectValue(axis, c)
|
||||||
|
absolute := existingAbsolute.SelectValue(axis, c)
|
||||||
|
l, a := includesFromLabelList(labels, local, absolute)
|
||||||
|
localAttr.SetSelectValue(axis, c, l)
|
||||||
|
absoluteAttr.SetSelectValue(axis, c, a)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return *localAttr, *absoluteAttr
|
||||||
|
}
|
||||||
|
|
||||||
|
// includesFromLabelList extracts relative/absolute includes from a bazel.LabelList.
|
||||||
|
func includesFromLabelList(labelList bazel.LabelList, existingRel, existingAbs []string) ([]string, []string) {
|
||||||
|
var relative, absolute []string
|
||||||
for _, hdr := range labelList.Includes {
|
for _, hdr := range labelList.Includes {
|
||||||
if pkg, hasPkg := packageFromLabel(hdr.Label); hasPkg {
|
if pkg, hasPkg := packageFromLabel(hdr.Label); hasPkg {
|
||||||
absolute = append(absolute, pkg)
|
absolute = append(absolute, pkg)
|
||||||
@@ -676,6 +733,12 @@ func includesFromLabelList(labelList bazel.LabelList) (relative, absolute []stri
|
|||||||
relative = append(relative, pkg)
|
relative = append(relative, pkg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if len(relative)+len(existingRel) != 0 {
|
||||||
|
relative = android.FirstUniqueStrings(append(append([]string{}, existingRel...), relative...))
|
||||||
|
}
|
||||||
|
if len(absolute)+len(existingAbs) != 0 {
|
||||||
|
absolute = android.FirstUniqueStrings(append(append([]string{}, existingAbs...), absolute...))
|
||||||
|
}
|
||||||
return relative, absolute
|
return relative, absolute
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -740,8 +803,6 @@ func bp2BuildParseBaseProps(ctx android.Bp2buildMutatorContext, module *Module)
|
|||||||
archVariantLinkerProps := module.GetArchVariantProperties(ctx, &BaseLinkerProperties{})
|
archVariantLinkerProps := module.GetArchVariantProperties(ctx, &BaseLinkerProperties{})
|
||||||
archVariantLibraryProperties := module.GetArchVariantProperties(ctx, &LibraryProperties{})
|
archVariantLibraryProperties := module.GetArchVariantProperties(ctx, &LibraryProperties{})
|
||||||
|
|
||||||
var implementationHdrs bazel.LabelListAttribute
|
|
||||||
|
|
||||||
axisToConfigs := map[bazel.ConfigurationAxis]map[string]bool{}
|
axisToConfigs := map[bazel.ConfigurationAxis]map[string]bool{}
|
||||||
allAxesAndConfigs := func(cp android.ConfigurationAxisToArchVariantProperties) {
|
allAxesAndConfigs := func(cp android.ConfigurationAxisToArchVariantProperties) {
|
||||||
for axis, configMap := range cp {
|
for axis, configMap := range cp {
|
||||||
@@ -761,6 +822,7 @@ func bp2BuildParseBaseProps(ctx android.Bp2buildMutatorContext, module *Module)
|
|||||||
linkerAttrs := linkerAttributes{}
|
linkerAttrs := linkerAttributes{}
|
||||||
|
|
||||||
var aidlLibs bazel.LabelList
|
var aidlLibs bazel.LabelList
|
||||||
|
var implementationHdrs, exportHdrs bazel.LabelListAttribute
|
||||||
|
|
||||||
// Iterate through these axes in a deterministic order. This is required
|
// Iterate through these axes in a deterministic order. This is required
|
||||||
// because processing certain dependencies may result in concatenating
|
// because processing certain dependencies may result in concatenating
|
||||||
@@ -770,9 +832,9 @@ func bp2BuildParseBaseProps(ctx android.Bp2buildMutatorContext, module *Module)
|
|||||||
for _, axis := range bazel.SortedConfigurationAxes(axisToConfigs) {
|
for _, axis := range bazel.SortedConfigurationAxes(axisToConfigs) {
|
||||||
configs := axisToConfigs[axis]
|
configs := axisToConfigs[axis]
|
||||||
for cfg := range configs {
|
for cfg := range configs {
|
||||||
var allHdrs, allHdrsXsd []string
|
var allHdrs []string
|
||||||
if baseCompilerProps, ok := archVariantCompilerProps[axis][cfg].(*BaseCompilerProperties); ok {
|
if baseCompilerProps, ok := archVariantCompilerProps[axis][cfg].(*BaseCompilerProperties); ok {
|
||||||
allHdrs, allHdrsXsd = android.PartitionXsdSrcs(ctx, baseCompilerProps.Generated_headers)
|
allHdrs = baseCompilerProps.Generated_headers
|
||||||
|
|
||||||
if baseCompilerProps.Lex != nil {
|
if baseCompilerProps.Lex != nil {
|
||||||
compilerAttrs.lexopts.SetSelectValue(axis, cfg, baseCompilerProps.Lex.Flags)
|
compilerAttrs.lexopts.SetSelectValue(axis, cfg, baseCompilerProps.Lex.Flags)
|
||||||
@@ -786,36 +848,17 @@ func bp2BuildParseBaseProps(ctx android.Bp2buildMutatorContext, module *Module)
|
|||||||
aidlLibs.Append(android.BazelLabelForModuleDeps(ctx, baseCompilerProps.Aidl.Libs))
|
aidlLibs.Append(android.BazelLabelForModuleDeps(ctx, baseCompilerProps.Aidl.Libs))
|
||||||
}
|
}
|
||||||
|
|
||||||
var exportHdrs, exportHdrsXsd []string
|
var exportedHdrs []string
|
||||||
|
|
||||||
if baseLinkerProps, ok := archVariantLinkerProps[axis][cfg].(*BaseLinkerProperties); ok {
|
if baseLinkerProps, ok := archVariantLinkerProps[axis][cfg].(*BaseLinkerProperties); ok {
|
||||||
exportHdrs, exportHdrsXsd = android.PartitionXsdSrcs(ctx, baseLinkerProps.Export_generated_headers)
|
exportedHdrs = baseLinkerProps.Export_generated_headers
|
||||||
(&linkerAttrs).bp2buildForAxisAndConfig(ctx, module, axis, cfg, baseLinkerProps)
|
(&linkerAttrs).bp2buildForAxisAndConfig(ctx, module, axis, cfg, baseLinkerProps)
|
||||||
}
|
}
|
||||||
|
|
||||||
// in the synthetic bp2build workspace, xsd sources are compiled to a static library
|
headers := maybePartitionExportedAndImplementationsDeps(ctx, !module.Binary(), allHdrs, exportedHdrs, android.BazelLabelForModuleDeps)
|
||||||
xsdList := compilerAttrs.xsdInSrcs.SelectValue(axis, cfg)
|
|
||||||
allHdrsXsd = android.FirstUniqueStrings(append(xsdList, allHdrsXsd...))
|
|
||||||
headers := maybePartitionExportedAndImplementationsDeps(ctx, !module.Binary(), allHdrs, exportHdrs, android.BazelLabelForModuleDeps)
|
|
||||||
xsdConfigLibs := maybePartitionExportedAndImplementationsDeps(ctx, !module.Binary(), allHdrsXsd, exportHdrsXsd, bazelLabelForXsdConfig)
|
|
||||||
|
|
||||||
implementationHdrs.SetSelectValue(axis, cfg, headers.implementation)
|
implementationHdrs.SetSelectValue(axis, cfg, headers.implementation)
|
||||||
compilerAttrs.hdrs.SetSelectValue(axis, cfg, headers.export)
|
exportHdrs.SetSelectValue(axis, cfg, headers.export)
|
||||||
|
|
||||||
exportIncludes, exportAbsoluteIncludes := includesFromLabelList(headers.export)
|
|
||||||
compilerAttrs.includes.Includes.SetSelectValue(axis, cfg, exportIncludes)
|
|
||||||
compilerAttrs.includes.AbsoluteIncludes.SetSelectValue(axis, cfg, exportAbsoluteIncludes)
|
|
||||||
|
|
||||||
includes, absoluteIncludes := includesFromLabelList(headers.implementation)
|
|
||||||
currAbsoluteIncludes := compilerAttrs.absoluteIncludes.SelectValue(axis, cfg)
|
|
||||||
currAbsoluteIncludes = android.FirstUniqueStrings(append(currAbsoluteIncludes, absoluteIncludes...))
|
|
||||||
|
|
||||||
compilerAttrs.absoluteIncludes.SetSelectValue(axis, cfg, currAbsoluteIncludes)
|
|
||||||
|
|
||||||
currIncludes := compilerAttrs.localIncludes.SelectValue(axis, cfg)
|
|
||||||
currIncludes = android.FirstUniqueStrings(append(currIncludes, includes...))
|
|
||||||
|
|
||||||
compilerAttrs.localIncludes.SetSelectValue(axis, cfg, currIncludes)
|
|
||||||
|
|
||||||
if libraryProps, ok := archVariantLibraryProperties[axis][cfg].(*LibraryProperties); ok {
|
if libraryProps, ok := archVariantLibraryProperties[axis][cfg].(*LibraryProperties); ok {
|
||||||
if axis == bazel.NoConfigAxis {
|
if axis == bazel.NoConfigAxis {
|
||||||
@@ -835,14 +878,6 @@ func bp2BuildParseBaseProps(ctx android.Bp2buildMutatorContext, module *Module)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(allHdrsXsd) > 0 {
|
|
||||||
wholeStaticLibs := linkerAttrs.implementationWholeArchiveDeps.SelectValue(axis, cfg)
|
|
||||||
(&wholeStaticLibs).Append(xsdConfigLibs.implementation)
|
|
||||||
linkerAttrs.implementationWholeArchiveDeps.SetSelectValue(axis, cfg, wholeStaticLibs)
|
|
||||||
wholeStaticLibs = linkerAttrs.wholeArchiveDeps.SelectValue(axis, cfg)
|
|
||||||
(&wholeStaticLibs).Append(xsdConfigLibs.export)
|
|
||||||
linkerAttrs.wholeArchiveDeps.SetSelectValue(axis, cfg, wholeStaticLibs)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -860,11 +895,14 @@ func bp2BuildParseBaseProps(ctx android.Bp2buildMutatorContext, module *Module)
|
|||||||
(&compilerAttrs).convertProductVariables(ctx, productVariableProps)
|
(&compilerAttrs).convertProductVariables(ctx, productVariableProps)
|
||||||
(&linkerAttrs).convertProductVariables(ctx, productVariableProps)
|
(&linkerAttrs).convertProductVariables(ctx, productVariableProps)
|
||||||
|
|
||||||
(&compilerAttrs).finalize(ctx, implementationHdrs)
|
(&compilerAttrs).finalize(ctx, implementationHdrs, exportHdrs)
|
||||||
(&linkerAttrs).finalize(ctx)
|
(&linkerAttrs).finalize(ctx)
|
||||||
|
|
||||||
(&compilerAttrs.srcs).Add(bp2BuildYasm(ctx, module, compilerAttrs))
|
(&compilerAttrs.srcs).Add(bp2BuildYasm(ctx, module, compilerAttrs))
|
||||||
|
|
||||||
|
(&linkerAttrs).wholeArchiveDeps.Append(compilerAttrs.exportXsdSrcs)
|
||||||
|
(&linkerAttrs).implementationWholeArchiveDeps.Append(compilerAttrs.xsdSrcs)
|
||||||
|
|
||||||
protoDep := bp2buildProto(ctx, module, compilerAttrs.protoSrcs)
|
protoDep := bp2buildProto(ctx, module, compilerAttrs.protoSrcs)
|
||||||
|
|
||||||
// bp2buildProto will only set wholeStaticLib or implementationWholeStaticLib, but we don't know
|
// bp2buildProto will only set wholeStaticLib or implementationWholeStaticLib, but we don't know
|
||||||
@@ -1748,16 +1786,8 @@ func bazelLabelForStaticWholeModuleDeps(ctx android.BazelConversionPathContext,
|
|||||||
return label
|
return label
|
||||||
}
|
}
|
||||||
|
|
||||||
// Replaces //a/b/my_xsd_config with //a/b/my_xsd_config-cpp
|
func xsdConfigCppTarget(xsd android.XsdConfigBp2buildTargets) string {
|
||||||
func xsdConfigCppTarget(ctx android.BazelConversionPathContext, mod blueprint.Module) string {
|
|
||||||
callback := func(xsd android.XsdConfigBp2buildTargets) string {
|
|
||||||
return xsd.CppBp2buildTargetName()
|
return xsd.CppBp2buildTargetName()
|
||||||
}
|
|
||||||
return android.XsdConfigBp2buildTarget(ctx, mod, callback)
|
|
||||||
}
|
|
||||||
|
|
||||||
func bazelLabelForXsdConfig(ctx android.BazelConversionPathContext, modules []string) bazel.LabelList {
|
|
||||||
return android.BazelLabelForModuleDepsWithFn(ctx, modules, xsdConfigCppTarget)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func bazelLabelForWholeDeps(ctx android.BazelConversionPathContext, modules []string) bazel.LabelList {
|
func bazelLabelForWholeDeps(ctx android.BazelConversionPathContext, modules []string) bazel.LabelList {
|
||||||
|
29
java/java.go
29
java/java.go
@@ -2819,12 +2819,8 @@ type bp2BuildJavaInfo struct {
|
|||||||
hasKotlin bool
|
hasKotlin bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// Replaces //a/b/my_xsd_config with //a/b/my_xsd_config-java
|
func javaXsdTargetName(xsd android.XsdConfigBp2buildTargets) string {
|
||||||
func xsdConfigJavaTarget(ctx android.BazelConversionPathContext, mod blueprint.Module) string {
|
|
||||||
callback := func(xsd android.XsdConfigBp2buildTargets) string {
|
|
||||||
return xsd.JavaBp2buildTargetName()
|
return xsd.JavaBp2buildTargetName()
|
||||||
}
|
|
||||||
return android.XsdConfigBp2buildTarget(ctx, mod, callback)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// convertLibraryAttrsBp2Build returns a javaCommonAttributes struct with
|
// convertLibraryAttrsBp2Build returns a javaCommonAttributes struct with
|
||||||
@@ -2835,21 +2831,14 @@ func xsdConfigJavaTarget(ctx android.BazelConversionPathContext, mod blueprint.M
|
|||||||
func (m *Library) convertLibraryAttrsBp2Build(ctx android.TopDownMutatorContext) (*javaCommonAttributes, *bp2BuildJavaInfo) {
|
func (m *Library) convertLibraryAttrsBp2Build(ctx android.TopDownMutatorContext) (*javaCommonAttributes, *bp2BuildJavaInfo) {
|
||||||
var srcs bazel.LabelListAttribute
|
var srcs bazel.LabelListAttribute
|
||||||
var deps bazel.LabelListAttribute
|
var deps bazel.LabelListAttribute
|
||||||
var staticDeps bazel.LabelList
|
var staticDeps bazel.LabelListAttribute
|
||||||
|
|
||||||
archVariantProps := m.GetArchVariantProperties(ctx, &CommonProperties{})
|
archVariantProps := m.GetArchVariantProperties(ctx, &CommonProperties{})
|
||||||
for axis, configToProps := range archVariantProps {
|
for axis, configToProps := range archVariantProps {
|
||||||
for config, _props := range configToProps {
|
for config, _props := range configToProps {
|
||||||
if archProps, ok := _props.(*CommonProperties); ok {
|
if archProps, ok := _props.(*CommonProperties); ok {
|
||||||
srcsNonXsd, srcsXsd := android.PartitionXsdSrcs(ctx, archProps.Srcs)
|
archSrcs := android.BazelLabelForModuleSrcExcludes(ctx, archProps.Srcs, archProps.Exclude_srcs)
|
||||||
excludeSrcsNonXsd, _ := android.PartitionXsdSrcs(ctx, archProps.Exclude_srcs)
|
|
||||||
archSrcs := android.BazelLabelForModuleSrcExcludes(ctx, srcsNonXsd, excludeSrcsNonXsd)
|
|
||||||
srcs.SetSelectValue(axis, config, archSrcs)
|
srcs.SetSelectValue(axis, config, archSrcs)
|
||||||
|
|
||||||
// Add to static deps
|
|
||||||
xsdJavaConfigLibraryLabels := android.BazelLabelForModuleDepsWithFn(ctx, srcsXsd, xsdConfigJavaTarget)
|
|
||||||
staticDeps.Append(xsdJavaConfigLibraryLabels)
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2857,6 +2846,7 @@ func (m *Library) convertLibraryAttrsBp2Build(ctx android.TopDownMutatorContext)
|
|||||||
|
|
||||||
javaSrcPartition := "java"
|
javaSrcPartition := "java"
|
||||||
protoSrcPartition := "proto"
|
protoSrcPartition := "proto"
|
||||||
|
xsdSrcPartition := "xsd"
|
||||||
logtagSrcPartition := "logtag"
|
logtagSrcPartition := "logtag"
|
||||||
aidlSrcPartition := "aidl"
|
aidlSrcPartition := "aidl"
|
||||||
kotlinPartition := "kotlin"
|
kotlinPartition := "kotlin"
|
||||||
@@ -2865,6 +2855,7 @@ func (m *Library) convertLibraryAttrsBp2Build(ctx android.TopDownMutatorContext)
|
|||||||
logtagSrcPartition: bazel.LabelPartition{Extensions: []string{".logtags", ".logtag"}},
|
logtagSrcPartition: bazel.LabelPartition{Extensions: []string{".logtags", ".logtag"}},
|
||||||
protoSrcPartition: android.ProtoSrcLabelPartition,
|
protoSrcPartition: android.ProtoSrcLabelPartition,
|
||||||
aidlSrcPartition: android.AidlSrcLabelPartition,
|
aidlSrcPartition: android.AidlSrcLabelPartition,
|
||||||
|
xsdSrcPartition: bazel.LabelPartition{LabelMapper: android.XsdLabelMapper(javaXsdTargetName)},
|
||||||
kotlinPartition: bazel.LabelPartition{Extensions: []string{".kt"}},
|
kotlinPartition: bazel.LabelPartition{Extensions: []string{".kt"}},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -2872,6 +2863,8 @@ func (m *Library) convertLibraryAttrsBp2Build(ctx android.TopDownMutatorContext)
|
|||||||
kotlinSrcs := srcPartitions[kotlinPartition]
|
kotlinSrcs := srcPartitions[kotlinPartition]
|
||||||
javaSrcs.Append(kotlinSrcs)
|
javaSrcs.Append(kotlinSrcs)
|
||||||
|
|
||||||
|
staticDeps.Append(srcPartitions[xsdSrcPartition])
|
||||||
|
|
||||||
if !srcPartitions[logtagSrcPartition].IsEmpty() {
|
if !srcPartitions[logtagSrcPartition].IsEmpty() {
|
||||||
logtagsLibName := m.Name() + "_logtags"
|
logtagsLibName := m.Name() + "_logtags"
|
||||||
ctx.CreateBazelTargetModule(
|
ctx.CreateBazelTargetModule(
|
||||||
@@ -2925,7 +2918,7 @@ func (m *Library) convertLibraryAttrsBp2Build(ctx android.TopDownMutatorContext)
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
staticDeps.Add(&bazel.Label{Label: ":" + javaAidlLibName})
|
staticDeps.Append(bazel.MakeSingleLabelListAttribute(bazel.Label{Label: ":" + javaAidlLibName}))
|
||||||
}
|
}
|
||||||
|
|
||||||
var javacopts bazel.StringListAttribute //[]string
|
var javacopts bazel.StringListAttribute //[]string
|
||||||
@@ -2980,7 +2973,9 @@ func (m *Library) convertLibraryAttrsBp2Build(ctx android.TopDownMutatorContext)
|
|||||||
// by protoc are included directly in the resulting JAR. Thus upstream dependencies
|
// by protoc are included directly in the resulting JAR. Thus upstream dependencies
|
||||||
// that depend on a java_library with proto sources can link directly to the protobuf API,
|
// that depend on a java_library with proto sources can link directly to the protobuf API,
|
||||||
// and so this should be a static dependency.
|
// and so this should be a static dependency.
|
||||||
staticDeps.Add(protoDepLabel)
|
if protoDepLabel != nil {
|
||||||
|
staticDeps.Append(bazel.MakeSingleLabelListAttribute(*protoDepLabel))
|
||||||
|
}
|
||||||
|
|
||||||
depLabels := &javaDependencyLabels{}
|
depLabels := &javaDependencyLabels{}
|
||||||
depLabels.Deps = deps
|
depLabels.Deps = deps
|
||||||
@@ -2995,7 +2990,7 @@ func (m *Library) convertLibraryAttrsBp2Build(ctx android.TopDownMutatorContext)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
depLabels.StaticDeps.Value.Append(staticDeps)
|
depLabels.StaticDeps.Append(staticDeps)
|
||||||
|
|
||||||
hasKotlin := !kotlinSrcs.IsEmpty()
|
hasKotlin := !kotlinSrcs.IsEmpty()
|
||||||
commonAttrs.kotlinAttributes = &kotlinAttributes{
|
commonAttrs.kotlinAttributes = &kotlinAttributes{
|
||||||
|
Reference in New Issue
Block a user