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

Commit ea1aae28 authored by Yu Liu's avatar Yu Liu Committed by Automerger Merge Worker
Browse files

Merge "Enable cc_binary in mixed build." am: 9d7d9810

Original change: https://android-review.googlesource.com/c/platform/build/soong/+/1983488

Change-Id: I88bc7baa0db521b52be1a581c6d230d43287766a
parents a8c5d379 9d7d9810
Loading
Loading
Loading
Loading
+25 −0
Original line number Diff line number Diff line
@@ -540,6 +540,31 @@ var (
		"libadb_pairing_connection",
		"libadb_pairing_connection_static",
		"libadb_pairing_server", "libadb_pairing_server_static",

		// TODO(b/204811222) support suffix in cc_binary
		"acvp_modulewrapper",
		"android.hardware.media.c2@1.0-service-v4l2",
		"app_process",
		"bar_test",
		"bench_cxa_atexit",
		"bench_noop",
		"bench_noop_nostl",
		"bench_noop_static",
		"boringssl_self_test",
		"boringssl_self_test_vendor",
		"bssl",
		"cavp",
		"crash_dump",
		"crasher",
		"libcxx_test_template",
		"linker",
		"memory_replay",
		"native_bridge_guest_linker",
		"native_bridge_stub_library_defaults",
		"noop",
		"simpleperf_ndk",
		"toybox-static",
		"zlib_bench",
	}

	// Used for quicker lookups
+23 −0
Original line number Diff line number Diff line
@@ -70,6 +70,7 @@ func RegisterBinaryBuildComponents(ctx android.RegistrationContext) {
// cc_binary produces a binary that is runnable on a device.
func BinaryFactory() android.Module {
	module, _ := newBinary(android.HostAndDeviceSupported, true)
	module.bazelHandler = &ccBinaryBazelHandler{module: module}
	return module.Init()
}

@@ -556,6 +557,28 @@ func (binary *binaryDecorator) verifyHostBionicLinker(ctx ModuleContext, in, lin
	})
}

type ccBinaryBazelHandler struct {
	android.BazelHandler

	module *Module
}

func (handler *ccBinaryBazelHandler) GenerateBazelBuildActions(ctx android.ModuleContext, label string) bool {
	bazelCtx := ctx.Config().BazelContext
	filePaths, ok := bazelCtx.GetOutputFiles(label, android.GetConfigKey(ctx))
	if ok {
		if len(filePaths) != 1 {
			ctx.ModuleErrorf("expected exactly one output file for '%s', but got %s", label, filePaths)
			return false
		}
		outputFilePath := android.PathForBazelOut(ctx, filePaths[0])
		handler.module.outputFile = android.OptionalPathForPath(outputFilePath)
		// TODO(b/220164721): We need to decide if we should return the stripped as the unstripped.
		handler.module.linker.(*binaryDecorator).unstrippedOutputFile = outputFilePath
	}
	return ok
}

func binaryBp2build(ctx android.TopDownMutatorContext, m *Module, typ string) {
	baseAttrs := bp2BuildParseBaseProps(ctx, m)
	binaryLinkerAttrs := bp2buildBinaryLinkerProps(ctx, m)

cc/binary_test.go

0 → 100644
+51 −0
Original line number Diff line number Diff line
// Copyright 2022 Google Inc. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package cc

import (
	"testing"

	"android/soong/android"
)

func TestCcBinaryWithBazel(t *testing.T) {
	bp := `
cc_binary {
	name: "foo",
	srcs: ["foo.cc"],
	bazel_module: { label: "//foo/bar:bar" },
}`
	config := TestConfig(t.TempDir(), android.Android, nil, bp, nil)
	config.BazelContext = android.MockBazelContext{
		OutputBaseDir: "outputbase",
		LabelToOutputFiles: map[string][]string{
			"//foo/bar:bar": []string{"foo"},
		},
	}
	ctx := testCcWithConfig(t, config)

	binMod := ctx.ModuleForTests("foo", "android_arm64_armv8-a").Module()
	producer := binMod.(android.OutputFileProducer)
	outputFiles, err := producer.OutputFiles("")
	if err != nil {
		t.Errorf("Unexpected error getting cc_binary outputfiles %s", err)
	}
	expectedOutputFiles := []string{"outputbase/execroot/__main__/foo"}
	android.AssertDeepEquals(t, "output files", expectedOutputFiles, outputFiles.Strings())

	unStrippedFilePath := binMod.(*Module).UnstrippedOutputFile()
	expectedUnStrippedFile := "outputbase/execroot/__main__/foo"
	android.AssertStringEquals(t, "Unstripped output file", expectedUnStrippedFile, unStrippedFilePath.String())
}