diff --git a/android/module.go b/android/module.go index 98084f359..ba327108f 100644 --- a/android/module.go +++ b/android/module.go @@ -4014,3 +4014,53 @@ func (s *soongConfigTraceSingleton) GenerateBuildActions(ctx SingletonContext) { WriteFileRule(ctx, outFile, string(j)) ctx.Phony("soong_config_trace", outFile) } + +// Interface implemented by xsd_config which has 1:many mappings in bp2build workspace +// This interface exists because we want to +// 1. Determine the name of the additional targets generated by the primary soong module +// 2. Enable distinguishing an xsd_config module from other Soong modules using type assertion +type XsdConfigBp2buildTargets interface { + CppBp2buildTargetName() string + JavaBp2buildTargetName() string +} + +// PartitionXsdSrcs partitions srcs into xsd_config modules and others +// Since xsd_config are soong modules, we cannot use file extension for partitioning +func PartitionXsdSrcs(ctx BazelConversionPathContext, srcs []string) ([]string, []string) { + //isXsd returns true if src is a soong module of type xsd_config + isXsd := func(src string) bool { + mod, exists := ctx.ModuleFromName(src) + if !exists { + return false + } + _, _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 { + ctx.ModuleErrorf("xsdConfigJavaTarget called on %v, which is not an xsd_config", mod) + } + ret := BazelModuleLabel(ctx, mod) + // Remove the base module name + ret = strings.TrimSuffix(ret, mod.Name()) + // Append the language specific target name + ret += targetName(xsd) + return ret +} diff --git a/cc/bp2build.go b/cc/bp2build.go index 259ba397a..c9465c71a 100644 --- a/cc/bp2build.go +++ b/cc/bp2build.go @@ -591,7 +591,8 @@ func parseSrcs(ctx android.BazelConversionPathContext, props *BaseCompilerProper anySrcs := false // Add srcs-like dependencies such as generated files. // First create a LabelList containing these dependencies, then merge the values with srcs. - generatedSrcsLabelList := android.BazelLabelForModuleDepsExcludes(ctx, props.Generated_sources, props.Exclude_generated_sources) + genSrcs, _ := android.PartitionXsdSrcs(ctx, props.Generated_sources) + generatedSrcsLabelList := android.BazelLabelForModuleDepsExcludes(ctx, genSrcs, props.Exclude_generated_sources) if len(props.Generated_sources) > 0 || len(props.Exclude_generated_sources) > 0 { anySrcs = true } @@ -716,6 +717,14 @@ func bp2BuildYasm(ctx android.Bp2buildMutatorContext, m *Module, ca compilerAttr return ret } +// Replaces //a/b/my_xsd_config with //a/b/my_xsd_config-cpp +func xsdConfigCppTarget(ctx android.BazelConversionPathContext, mod blueprint.Module) string { + callback := func(xsd android.XsdConfigBp2buildTargets) string { + return xsd.CppBp2buildTargetName() + } + return android.XsdConfigBp2buildTarget(ctx, mod, callback) +} + // bp2BuildParseBaseProps returns all compiler, linker, library attributes of a cc module.. func bp2BuildParseBaseProps(ctx android.Bp2buildMutatorContext, module *Module) baseAttributes { archVariantCompilerProps := module.GetArchVariantProperties(ctx, &BaseCompilerProperties{}) @@ -754,7 +763,14 @@ func bp2BuildParseBaseProps(ctx android.Bp2buildMutatorContext, module *Module) for cfg := range configs { var allHdrs []string if baseCompilerProps, ok := archVariantCompilerProps[axis][cfg].(*BaseCompilerProperties); ok { - allHdrs = baseCompilerProps.Generated_headers + ah, allHdrsXsd := android.PartitionXsdSrcs(ctx, baseCompilerProps.Generated_headers) + allHdrs = ah + // in the synthetic bp2build workspace, xsd sources are compiled to a static library + xsdCppConfigLibraryLabels := android.BazelLabelForModuleDepsWithFn(ctx, allHdrsXsd, xsdConfigCppTarget) + iwad := linkerAttrs.implementationWholeArchiveDeps.SelectValue(axis, cfg) + (&iwad).Append(xsdCppConfigLibraryLabels) + linkerAttrs.implementationWholeArchiveDeps.SetSelectValue(axis, cfg, bazel.FirstUniqueBazelLabelList(iwad)) + if baseCompilerProps.Lex != nil { compilerAttrs.lexopts.SetSelectValue(axis, cfg, baseCompilerProps.Lex.Flags) } diff --git a/java/java.go b/java/java.go index 4f7b4014a..a8793fe87 100644 --- a/java/java.go +++ b/java/java.go @@ -2813,6 +2813,14 @@ type bp2BuildJavaInfo struct { hasKotlin bool } +// Replaces //a/b/my_xsd_config with //a/b/my_xsd_config-java +func xsdConfigJavaTarget(ctx android.BazelConversionPathContext, mod blueprint.Module) string { + callback := func(xsd android.XsdConfigBp2buildTargets) string { + return xsd.JavaBp2buildTargetName() + } + return android.XsdConfigBp2buildTarget(ctx, mod, callback) +} + // convertLibraryAttrsBp2Build returns a javaCommonAttributes struct with // converted attributes shared across java_* modules and a bp2BuildJavaInfo struct // which has other non-attribute information needed for bp2build conversion @@ -2827,8 +2835,15 @@ func (m *Library) convertLibraryAttrsBp2Build(ctx android.TopDownMutatorContext) for axis, configToProps := range archVariantProps { for config, _props := range configToProps { if archProps, ok := _props.(*CommonProperties); ok { - archSrcs := android.BazelLabelForModuleSrcExcludes(ctx, archProps.Srcs, archProps.Exclude_srcs) + srcsNonXsd, srcsXsd := android.PartitionXsdSrcs(ctx, archProps.Srcs) + excludeSrcsNonXsd, _ := android.PartitionXsdSrcs(ctx, archProps.Exclude_srcs) + archSrcs := android.BazelLabelForModuleSrcExcludes(ctx, srcsNonXsd, excludeSrcsNonXsd) srcs.SetSelectValue(axis, config, archSrcs) + + // Add to static deps + xsdJavaConfigLibraryLabels := android.BazelLabelForModuleDepsWithFn(ctx, srcsXsd, xsdConfigJavaTarget) + staticDeps.Append(xsdJavaConfigLibraryLabels) + } } }