bp2build: arch-specific exclude_srcs and srcs.
OS-specific exclude_srcs and srcs will be done in a follow-up, due to complexities from merging multiple select statements together. Test: TH Bug: 186153868 Change-Id: I01b881e9a5a7cd41b4a507f8be7e9e65eab37bdc
This commit is contained in:
@@ -90,11 +90,6 @@ func bp2BuildParseCompilerProps(ctx android.TopDownMutatorContext, module *Modul
|
||||
return "-I" + filepath.Join(ctx.ModuleDir(), dir)
|
||||
}
|
||||
|
||||
// Parse the list of srcs, excluding files from exclude_srcs.
|
||||
parseSrcs := func(baseCompilerProps *BaseCompilerProperties) bazel.LabelList {
|
||||
return android.BazelLabelForModuleSrcExcludes(ctx, baseCompilerProps.Srcs, baseCompilerProps.Exclude_srcs)
|
||||
}
|
||||
|
||||
// Parse the list of module-relative include directories (-I).
|
||||
parseLocalIncludeDirs := func(baseCompilerProps *BaseCompilerProperties) []string {
|
||||
// include_dirs are root-relative, not module-relative.
|
||||
@@ -111,14 +106,40 @@ func bp2BuildParseCompilerProps(ctx android.TopDownMutatorContext, module *Modul
|
||||
return copts
|
||||
}
|
||||
|
||||
// baseSrcs contain the list of src files that are used for every configuration.
|
||||
var baseSrcs []string
|
||||
// baseExcludeSrcs contain the list of src files that are excluded for every configuration.
|
||||
var baseExcludeSrcs []string
|
||||
// baseSrcsLabelList is a clone of the base srcs LabelList, used for computing the
|
||||
// arch or os specific srcs later.
|
||||
var baseSrcsLabelList bazel.LabelList
|
||||
|
||||
// Parse srcs from an arch or OS's props value, taking the base srcs and
|
||||
// exclude srcs into account.
|
||||
parseSrcs := func(baseCompilerProps *BaseCompilerProperties) bazel.LabelList {
|
||||
// Combine the base srcs and arch-specific srcs
|
||||
allSrcs := append(baseSrcs, baseCompilerProps.Srcs...)
|
||||
// Combine the base exclude_srcs and configuration-specific exclude_srcs
|
||||
allExcludeSrcs := append(baseExcludeSrcs, baseCompilerProps.Exclude_srcs...)
|
||||
return android.BazelLabelForModuleSrcExcludes(ctx, allSrcs, allExcludeSrcs)
|
||||
}
|
||||
|
||||
for _, props := range module.compiler.compilerProps() {
|
||||
if baseCompilerProps, ok := props.(*BaseCompilerProperties); ok {
|
||||
srcs.Value = parseSrcs(baseCompilerProps)
|
||||
copts.Value = parseCopts(baseCompilerProps)
|
||||
|
||||
// Used for arch-specific srcs later.
|
||||
baseSrcs = baseCompilerProps.Srcs
|
||||
baseExcludeSrcs = baseCompilerProps.Exclude_srcs
|
||||
baseSrcsLabelList = parseSrcs(baseCompilerProps)
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
// Handle include_build_directory prop. If the property is true, then the
|
||||
// target has access to all headers recursively in the package, and has
|
||||
// "-I<module-dir>" in its copts.
|
||||
if c, ok := module.compiler.(*baseCompiler); ok && c.includeBuildDirectory() {
|
||||
copts.Value = append(copts.Value, includeFlag("."))
|
||||
} else if c, ok := module.compiler.(*libraryDecorator); ok && c.includeBuildDirectory() {
|
||||
@@ -127,16 +148,40 @@ func bp2BuildParseCompilerProps(ctx android.TopDownMutatorContext, module *Modul
|
||||
|
||||
for arch, props := range module.GetArchProperties(&BaseCompilerProperties{}) {
|
||||
if baseCompilerProps, ok := props.(*BaseCompilerProperties); ok {
|
||||
srcsList := parseSrcs(baseCompilerProps)
|
||||
srcs.SetValueForArch(arch.Name, bazel.SubtractBazelLabelList(srcsList, srcs.Value))
|
||||
// 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.
|
||||
if len(baseCompilerProps.Srcs) > 0 || len(baseCompilerProps.Exclude_srcs) > 0 {
|
||||
srcsList := parseSrcs(baseCompilerProps)
|
||||
srcs.SetValueForArch(arch.Name, srcsList)
|
||||
// The base srcs value should not contain any arch-specific excludes.
|
||||
srcs.Value = bazel.SubtractBazelLabelList(srcs.Value, bazel.LabelList{Includes: srcsList.Excludes})
|
||||
}
|
||||
|
||||
copts.SetValueForArch(arch.Name, parseCopts(baseCompilerProps))
|
||||
}
|
||||
}
|
||||
|
||||
// After going through all archs, delete the duplicate files in the arch
|
||||
// values that are already in the base srcs.Value.
|
||||
for arch, props := range module.GetArchProperties(&BaseCompilerProperties{}) {
|
||||
if _, ok := props.(*BaseCompilerProperties); ok {
|
||||
srcs.SetValueForArch(arch.Name, bazel.SubtractBazelLabelList(srcs.GetValueForArch(arch.Name), srcs.Value))
|
||||
}
|
||||
}
|
||||
|
||||
// Now that the srcs.Value list is finalized, compare it with the original
|
||||
// list, and put the difference into the default condition for the arch
|
||||
// select.
|
||||
defaultsSrcs := bazel.SubtractBazelLabelList(baseSrcsLabelList, srcs.Value)
|
||||
// TODO(b/186153868): handle the case with multiple variant types, e.g. when arch and os are both used.
|
||||
srcs.SetValueForArch(bazel.CONDITIONS_DEFAULT, defaultsSrcs)
|
||||
|
||||
// Handle OS specific props.
|
||||
for os, props := range module.GetTargetProperties(&BaseCompilerProperties{}) {
|
||||
if baseCompilerProps, ok := props.(*BaseCompilerProperties); ok {
|
||||
srcsList := parseSrcs(baseCompilerProps)
|
||||
srcs.SetValueForOS(os.Name, bazel.SubtractBazelLabelList(srcsList, srcs.Value))
|
||||
// TODO(b/186153868): add support for os-specific srcs and exclude_srcs
|
||||
srcs.SetValueForOS(os.Name, bazel.SubtractBazelLabelList(srcsList, baseSrcsLabelList))
|
||||
copts.SetValueForOS(os.Name, parseCopts(baseCompilerProps))
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user