diff options
Diffstat (limited to 'cc/bp2build.go')
| -rw-r--r-- | cc/bp2build.go | 66 |
1 files changed, 57 insertions, 9 deletions
diff --git a/cc/bp2build.go b/cc/bp2build.go index 09aa1363c..6c1646cbb 100644 --- a/cc/bp2build.go +++ b/cc/bp2build.go @@ -267,6 +267,8 @@ type compilerAttributes struct { localIncludes bazel.StringListAttribute absoluteIncludes bazel.StringListAttribute + includes BazelIncludes + protoSrcs bazel.LabelListAttribute } @@ -412,6 +414,33 @@ func bp2buildResolveCppStdValue(c_std *string, cpp_std *string, gnu_extensions * return c_std_prop, cpp_std_prop } +// packageFromLabel extracts package from a fully-qualified or relative Label and whether the label +// is fully-qualified. +// e.g. fully-qualified "//a/b:foo" -> "a/b", true, relative: ":bar" -> ".", false +func packageFromLabel(label string) (string, bool) { + split := strings.Split(label, ":") + if len(split) != 2 { + return "", false + } + if split[0] == "" { + return ".", false + } + // remove leading "//" + return split[0][2:], true +} + +// includesFromLabelList extracts relative/absolute includes from a bazel.LabelList> +func includesFromLabelList(labelList bazel.LabelList) (relative, absolute []string) { + for _, hdr := range labelList.Includes { + if pkg, hasPkg := packageFromLabel(hdr.Label); hasPkg { + absolute = append(absolute, pkg) + } else if pkg != "" { + relative = append(relative, pkg) + } + } + return relative, absolute +} + // bp2BuildParseCompilerProps returns copts, srcs and hdrs and other attributes. func bp2BuildParseBaseProps(ctx android.Bp2buildMutatorContext, module *Module) baseAttributes { archVariantCompilerProps := module.GetArchVariantProperties(ctx, &BaseCompilerProperties{}) @@ -455,6 +484,18 @@ func bp2BuildParseBaseProps(ctx android.Bp2buildMutatorContext, module *Module) headers := maybePartitionExportedAndImplementationsDeps(ctx, !module.Binary(), allHdrs, exportHdrs, android.BazelLabelForModuleDeps) implementationHdrs.SetSelectValue(axis, config, headers.implementation) compilerAttrs.hdrs.SetSelectValue(axis, config, headers.export) + + exportIncludes, exportAbsoluteIncludes := includesFromLabelList(headers.export) + compilerAttrs.includes.Includes.SetSelectValue(axis, config, exportIncludes) + compilerAttrs.includes.AbsoluteIncludes.SetSelectValue(axis, config, exportAbsoluteIncludes) + + includes, absoluteIncludes := includesFromLabelList(headers.implementation) + currAbsoluteIncludes := compilerAttrs.absoluteIncludes.SelectValue(axis, config) + currAbsoluteIncludes = android.FirstUniqueStrings(append(currAbsoluteIncludes, absoluteIncludes...)) + compilerAttrs.absoluteIncludes.SetSelectValue(axis, config, currAbsoluteIncludes) + currIncludes := compilerAttrs.localIncludes.SelectValue(axis, config) + currIncludes = android.FirstUniqueStrings(append(currIncludes, includes...)) + compilerAttrs.localIncludes.SetSelectValue(axis, config, currIncludes) } } @@ -692,13 +733,14 @@ func bp2BuildMakePathsRelativeToModule(ctx android.BazelConversionPathContext, p // BazelIncludes contains information about -I and -isystem paths from a module converted to Bazel // attributes. type BazelIncludes struct { - Includes bazel.StringListAttribute - SystemIncludes bazel.StringListAttribute + AbsoluteIncludes bazel.StringListAttribute + Includes bazel.StringListAttribute + SystemIncludes bazel.StringListAttribute } -func bp2BuildParseExportedIncludes(ctx android.BazelConversionPathContext, module *Module) BazelIncludes { +func bp2BuildParseExportedIncludes(ctx android.BazelConversionPathContext, module *Module, existingIncludes BazelIncludes) BazelIncludes { libraryDecorator := module.linker.(*libraryDecorator) - return bp2BuildParseExportedIncludesHelper(ctx, module, libraryDecorator) + return bp2BuildParseExportedIncludesHelper(ctx, module, libraryDecorator, &existingIncludes) } // Bp2buildParseExportedIncludesForPrebuiltLibrary returns a BazelIncludes with Bazel-ified values @@ -706,25 +748,31 @@ func bp2BuildParseExportedIncludes(ctx android.BazelConversionPathContext, modul func Bp2BuildParseExportedIncludesForPrebuiltLibrary(ctx android.BazelConversionPathContext, module *Module) BazelIncludes { prebuiltLibraryLinker := module.linker.(*prebuiltLibraryLinker) libraryDecorator := prebuiltLibraryLinker.libraryDecorator - return bp2BuildParseExportedIncludesHelper(ctx, module, libraryDecorator) + return bp2BuildParseExportedIncludesHelper(ctx, module, libraryDecorator, nil) } // bp2BuildParseExportedIncludes creates a string list attribute contains the // exported included directories of a module. -func bp2BuildParseExportedIncludesHelper(ctx android.BazelConversionPathContext, module *Module, libraryDecorator *libraryDecorator) BazelIncludes { - exported := BazelIncludes{} +func bp2BuildParseExportedIncludesHelper(ctx android.BazelConversionPathContext, module *Module, libraryDecorator *libraryDecorator, includes *BazelIncludes) BazelIncludes { + var exported BazelIncludes + if includes != nil { + exported = *includes + } else { + exported = BazelIncludes{} + } for axis, configToProps := range module.GetArchVariantProperties(ctx, &FlagExporterProperties{}) { for config, props := range configToProps { if flagExporterProperties, ok := props.(*FlagExporterProperties); ok { if len(flagExporterProperties.Export_include_dirs) > 0 { - exported.Includes.SetSelectValue(axis, config, flagExporterProperties.Export_include_dirs) + exported.Includes.SetSelectValue(axis, config, android.FirstUniqueStrings(append(exported.Includes.SelectValue(axis, config), flagExporterProperties.Export_include_dirs...))) } if len(flagExporterProperties.Export_system_include_dirs) > 0 { - exported.SystemIncludes.SetSelectValue(axis, config, flagExporterProperties.Export_system_include_dirs) + exported.SystemIncludes.SetSelectValue(axis, config, android.FirstUniqueStrings(append(exported.SystemIncludes.SelectValue(axis, config), flagExporterProperties.Export_system_include_dirs...))) } } } } + exported.AbsoluteIncludes.DeduplicateAxesFromBase() exported.Includes.DeduplicateAxesFromBase() exported.SystemIncludes.DeduplicateAxesFromBase() |