Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3bc7a1ba authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "bp2build: Add special arch-variant targets."

parents 7b568c1c fdd72e63
Loading
Loading
Loading
Loading
+34 −33
Original line number Diff line number Diff line
@@ -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,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)
		}
@@ -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{} {
+110 −30
Original line number Diff line number Diff line
@@ -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,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)

@@ -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)
@@ -386,6 +465,7 @@ custom {
					}
				}
			}
		})
	}
}

+4 −4
Original line number Diff line number Diff line
@@ -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": [],
+1 −1
Original line number Diff line number Diff line
@@ -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 {