diff options
author | Jingwen Chen <jingwen@google.com> | 2021-03-15 06:02:43 -0400 |
---|---|---|
committer | Jingwen Chen <jingwen@google.com> | 2021-03-30 13:22:48 +0000 |
commit | 0702791a99d076f79f2971ff96cf0e4eb5308319 (patch) | |
tree | f1a0754e473d19bb7f1e5ce7107a7b48b748edb3 /bazel | |
parent | 053520a86a9f5790aee3942cc454544f53ec1823 (diff) | |
download | soong-0702791a99d076f79f2971ff96cf0e4eb5308319.tar.gz |
bp2build: arch-configurable selects for label list attrs.
This CL adds the configurable LabelListAttribute support to bp2build.
Test: go test
Change-Id: I2ef9e385d9cf1b1845988128eca1d8cda1ecb5e8
Diffstat (limited to 'bazel')
-rw-r--r-- | bazel/properties.go | 117 |
1 files changed, 99 insertions, 18 deletions
diff --git a/bazel/properties.go b/bazel/properties.go index abdc1077d..25e110a67 100644 --- a/bazel/properties.go +++ b/bazel/properties.go @@ -76,6 +76,92 @@ func UniqueBazelLabelList(originalLabelList LabelList) LabelList { return uniqueLabelList } +const ( + ARCH_X86 = "x86" + ARCH_X86_64 = "x86_64" + ARCH_ARM = "arm" + ARCH_ARM64 = "arm64" +) + +var ( + // This is the list of architectures with a Bazel config_setting and + // constraint value equivalent. is actually android.ArchTypeList, but the + // android package depends on the bazel package, so a cyclic dependency + // prevents using that here. + selectableArchs = []string{ARCH_X86, ARCH_X86_64, ARCH_ARM, ARCH_ARM64} +) + +// Arch-specific label_list typed Bazel attribute values. This should correspond +// to the types of architectures supported for compilation in arch.go. +type labelListArchValues struct { + X86 LabelList + X86_64 LabelList + Arm LabelList + Arm64 LabelList + // TODO(b/181299724): this is currently missing the "common" arch, which + // doesn't have an equivalent platform() definition yet. +} + +// LabelListAttribute is used to represent a list of Bazel labels as an +// attribute. +type LabelListAttribute struct { + // The non-arch specific attribute label list Value. Required. + Value LabelList + + // The arch-specific attribute label list values. Optional. If used, these + // are generated in a select statement and appended to the non-arch specific + // label list Value. + ArchValues labelListArchValues +} + +// MakeLabelListAttribute initializes a LabelListAttribute with the non-arch specific value. +func MakeLabelListAttribute(value LabelList) LabelListAttribute { + return LabelListAttribute{Value: UniqueBazelLabelList(value)} +} + +// HasArchSpecificValues returns true if the attribute contains +// architecture-specific label_list values. +func (attrs *LabelListAttribute) HasArchSpecificValues() bool { + for _, arch := range selectableArchs { + if len(attrs.GetValueForArch(arch).Includes) > 0 || len(attrs.GetValueForArch(arch).Excludes) > 0 { + return true + } + } + return false +} + +// GetValueForArch returns the label_list attribute value for an architecture. +func (attrs *LabelListAttribute) GetValueForArch(arch string) LabelList { + switch arch { + case ARCH_X86: + return attrs.ArchValues.X86 + case ARCH_X86_64: + return attrs.ArchValues.X86_64 + case ARCH_ARM: + return attrs.ArchValues.Arm + case ARCH_ARM64: + return attrs.ArchValues.Arm64 + default: + panic(fmt.Errorf("Unknown arch: %s", arch)) + } +} + +// SetValueForArch sets the label_list attribute value for an architecture. +func (attrs *LabelListAttribute) SetValueForArch(arch string, value LabelList) { + switch arch { + case "x86": + attrs.ArchValues.X86 = value + case "x86_64": + attrs.ArchValues.X86_64 = value + case "arm": + attrs.ArchValues.Arm = value + case "arm64": + attrs.ArchValues.Arm64 = value + default: + panic(fmt.Errorf("Unknown arch: %s", arch)) + } +} + // StringListAttribute corresponds to the string_list Bazel attribute type with // support for additional metadata, like configurations. type StringListAttribute struct { @@ -89,11 +175,10 @@ type StringListAttribute struct { // Arch-specific string_list typed Bazel attribute values. This should correspond // to the types of architectures supported for compilation in arch.go. type stringListArchValues struct { - X86 []string - X86_64 []string - Arm []string - Arm64 []string - Default []string + X86 []string + X86_64 []string + Arm []string + Arm64 []string // TODO(b/181299724): this is currently missing the "common" arch, which // doesn't have an equivalent platform() definition yet. } @@ -101,7 +186,7 @@ type stringListArchValues struct { // HasArchSpecificValues returns true if the attribute contains // architecture-specific string_list values. func (attrs *StringListAttribute) HasArchSpecificValues() bool { - for _, arch := range []string{"x86", "x86_64", "arm", "arm64", "default"} { + for _, arch := range selectableArchs { if len(attrs.GetValueForArch(arch)) > 0 { return true } @@ -112,16 +197,14 @@ func (attrs *StringListAttribute) HasArchSpecificValues() bool { // GetValueForArch returns the string_list attribute value for an architecture. func (attrs *StringListAttribute) GetValueForArch(arch string) []string { switch arch { - case "x86": + case ARCH_X86: return attrs.ArchValues.X86 - case "x86_64": + case ARCH_X86_64: return attrs.ArchValues.X86_64 - case "arm": + case ARCH_ARM: return attrs.ArchValues.Arm - case "arm64": + case ARCH_ARM64: return attrs.ArchValues.Arm64 - case "default": - return attrs.ArchValues.Default default: panic(fmt.Errorf("Unknown arch: %s", arch)) } @@ -130,16 +213,14 @@ func (attrs *StringListAttribute) GetValueForArch(arch string) []string { // SetValueForArch sets the string_list attribute value for an architecture. func (attrs *StringListAttribute) SetValueForArch(arch string, value []string) { switch arch { - case "x86": + case ARCH_X86: attrs.ArchValues.X86 = value - case "x86_64": + case ARCH_X86_64: attrs.ArchValues.X86_64 = value - case "arm": + case ARCH_ARM: attrs.ArchValues.Arm = value - case "arm64": + case ARCH_ARM64: attrs.ArchValues.Arm64 = value - case "default": - attrs.ArchValues.Default = value default: panic(fmt.Errorf("Unknown arch: %s", arch)) } |