Rollforward "Split asm and c flags and srcs in..."
This fixes a test and rolls forward I28cf7437ee96cdf2fdbcb1eda2303691cff08ba4
Test: m nothing
Test: See I28cf7437ee96cdf2fdbcb1eda2303691cff08ba4
Change-Id: I0e450c28e70087e406e7b562d7e772785f177379
diff --git a/cc/bp2build.go b/cc/bp2build.go
index 0c827c5..e417c69 100644
--- a/cc/bp2build.go
+++ b/cc/bp2build.go
@@ -183,15 +183,26 @@
// Convenience struct to hold all attributes parsed from compiler properties.
type compilerAttributes struct {
- copts bazel.StringListAttribute
+ // Options for all languages
+ copts bazel.StringListAttribute
+ // Assembly options and sources
+ asFlags bazel.StringListAttribute
+ asSrcs bazel.LabelListAttribute
+ // C options and sources
+ conlyFlags bazel.StringListAttribute
+ cSrcs bazel.LabelListAttribute
+ // C++ options and sources
+ cppFlags bazel.StringListAttribute
srcs bazel.LabelListAttribute
- includes bazel.StringListAttribute
}
// bp2BuildParseCompilerProps returns copts, srcs and hdrs and other attributes.
func bp2BuildParseCompilerProps(ctx android.TopDownMutatorContext, module *Module) compilerAttributes {
var srcs bazel.LabelListAttribute
var copts bazel.StringListAttribute
+ var asFlags bazel.StringListAttribute
+ var conlyFlags bazel.StringListAttribute
+ var cppFlags bazel.StringListAttribute
// Creates the -I flags for a directory, while making the directory relative
// to the exec root for Bazel to work.
@@ -215,15 +226,21 @@
return append(includeDirs, baseCompilerProps.Local_include_dirs...)
}
- // Parse the list of copts.
- parseCopts := func(baseCompilerProps *BaseCompilerProperties) []string {
- var copts []string
- for _, flag := range append(baseCompilerProps.Cflags, baseCompilerProps.Cppflags...) {
+ parseCommandLineFlags := func(soongFlags []string) []string {
+ var result []string
+ for _, flag := range soongFlags {
// Soong's cflags can contain spaces, like `-include header.h`. For
// Bazel's copts, split them up to be compatible with the
// no_copts_tokenization feature.
- copts = append(copts, strings.Split(flag, " ")...)
+ result = append(result, strings.Split(flag, " ")...)
}
+ return result
+ }
+
+ // Parse the list of copts.
+ parseCopts := func(baseCompilerProps *BaseCompilerProperties) []string {
+ var copts []string
+ copts = append(copts, parseCommandLineFlags(baseCompilerProps.Cflags)...)
for _, dir := range parseLocalIncludeDirs(baseCompilerProps) {
copts = append(copts, includeFlags(dir)...)
}
@@ -260,6 +277,9 @@
if baseCompilerProps, ok := props.(*BaseCompilerProperties); ok {
srcs.Value = parseSrcs(baseCompilerProps)
copts.Value = parseCopts(baseCompilerProps)
+ asFlags.Value = parseCommandLineFlags(baseCompilerProps.Asflags)
+ conlyFlags.Value = parseCommandLineFlags(baseCompilerProps.Conlyflags)
+ cppFlags.Value = parseCommandLineFlags(baseCompilerProps.Cppflags)
// Used for arch-specific srcs later.
baseSrcs = baseCompilerProps.Srcs
@@ -290,6 +310,9 @@
}
copts.SetValueForArch(arch.Name, parseCopts(baseCompilerProps))
+ asFlags.SetValueForArch(arch.Name, parseCommandLineFlags(baseCompilerProps.Asflags))
+ conlyFlags.SetValueForArch(arch.Name, parseCommandLineFlags(baseCompilerProps.Conlyflags))
+ cppFlags.SetValueForArch(arch.Name, parseCommandLineFlags(baseCompilerProps.Cppflags))
}
}
@@ -315,6 +338,9 @@
// 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))
+ asFlags.SetValueForOS(os.Name, parseCommandLineFlags(baseCompilerProps.Asflags))
+ conlyFlags.SetValueForOS(os.Name, parseCommandLineFlags(baseCompilerProps.Conlyflags))
+ cppFlags.SetValueForOS(os.Name, parseCommandLineFlags(baseCompilerProps.Cppflags))
}
}
@@ -333,9 +359,28 @@
}
}
+ // Branch srcs into three language-specific groups.
+ // 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.
+ // TODO(b/): Handle language detection of sources in a Bazel rule.
+ isCSrc := func(s string) bool {
+ return strings.HasSuffix(s, ".c")
+ }
+ isAsmSrc := func(s string) bool {
+ return strings.HasSuffix(s, ".S") || strings.HasSuffix(s, ".s")
+ }
+ cSrcs := bazel.FilterLabelListAttribute(srcs, isCSrc)
+ asSrcs := bazel.FilterLabelListAttribute(srcs, isAsmSrc)
+ srcs = bazel.SubtractBazelLabelListAttribute(srcs, cSrcs)
+ srcs = bazel.SubtractBazelLabelListAttribute(srcs, asSrcs)
return compilerAttributes{
- srcs: srcs,
- copts: copts,
+ copts: copts,
+ srcs: srcs,
+ asFlags: asFlags,
+ asSrcs: asSrcs,
+ cSrcs: cSrcs,
+ conlyFlags: conlyFlags,
+ cppFlags: cppFlags,
}
}
diff --git a/cc/library.go b/cc/library.go
index c918b96..9fb7a24 100644
--- a/cc/library.go
+++ b/cc/library.go
@@ -230,6 +230,13 @@
Copts bazel.StringListAttribute
Includes bazel.StringListAttribute
Linkopts bazel.StringListAttribute
+
+ Cppflags bazel.StringListAttribute
+ Srcs_c bazel.LabelListAttribute
+ Conlyflags bazel.StringListAttribute
+ Srcs_as bazel.LabelListAttribute
+ Asflags bazel.StringListAttribute
+
// Attributes pertaining to shared variant.
Shared_copts bazel.StringListAttribute
Shared_srcs bazel.LabelListAttribute
@@ -239,6 +246,7 @@
Whole_archive_deps_for_shared bazel.LabelListAttribute
User_link_flags bazel.StringListAttribute
Version_script bazel.LabelAttribute
+
// Attributes pertaining to static variant.
Static_copts bazel.StringListAttribute
Static_srcs bazel.LabelListAttribute
@@ -294,20 +302,27 @@
srcs.Append(compilerAttrs.srcs)
attrs := &bazelCcLibraryAttributes{
- Srcs: srcs,
- Implementation_deps: linkerAttrs.deps,
- Deps: linkerAttrs.exportedDeps,
- Dynamic_deps: linkerAttrs.dynamicDeps,
- Whole_archive_deps: linkerAttrs.wholeArchiveDeps,
- Copts: compilerAttrs.copts,
- Includes: exportedIncludes,
- Linkopts: linkerAttrs.linkopts,
+ Srcs: srcs,
+ Implementation_deps: linkerAttrs.deps,
+ Deps: linkerAttrs.exportedDeps,
+ Dynamic_deps: linkerAttrs.dynamicDeps,
+ Whole_archive_deps: linkerAttrs.wholeArchiveDeps,
+ Copts: compilerAttrs.copts,
+ Includes: exportedIncludes,
+ Linkopts: linkerAttrs.linkopts,
+ Cppflags: compilerAttrs.cppFlags,
+ Srcs_c: compilerAttrs.cSrcs,
+ Conlyflags: compilerAttrs.conlyFlags,
+ Srcs_as: compilerAttrs.asSrcs,
+ Asflags: compilerAttrs.asFlags,
+
Shared_copts: sharedAttrs.copts,
Shared_srcs: sharedAttrs.srcs,
Static_deps_for_shared: sharedAttrs.staticDeps,
Whole_archive_deps_for_shared: sharedAttrs.wholeArchiveDeps,
Dynamic_deps_for_shared: sharedAttrs.dynamicDeps,
Version_script: linkerAttrs.versionScript,
+
Static_copts: staticAttrs.copts,
Static_srcs: staticAttrs.srcs,
Static_deps_for_static: staticAttrs.staticDeps,
@@ -2230,6 +2245,12 @@
Linkstatic bool
Includes bazel.StringListAttribute
Hdrs bazel.LabelListAttribute
+
+ Cppflags bazel.StringListAttribute
+ Srcs_c bazel.LabelListAttribute
+ Conlyflags bazel.StringListAttribute
+ Srcs_as bazel.LabelListAttribute
+ Asflags bazel.StringListAttribute
}
type bazelCcLibraryStatic struct {
@@ -2259,6 +2280,12 @@
Linkopts: linkerAttrs.linkopts,
Linkstatic: true,
Includes: exportedIncludes,
+
+ Cppflags: compilerAttrs.cppFlags,
+ Srcs_c: compilerAttrs.cSrcs,
+ Conlyflags: compilerAttrs.conlyFlags,
+ Srcs_as: compilerAttrs.asSrcs,
+ Asflags: compilerAttrs.asFlags,
}
props := bazel.BazelTargetModuleProperties{
diff --git a/cc/object.go b/cc/object.go
index 704cb69..cd71161 100644
--- a/cc/object.go
+++ b/cc/object.go
@@ -185,8 +185,14 @@
}
// TODO(b/183595872) warn/error if we're not handling product variables
+ // Don't split cc_object srcs across languages. Doing so would add complexity,
+ // and this isn't typically done for cc_object.
+ srcs := compilerAttrs.srcs
+ srcs.Append(compilerAttrs.cSrcs)
+ srcs.Append(compilerAttrs.asSrcs)
+
attrs := &bazelObjectAttributes{
- Srcs: compilerAttrs.srcs,
+ Srcs: srcs,
Deps: deps,
Copts: compilerAttrs.copts,
Asflags: asFlags,