diff --git a/android/arch.go b/android/arch.go index 54242e56d..ce4ba9be7 100644 --- a/android/arch.go +++ b/android/arch.go @@ -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 { @@ -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...) @@ -2035,37 +2029,44 @@ 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 { - osArchStructs = append(osArchStructs, targetStructs...) - } + targetStructs := getTargetStructs(ctx, archProperties, targetField) + osArchStructs = append(osArchStructs, targetStructs...) } if os.Bionic() { targetField := "Bionic_" + arch.Name - targetStructs, ok := getTargetStructs(ctx, archProperties, targetField) - if ok { - osArchStructs = append(osArchStructs, targetStructs...) - } + 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) } } @@ -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() @@ -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{} { diff --git a/bp2build/build_conversion_test.go b/bp2build/build_conversion_test.go index f14574c06..ee1d862cd 100644 --- a/bp2build/build_conversion_test.go +++ b/bp2build/build_conversion_test.go @@ -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"], @@ -240,6 +241,7 @@ func TestGenerateBazelTargetModules(t *testing.T) { }, }, { + description: "control characters", blueprint: `custom { name: "control_characters", string_list_prop: ["\t", "\n"], @@ -257,6 +259,7 @@ func TestGenerateBazelTargetModules(t *testing.T) { }, }, { + description: "handles dep", blueprint: `custom { name: "has_dep", arch_paths: [":dep"], @@ -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: { @@ -327,6 +403,7 @@ custom { }, }, { + description: "embedded props", blueprint: `custom { name: "embedded_props", embedded_prop: "abc", @@ -339,6 +416,7 @@ custom { }, }, { + description: "ptr to embedded props", blueprint: `custom { name: "ptr_to_embedded_props", other_embedded_prop: "abc", @@ -354,38 +432,40 @@ custom { dir := "." for _, testCase := range testCases { - config := android.TestConfig(buildDir, nil, testCase.blueprint, nil) - ctx := android.NewTestContext(config) + t.Run(testCase.description, func(t *testing.T) { + config := android.TestConfig(buildDir, nil, testCase.blueprint, nil) + ctx := android.NewTestContext(config) - registerCustomModuleForBp2buildConversion(ctx) + registerCustomModuleForBp2buildConversion(ctx) - _, errs := ctx.ParseFileList(dir, []string{"Android.bp"}) - if errored(t, testCase, errs) { - continue - } - _, errs = ctx.ResolveDependencies(config) - if errored(t, testCase, errs) { - continue - } + _, errs := ctx.ParseFileList(dir, []string{"Android.bp"}) + if errored(t, testCase, errs) { + return + } + _, errs = ctx.ResolveDependencies(config) + if errored(t, testCase, errs) { + return + } - codegenCtx := NewCodegenContext(config, *ctx.Context, Bp2Build) - bazelTargets, err := generateBazelTargetsForDir(codegenCtx, dir) - android.FailIfErrored(t, err) + codegenCtx := NewCodegenContext(config, *ctx.Context, Bp2Build) + bazelTargets, err := generateBazelTargetsForDir(codegenCtx, dir) + android.FailIfErrored(t, err) - if actualCount, expectedCount := len(bazelTargets), len(testCase.expectedBazelTargets); actualCount != expectedCount { - t.Errorf("Expected %d bazel target, got %d", expectedCount, actualCount) - } else { - for i, expectedBazelTarget := range testCase.expectedBazelTargets { - actualBazelTarget := bazelTargets[i] - if actualBazelTarget.content != expectedBazelTarget { - t.Errorf( - "Expected generated Bazel target to be '%s', got '%s'", - expectedBazelTarget, - actualBazelTarget.content, - ) + if actualCount, expectedCount := len(bazelTargets), len(testCase.expectedBazelTargets); actualCount != expectedCount { + t.Errorf("Expected %d bazel target, got %d", expectedCount, actualCount) + } else { + for i, expectedBazelTarget := range testCase.expectedBazelTargets { + actualBazelTarget := bazelTargets[i] + if actualBazelTarget.content != expectedBazelTarget { + t.Errorf( + "Expected generated Bazel target to be '%s', got '%s'", + expectedBazelTarget, + actualBazelTarget.content, + ) + } } } - } + }) } } diff --git a/bp2build/cc_library_conversion_test.go b/bp2build/cc_library_conversion_test.go index 266b1188a..653e8c77b 100644 --- a/bp2build/cc_library_conversion_test.go +++ b/bp2build/cc_library_conversion_test.go @@ -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"], @@ -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": [], diff --git a/bp2build/testing.go b/bp2build/testing.go index 6c322eefe..7c2f43a06 100644 --- a/bp2build/testing.go +++ b/bp2build/testing.go @@ -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 {