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

Commit 1e347860 authored by Jingwen Chen's avatar Jingwen Chen
Browse files

bp2build: allowlist //external/libcap/...

This builds cap_names.list.h, which uses an eponymous filegroup
"generate_cap_names_list.awk" in Soong, but uses the file target
directly in Bazel.

This also improve filegroup support for mixed builds, by issuing a
cquery call _without_ arch. Filegroups in Soong don't have configurable
properties, so don't generate Bazel filegroups into buildroot's
config_nodes (which was x86_64 by default).

The mixed_build_root now looks like this:

```
config_node(...)
config_node(...)
config_node(...)
config_node(...)

...

filegroup(name = "common",
    srcs = ["@//bionic/linker:linker_sources_x86",
            "@//bionic/libc:kernel_input_headers",
            "@//system/timezone/apex:com.android.tzdata-androidManifest",
            "@//external/libcap:generate_cap_names_list.awk",
            "@//bionic/linker:linker_sources_arm64",
            "@//bionic/linker:linker_sources",
            "@//bionic/libc:libc_sources_shared_arm",
            "@//bionic/linker:linker_sources_x86_64",
            "@//bionic/libc:all_kernel_uapi_headers",
            "@//build/bazel/examples/apex/minimal:build.bazel.examples.apex.minimal-file_contexts",
            "@//system/core/libcutils:android_filesystem_config_header",
            "@//bionic/libc:libc_sources_static",
            "@//bionic/linker:linker_sources_arm",
            "@//bionic/libc/tools:bionic-gensyscalls",
            "@//bionic/tools:bionic-generate-version-script",
            "@//bionic/libc:libc_sources_shared"],
)

mixed_build_root(name = "buildroot",
    deps = [":x86",
            ":arm64",
            ":arm",
            ":common",
            ":x86_64"],
)
```

Test: CI
Fixes: 198595323
Fixes: 198235838
Change-Id: I6df9a14da556cf358d96e6a99b514f66a2638295
parent 5146ac02
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -182,6 +182,7 @@ var (
		"external/jemalloc_new":           Bp2BuildDefaultTrueRecursively,
		"external/libcxx":                 Bp2BuildDefaultTrueRecursively,
		"external/libcxxabi":              Bp2BuildDefaultTrueRecursively,
		"external/libcap":                 Bp2BuildDefaultTrueRecursively,
		"external/scudo":                  Bp2BuildDefaultTrueRecursively,
		"prebuilts/clang/host/linux-x86":  Bp2BuildDefaultTrueRecursively,
	}
@@ -231,6 +232,10 @@ var (
		//external/brotli/...
		"brotli-fuzzer-corpus", // "declared output 'external/brotli/c/fuzz/73231c6592f195ffd41100b8706d1138ff6893b9' was not created by genrule"

		// //external/libcap/...
		"libcap",      // http://b/198595332, depends on _makenames, a cc_binary
		"cap_names.h", // http://b/198596102, depends on _makenames, a cc_binary

		// Tests. Handle later.
		"libbionic_tests_headers_posix", // http://b/186024507, cc_library_static, sched.h, time.h not found
		"libjemalloc5_integrationtest",
+28 −7
Original line number Diff line number Diff line
@@ -27,9 +27,9 @@ import (
	"sync"

	"android/soong/bazel/cquery"
	"android/soong/shared"

	"android/soong/bazel"
	"android/soong/shared"
)

type cqueryRequest interface {
@@ -490,6 +490,12 @@ config_node(name = "%s",
    arch = "%s",
    deps = [%s],
)
`

	commonArchFilegroupString := `
filegroup(name = "common",
    srcs = [%s],
)
`

	configNodesSection := ""
@@ -501,14 +507,22 @@ config_node(name = "%s",
		labelsByArch[archString] = append(labelsByArch[archString], labelString)
	}

	configNodeLabels := []string{}
	allLabels := []string{}
	for archString, labels := range labelsByArch {
		configNodeLabels = append(configNodeLabels, fmt.Sprintf("\":%s\"", archString))
		if archString == "common" {
			// arch-less labels (e.g. filegroups) don't need a config_node
			allLabels = append(allLabels, "\":common\"")
			labelsString := strings.Join(labels, ",\n            ")
			configNodesSection += fmt.Sprintf(commonArchFilegroupString, labelsString)
		} else {
			// Create a config_node, and add the config_node's label to allLabels
			allLabels = append(allLabels, fmt.Sprintf("\":%s\"", archString))
			labelsString := strings.Join(labels, ",\n            ")
			configNodesSection += fmt.Sprintf(configNodeFormatString, archString, archString, labelsString)
		}
	}

	return []byte(fmt.Sprintf(formatString, configNodesSection, strings.Join(configNodeLabels, ",\n            ")))
	return []byte(fmt.Sprintf(formatString, configNodesSection, strings.Join(allLabels, ",\n            ")))
}

func indent(original string) string {
@@ -573,6 +587,12 @@ def %s(target):
%s

def get_arch(target):
  # TODO(b/199363072): filegroups and file targets aren't associated with any
  # specific platform architecture in mixed builds. This is consistent with how
  # Soong treats filegroups, but it may not be the case with manually-written
  # filegroup BUILD targets.
  if target.kind in ["filegroup", ""]:
    return "common"
  buildoptions = build_options(target)
  platforms = build_options(target)["//command_line_option:platforms"]
  if len(platforms) != 1:
@@ -671,11 +691,12 @@ func (context *bazelContext) InvokeBazel() error {
	if err != nil {
		return err
	}

	buildrootLabel := "@soong_injection//mixed_builds:buildroot"
	cqueryOutput, cqueryErr, err = context.issueBazelCommand(
		context.paths,
		bazel.CqueryBuildRootRunName,
		bazelCommand{"cquery", fmt.Sprintf("kind(rule, deps(%s))", buildrootLabel)},
		bazelCommand{"cquery", fmt.Sprintf("deps(%s)", buildrootLabel)},
		"--output=starlark",
		"--starlark:file="+absolutePath(cqueryFileRelpath))
	err = ioutil.WriteFile(filepath.Join(soongInjectionPath, "cquery.out"),
+1 −1
Original line number Diff line number Diff line
@@ -11,7 +11,7 @@ func TestRequestResultsAfterInvokeBazel(t *testing.T) {
	label := "//foo:bar"
	arch := Arm64
	bazelContext, _ := testBazelContext(t, map[bazelCommand]string{
		bazelCommand{command: "cquery", expression: "kind(rule, deps(@soong_injection//mixed_builds:buildroot))"}: `//foo:bar|arm64>>out/foo/bar.txt`,
		bazelCommand{command: "cquery", expression: "deps(@soong_injection//mixed_builds:buildroot)"}: `//foo:bar|arm64>>out/foo/bar.txt`,
	})
	g, ok := bazelContext.GetOutputFiles(label, arch)
	if ok {
+1 −1
Original line number Diff line number Diff line
@@ -118,7 +118,7 @@ func (fg *fileGroup) GenerateBazelBuildActions(ctx ModuleContext) bool {
	}

	bazelCtx := ctx.Config().BazelContext
	filePaths, ok := bazelCtx.GetOutputFiles(fg.GetBazelLabel(ctx, fg), ctx.Arch().ArchType)
	filePaths, ok := bazelCtx.GetOutputFiles(fg.GetBazelLabel(ctx, fg), Common)
	if !ok {
		return false
	}