Loading android/arch.go +34 −33 Original line number Diff line number Diff line Loading @@ -2006,17 +2006,10 @@ func (m *ModuleBase) GetArchVariantProperties(ctx ArchVariantContext, propertySe osToProp := ArchVariantProperties{} archOsToProp := ArchVariantProperties{} var linuxStructs, bionicStructs []reflect.Value var ok bool linuxStructs, ok = getTargetStructs(ctx, archProperties, "Linux") if !ok { linuxStructs = make([]reflect.Value, 0) } bionicStructs, ok = getTargetStructs(ctx, archProperties, "Bionic") if !ok { bionicStructs = make([]reflect.Value, 0) } linuxStructs := getTargetStructs(ctx, archProperties, "Linux") bionicStructs := getTargetStructs(ctx, archProperties, "Bionic") hostStructs := getTargetStructs(ctx, archProperties, "Host") hostNotWindowsStructs := getTargetStructs(ctx, archProperties, "Not_windows") // For android, linux, ... for _, os := range osTypeList { Loading @@ -2025,9 +2018,10 @@ func (m *ModuleBase) GetArchVariantProperties(ctx ArchVariantContext, propertySe continue } osStructs := make([]reflect.Value, 0) osSpecificStructs, ok := getTargetStructs(ctx, archProperties, os.Field) if ok { osStructs = append(osStructs, osSpecificStructs...) osSpecificStructs := getTargetStructs(ctx, archProperties, os.Field) if os.Class == Host { osStructs = append(osStructs, hostStructs...) } if os.Linux() { osStructs = append(osStructs, linuxStructs...) Loading @@ -2035,36 +2029,43 @@ func (m *ModuleBase) GetArchVariantProperties(ctx ArchVariantContext, propertySe if os.Bionic() { osStructs = append(osStructs, bionicStructs...) } if os == LinuxMusl { osStructs = append(osStructs, getTargetStructs(ctx, archProperties, "Musl")...) } if os == Linux { osStructs = append(osStructs, getTargetStructs(ctx, archProperties, "Glibc")...) } osStructs = append(osStructs, osSpecificStructs...) if os.Class == Host && os != Windows { osStructs = append(osStructs, hostNotWindowsStructs...) } osToProp[os.Name] = mergeStructs(ctx, osStructs, propertySet) // For arm, x86, ... for _, arch := range osArchTypeMap[os] { osArchStructs := make([]reflect.Value, 0) targetField := GetCompoundTargetField(os, arch) targetName := fmt.Sprintf("%s_%s", os.Name, arch.Name) targetStructs, ok := getTargetStructs(ctx, archProperties, targetField) if ok { osArchStructs = append(osArchStructs, targetStructs...) } // Auto-combine with Linux_ and Bionic_ targets. This potentially results in // repetition and select() bloat, but use of Linux_* and Bionic_* targets is rare. // TODO(b/201423152): Look into cleanup. if os.Linux() { targetField := "Linux_" + arch.Name targetStructs, ok := getTargetStructs(ctx, archProperties, targetField) if ok { targetStructs := getTargetStructs(ctx, archProperties, targetField) osArchStructs = append(osArchStructs, targetStructs...) } } if os.Bionic() { targetField := "Bionic_" + arch.Name targetStructs, ok := getTargetStructs(ctx, archProperties, targetField) if ok { targetStructs := getTargetStructs(ctx, archProperties, targetField) osArchStructs = append(osArchStructs, targetStructs...) } } targetField := GetCompoundTargetField(os, arch) targetName := fmt.Sprintf("%s_%s", os.Name, arch.Name) targetStructs := getTargetStructs(ctx, archProperties, targetField) osArchStructs = append(osArchStructs, targetStructs...) archOsToProp[targetName] = mergeStructs(ctx, osArchStructs, propertySet) } Loading @@ -2089,8 +2090,8 @@ func (m *ModuleBase) GetArchVariantProperties(ctx ArchVariantContext, propertySe // } // } // This would return a BaseCompilerProperties with BaseCompilerProperties.Srcs = ["foo.c"] func getTargetStructs(ctx ArchVariantContext, archProperties []interface{}, targetName string) ([]reflect.Value, bool) { propertyStructs := make([]reflect.Value, 0) func getTargetStructs(ctx ArchVariantContext, archProperties []interface{}, targetName string) []reflect.Value { var propertyStructs []reflect.Value for _, archProperty := range archProperties { archPropValues := reflect.ValueOf(archProperty).Elem() targetProp := archPropValues.FieldByName("Target").Elem() Loading @@ -2098,11 +2099,11 @@ func getTargetStructs(ctx ArchVariantContext, archProperties []interface{}, targ if ok { propertyStructs = append(propertyStructs, targetStruct) } else { return propertyStructs, false return []reflect.Value{} } } return propertyStructs, true return propertyStructs } func mergeStructs(ctx ArchVariantContext, propertyStructs []reflect.Value, propertySet interface{}) interface{} { Loading bp2build/build_conversion_test.go +110 −30 Original line number Diff line number Diff line Loading @@ -223,6 +223,7 @@ func TestGenerateSoongModuleTargets(t *testing.T) { func TestGenerateBazelTargetModules(t *testing.T) { testCases := []bp2buildTestCase{ { description: "string props", blueprint: `custom { name: "foo", string_list_prop: ["a", "b"], Loading @@ -240,6 +241,7 @@ func TestGenerateBazelTargetModules(t *testing.T) { }, }, { description: "control characters", blueprint: `custom { name: "control_characters", string_list_prop: ["\t", "\n"], Loading @@ -257,6 +259,7 @@ func TestGenerateBazelTargetModules(t *testing.T) { }, }, { description: "handles dep", blueprint: `custom { name: "has_dep", arch_paths: [":dep"], Loading @@ -279,25 +282,98 @@ custom { }, }, { description: "arch-variant srcs", blueprint: `custom { name: "arch_paths", arch: { x86: { arch_paths: ["abc"], }, x86: { arch_paths: ["x86.txt"] }, x86_64: { arch_paths: ["x86_64.txt"] }, arm: { arch_paths: ["arm.txt"] }, arm64: { arch_paths: ["arm64.txt"] }, }, target: { linux: { arch_paths: ["linux.txt"] }, bionic: { arch_paths: ["bionic.txt"] }, host: { arch_paths: ["host.txt"] }, not_windows: { arch_paths: ["not_windows.txt"] }, android: { arch_paths: ["android.txt"] }, linux_musl: { arch_paths: ["linux_musl.txt"] }, musl: { arch_paths: ["musl.txt"] }, linux_glibc: { arch_paths: ["linux_glibc.txt"] }, glibc: { arch_paths: ["glibc.txt"] }, linux_bionic: { arch_paths: ["linux_bionic.txt"] }, darwin: { arch_paths: ["darwin.txt"] }, windows: { arch_paths: ["windows.txt"] }, }, multilib: { lib32: { arch_paths: ["lib32.txt"] }, lib64: { arch_paths: ["lib64.txt"] }, }, bazel_module: { bp2build_available: true }, }`, expectedBazelTargets: []string{`custom( name = "arch_paths", arch_paths = select({ "//build/bazel/platforms/arch:x86": ["abc"], "//build/bazel/platforms/arch:arm": [ "arm.txt", "lib32.txt", ], "//build/bazel/platforms/arch:arm64": [ "arm64.txt", "lib64.txt", ], "//build/bazel/platforms/arch:x86": [ "x86.txt", "lib32.txt", ], "//build/bazel/platforms/arch:x86_64": [ "x86_64.txt", "lib64.txt", ], "//conditions:default": [], }) + select({ "//build/bazel/platforms/os:android": [ "linux.txt", "bionic.txt", "android.txt", ], "//build/bazel/platforms/os:darwin": [ "host.txt", "darwin.txt", "not_windows.txt", ], "//build/bazel/platforms/os:linux": [ "host.txt", "linux.txt", "glibc.txt", "linux_glibc.txt", "not_windows.txt", ], "//build/bazel/platforms/os:linux_bionic": [ "host.txt", "linux.txt", "bionic.txt", "linux_bionic.txt", "not_windows.txt", ], "//build/bazel/platforms/os:linux_musl": [ "host.txt", "linux.txt", "musl.txt", "linux_musl.txt", "not_windows.txt", ], "//build/bazel/platforms/os:windows": [ "host.txt", "windows.txt", ], "//conditions:default": [], }), )`, }, }, { description: "arch-variant deps", blueprint: `custom { name: "has_dep", arch: { Loading Loading @@ -327,6 +403,7 @@ custom { }, }, { description: "embedded props", blueprint: `custom { name: "embedded_props", embedded_prop: "abc", Loading @@ -339,6 +416,7 @@ custom { }, }, { description: "ptr to embedded props", blueprint: `custom { name: "ptr_to_embedded_props", other_embedded_prop: "abc", Loading @@ -354,6 +432,7 @@ custom { dir := "." for _, testCase := range testCases { t.Run(testCase.description, func(t *testing.T) { config := android.TestConfig(buildDir, nil, testCase.blueprint, nil) ctx := android.NewTestContext(config) Loading @@ -361,11 +440,11 @@ custom { _, errs := ctx.ParseFileList(dir, []string{"Android.bp"}) if errored(t, testCase, errs) { continue return } _, errs = ctx.ResolveDependencies(config) if errored(t, testCase, errs) { continue return } codegenCtx := NewCodegenContext(config, *ctx.Context, Bp2Build) Loading @@ -386,6 +465,7 @@ custom { } } } }) } } Loading bp2build/cc_library_conversion_test.go +4 −4 Original line number Diff line number Diff line Loading @@ -133,8 +133,8 @@ cc_library { "//conditions:default": [], }) + select({ "//build/bazel/platforms/os:android": [ "android.cpp", "bionic.cpp", "android.cpp", ], "//build/bazel/platforms/os:darwin": ["darwin.cpp"], "//build/bazel/platforms/os:linux": ["linux.cpp"], Loading Loading @@ -1668,22 +1668,22 @@ cc_library { name = "foo-lib", srcs = ["base.cpp"] + select({ "//build/bazel/platforms/os:android": [ "android.cpp", "linux.cpp", "bionic.cpp", "android.cpp", ], "//build/bazel/platforms/os:darwin": ["darwin.cpp"], "//build/bazel/platforms/os:linux": [ "linux_glibc.cpp", "linux.cpp", "linux_glibc.cpp", ], "//build/bazel/platforms/os:linux_bionic": [ "linux.cpp", "bionic.cpp", ], "//build/bazel/platforms/os:linux_musl": [ "linux_musl.cpp", "linux.cpp", "linux_musl.cpp", ], "//build/bazel/platforms/os:windows": ["windows.cpp"], "//conditions:default": [], Loading bp2build/testing.go +1 −1 Original line number Diff line number Diff line Loading @@ -283,7 +283,7 @@ func customBp2BuildMutator(ctx android.TopDownMutatorContext) { return } paths := bazel.MakeLabelListAttribute(android.BazelLabelForModuleSrcExcludes(ctx, m.props.Arch_paths, m.props.Arch_paths_exclude)) paths := bazel.LabelListAttribute{} for axis, configToProps := range m.GetArchVariantProperties(ctx, &customProps{}) { for config, props := range configToProps { Loading Loading
android/arch.go +34 −33 Original line number Diff line number Diff line Loading @@ -2006,17 +2006,10 @@ func (m *ModuleBase) GetArchVariantProperties(ctx ArchVariantContext, propertySe osToProp := ArchVariantProperties{} archOsToProp := ArchVariantProperties{} var linuxStructs, bionicStructs []reflect.Value var ok bool linuxStructs, ok = getTargetStructs(ctx, archProperties, "Linux") if !ok { linuxStructs = make([]reflect.Value, 0) } bionicStructs, ok = getTargetStructs(ctx, archProperties, "Bionic") if !ok { bionicStructs = make([]reflect.Value, 0) } linuxStructs := getTargetStructs(ctx, archProperties, "Linux") bionicStructs := getTargetStructs(ctx, archProperties, "Bionic") hostStructs := getTargetStructs(ctx, archProperties, "Host") hostNotWindowsStructs := getTargetStructs(ctx, archProperties, "Not_windows") // For android, linux, ... for _, os := range osTypeList { Loading @@ -2025,9 +2018,10 @@ func (m *ModuleBase) GetArchVariantProperties(ctx ArchVariantContext, propertySe continue } osStructs := make([]reflect.Value, 0) osSpecificStructs, ok := getTargetStructs(ctx, archProperties, os.Field) if ok { osStructs = append(osStructs, osSpecificStructs...) osSpecificStructs := getTargetStructs(ctx, archProperties, os.Field) if os.Class == Host { osStructs = append(osStructs, hostStructs...) } if os.Linux() { osStructs = append(osStructs, linuxStructs...) Loading @@ -2035,36 +2029,43 @@ func (m *ModuleBase) GetArchVariantProperties(ctx ArchVariantContext, propertySe if os.Bionic() { osStructs = append(osStructs, bionicStructs...) } if os == LinuxMusl { osStructs = append(osStructs, getTargetStructs(ctx, archProperties, "Musl")...) } if os == Linux { osStructs = append(osStructs, getTargetStructs(ctx, archProperties, "Glibc")...) } osStructs = append(osStructs, osSpecificStructs...) if os.Class == Host && os != Windows { osStructs = append(osStructs, hostNotWindowsStructs...) } osToProp[os.Name] = mergeStructs(ctx, osStructs, propertySet) // For arm, x86, ... for _, arch := range osArchTypeMap[os] { osArchStructs := make([]reflect.Value, 0) targetField := GetCompoundTargetField(os, arch) targetName := fmt.Sprintf("%s_%s", os.Name, arch.Name) targetStructs, ok := getTargetStructs(ctx, archProperties, targetField) if ok { osArchStructs = append(osArchStructs, targetStructs...) } // Auto-combine with Linux_ and Bionic_ targets. This potentially results in // repetition and select() bloat, but use of Linux_* and Bionic_* targets is rare. // TODO(b/201423152): Look into cleanup. if os.Linux() { targetField := "Linux_" + arch.Name targetStructs, ok := getTargetStructs(ctx, archProperties, targetField) if ok { targetStructs := getTargetStructs(ctx, archProperties, targetField) osArchStructs = append(osArchStructs, targetStructs...) } } if os.Bionic() { targetField := "Bionic_" + arch.Name targetStructs, ok := getTargetStructs(ctx, archProperties, targetField) if ok { targetStructs := getTargetStructs(ctx, archProperties, targetField) osArchStructs = append(osArchStructs, targetStructs...) } } targetField := GetCompoundTargetField(os, arch) targetName := fmt.Sprintf("%s_%s", os.Name, arch.Name) targetStructs := getTargetStructs(ctx, archProperties, targetField) osArchStructs = append(osArchStructs, targetStructs...) archOsToProp[targetName] = mergeStructs(ctx, osArchStructs, propertySet) } Loading @@ -2089,8 +2090,8 @@ func (m *ModuleBase) GetArchVariantProperties(ctx ArchVariantContext, propertySe // } // } // This would return a BaseCompilerProperties with BaseCompilerProperties.Srcs = ["foo.c"] func getTargetStructs(ctx ArchVariantContext, archProperties []interface{}, targetName string) ([]reflect.Value, bool) { propertyStructs := make([]reflect.Value, 0) func getTargetStructs(ctx ArchVariantContext, archProperties []interface{}, targetName string) []reflect.Value { var propertyStructs []reflect.Value for _, archProperty := range archProperties { archPropValues := reflect.ValueOf(archProperty).Elem() targetProp := archPropValues.FieldByName("Target").Elem() Loading @@ -2098,11 +2099,11 @@ func getTargetStructs(ctx ArchVariantContext, archProperties []interface{}, targ if ok { propertyStructs = append(propertyStructs, targetStruct) } else { return propertyStructs, false return []reflect.Value{} } } return propertyStructs, true return propertyStructs } func mergeStructs(ctx ArchVariantContext, propertyStructs []reflect.Value, propertySet interface{}) interface{} { Loading
bp2build/build_conversion_test.go +110 −30 Original line number Diff line number Diff line Loading @@ -223,6 +223,7 @@ func TestGenerateSoongModuleTargets(t *testing.T) { func TestGenerateBazelTargetModules(t *testing.T) { testCases := []bp2buildTestCase{ { description: "string props", blueprint: `custom { name: "foo", string_list_prop: ["a", "b"], Loading @@ -240,6 +241,7 @@ func TestGenerateBazelTargetModules(t *testing.T) { }, }, { description: "control characters", blueprint: `custom { name: "control_characters", string_list_prop: ["\t", "\n"], Loading @@ -257,6 +259,7 @@ func TestGenerateBazelTargetModules(t *testing.T) { }, }, { description: "handles dep", blueprint: `custom { name: "has_dep", arch_paths: [":dep"], Loading @@ -279,25 +282,98 @@ custom { }, }, { description: "arch-variant srcs", blueprint: `custom { name: "arch_paths", arch: { x86: { arch_paths: ["abc"], }, x86: { arch_paths: ["x86.txt"] }, x86_64: { arch_paths: ["x86_64.txt"] }, arm: { arch_paths: ["arm.txt"] }, arm64: { arch_paths: ["arm64.txt"] }, }, target: { linux: { arch_paths: ["linux.txt"] }, bionic: { arch_paths: ["bionic.txt"] }, host: { arch_paths: ["host.txt"] }, not_windows: { arch_paths: ["not_windows.txt"] }, android: { arch_paths: ["android.txt"] }, linux_musl: { arch_paths: ["linux_musl.txt"] }, musl: { arch_paths: ["musl.txt"] }, linux_glibc: { arch_paths: ["linux_glibc.txt"] }, glibc: { arch_paths: ["glibc.txt"] }, linux_bionic: { arch_paths: ["linux_bionic.txt"] }, darwin: { arch_paths: ["darwin.txt"] }, windows: { arch_paths: ["windows.txt"] }, }, multilib: { lib32: { arch_paths: ["lib32.txt"] }, lib64: { arch_paths: ["lib64.txt"] }, }, bazel_module: { bp2build_available: true }, }`, expectedBazelTargets: []string{`custom( name = "arch_paths", arch_paths = select({ "//build/bazel/platforms/arch:x86": ["abc"], "//build/bazel/platforms/arch:arm": [ "arm.txt", "lib32.txt", ], "//build/bazel/platforms/arch:arm64": [ "arm64.txt", "lib64.txt", ], "//build/bazel/platforms/arch:x86": [ "x86.txt", "lib32.txt", ], "//build/bazel/platforms/arch:x86_64": [ "x86_64.txt", "lib64.txt", ], "//conditions:default": [], }) + select({ "//build/bazel/platforms/os:android": [ "linux.txt", "bionic.txt", "android.txt", ], "//build/bazel/platforms/os:darwin": [ "host.txt", "darwin.txt", "not_windows.txt", ], "//build/bazel/platforms/os:linux": [ "host.txt", "linux.txt", "glibc.txt", "linux_glibc.txt", "not_windows.txt", ], "//build/bazel/platforms/os:linux_bionic": [ "host.txt", "linux.txt", "bionic.txt", "linux_bionic.txt", "not_windows.txt", ], "//build/bazel/platforms/os:linux_musl": [ "host.txt", "linux.txt", "musl.txt", "linux_musl.txt", "not_windows.txt", ], "//build/bazel/platforms/os:windows": [ "host.txt", "windows.txt", ], "//conditions:default": [], }), )`, }, }, { description: "arch-variant deps", blueprint: `custom { name: "has_dep", arch: { Loading Loading @@ -327,6 +403,7 @@ custom { }, }, { description: "embedded props", blueprint: `custom { name: "embedded_props", embedded_prop: "abc", Loading @@ -339,6 +416,7 @@ custom { }, }, { description: "ptr to embedded props", blueprint: `custom { name: "ptr_to_embedded_props", other_embedded_prop: "abc", Loading @@ -354,6 +432,7 @@ custom { dir := "." for _, testCase := range testCases { t.Run(testCase.description, func(t *testing.T) { config := android.TestConfig(buildDir, nil, testCase.blueprint, nil) ctx := android.NewTestContext(config) Loading @@ -361,11 +440,11 @@ custom { _, errs := ctx.ParseFileList(dir, []string{"Android.bp"}) if errored(t, testCase, errs) { continue return } _, errs = ctx.ResolveDependencies(config) if errored(t, testCase, errs) { continue return } codegenCtx := NewCodegenContext(config, *ctx.Context, Bp2Build) Loading @@ -386,6 +465,7 @@ custom { } } } }) } } Loading
bp2build/cc_library_conversion_test.go +4 −4 Original line number Diff line number Diff line Loading @@ -133,8 +133,8 @@ cc_library { "//conditions:default": [], }) + select({ "//build/bazel/platforms/os:android": [ "android.cpp", "bionic.cpp", "android.cpp", ], "//build/bazel/platforms/os:darwin": ["darwin.cpp"], "//build/bazel/platforms/os:linux": ["linux.cpp"], Loading Loading @@ -1668,22 +1668,22 @@ cc_library { name = "foo-lib", srcs = ["base.cpp"] + select({ "//build/bazel/platforms/os:android": [ "android.cpp", "linux.cpp", "bionic.cpp", "android.cpp", ], "//build/bazel/platforms/os:darwin": ["darwin.cpp"], "//build/bazel/platforms/os:linux": [ "linux_glibc.cpp", "linux.cpp", "linux_glibc.cpp", ], "//build/bazel/platforms/os:linux_bionic": [ "linux.cpp", "bionic.cpp", ], "//build/bazel/platforms/os:linux_musl": [ "linux_musl.cpp", "linux.cpp", "linux_musl.cpp", ], "//build/bazel/platforms/os:windows": ["windows.cpp"], "//conditions:default": [], Loading
bp2build/testing.go +1 −1 Original line number Diff line number Diff line Loading @@ -283,7 +283,7 @@ func customBp2BuildMutator(ctx android.TopDownMutatorContext) { return } paths := bazel.MakeLabelListAttribute(android.BazelLabelForModuleSrcExcludes(ctx, m.props.Arch_paths, m.props.Arch_paths_exclude)) paths := bazel.LabelListAttribute{} for axis, configToProps := range m.GetArchVariantProperties(ctx, &customProps{}) { for config, props := range configToProps { Loading