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

Commit 962982a7 authored by Jooyung Han's avatar Jooyung Han Committed by android-build-merger
Browse files

Merge "soong: Fix AndroidMk with *Required properties"

am: 0f7dbd0d

Change-Id: I588aeda47a66334b16294e36333f653001fd37b1
parents 4f4a4980 0f7dbd0d
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -81,6 +81,7 @@ bootstrap_go_package {
    ],
    testSrcs: [
        "android/android_test.go",
        "android/androidmk_test.go",
        "android/arch_test.go",
        "android/config_test.go",
        "android/expand_test.go",
@@ -291,6 +292,7 @@ bootstrap_go_package {
        "java/testing.go",
    ],
    testSrcs: [
        "java/androidmk_test.go",
        "java/app_test.go",
        "java/device_host_converter_test.go",
        "java/dexpreopt_test.go",
+24 −14
Original line number Diff line number Diff line
@@ -391,19 +391,7 @@ func translateGoBinaryModule(ctx SingletonContext, w io.Writer, mod blueprint.Mo
	return nil
}

func translateAndroidModule(ctx SingletonContext, w io.Writer, mod blueprint.Module,
	provider AndroidMkDataProvider) error {

	amod := mod.(Module).base()
	if shouldSkipAndroidMkProcessing(amod) {
		return nil
	}

	data := provider.AndroidMk()
	if data.Include == "" {
		data.Include = "$(BUILD_PREBUILT)"
	}

func (data *AndroidMkData) fillInData(config Config, bpPath string, mod blueprint.Module) {
	// Get the preamble content through AndroidMkEntries logic.
	entries := AndroidMkEntries{
		Class:           data.Class,
@@ -416,11 +404,33 @@ func translateAndroidModule(ctx SingletonContext, w io.Writer, mod blueprint.Mod
		Host_required:   data.Host_required,
		Target_required: data.Target_required,
	}
	entries.fillInEntries(ctx.Config(), ctx.BlueprintFile(mod), mod)
	entries.fillInEntries(config, bpPath, mod)

	// preamble doesn't need the footer content.
	entries.footer = bytes.Buffer{}
	entries.write(&data.preamble)

	// copy entries back to data since it is used in Custom
	data.Required = entries.Required
	data.Host_required = entries.Host_required
	data.Target_required = entries.Target_required
}

func translateAndroidModule(ctx SingletonContext, w io.Writer, mod blueprint.Module,
	provider AndroidMkDataProvider) error {

	amod := mod.(Module).base()
	if shouldSkipAndroidMkProcessing(amod) {
		return nil
	}

	data := provider.AndroidMk()
	if data.Include == "" {
		data.Include = "$(BUILD_PREBUILT)"
	}

	data.fillInData(ctx.Config(), ctx.BlueprintFile(mod), mod)

	prefix := ""
	if amod.ArchSpecific() {
		switch amod.Os().Class {
+82 −0
Original line number Diff line number Diff line
// Copyright 2019 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 android

import (
	"io"
	"reflect"
	"testing"
)

type customModule struct {
	ModuleBase
	data AndroidMkData
}

func (m *customModule) GenerateAndroidBuildActions(ctx ModuleContext) {
}

func (m *customModule) AndroidMk() AndroidMkData {
	return AndroidMkData{
		Custom: func(w io.Writer, name, prefix, moduleDir string, data AndroidMkData) {
			m.data = data
		},
	}
}

func customModuleFactory() Module {
	module := &customModule{}
	InitAndroidModule(module)
	return module
}

func TestAndroidMkSingleton_PassesUpdatedAndroidMkDataToCustomCallback(t *testing.T) {
	config := TestConfig(buildDir, nil)
	config.inMake = true // Enable androidmk Singleton

	ctx := NewTestContext()
	ctx.RegisterSingletonType("androidmk", SingletonFactoryAdaptor(AndroidMkSingleton))
	ctx.RegisterModuleType("custom", ModuleFactoryAdaptor(customModuleFactory))
	ctx.Register()

	bp := `
	custom {
		name: "foo",
		required: ["bar"],
		host_required: ["baz"],
		target_required: ["qux"],
	}
	`

	ctx.MockFileSystem(map[string][]byte{
		"Android.bp": []byte(bp),
	})

	_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
	FailIfErrored(t, errs)
	_, errs = ctx.PrepareBuildActions(config)
	FailIfErrored(t, errs)

	m := ctx.ModuleForTests("foo", "").Module().(*customModule)

	assertEqual := func(expected interface{}, actual interface{}) {
		if !reflect.DeepEqual(expected, actual) {
			t.Errorf("%q expected, but got %q", expected, actual)
		}
	}
	assertEqual([]string{"bar"}, m.data.Required)
	assertEqual([]string{"baz"}, m.data.Host_required)
	assertEqual([]string{"qux"}, m.data.Target_required)
}
+11 −0
Original line number Diff line number Diff line
@@ -382,3 +382,14 @@ func AndroidMkEntriesForTest(t *testing.T, config Config, bpPath string, mod blu
	entries.fillInEntries(config, bpPath, mod)
	return entries
}

func AndroidMkDataForTest(t *testing.T, config Config, bpPath string, mod blueprint.Module) AndroidMkData {
	var p AndroidMkDataProvider
	var ok bool
	if p, ok = mod.(AndroidMkDataProvider); !ok {
		t.Errorf("module does not implmement AndroidMkDataProvider: " + mod.Name())
	}
	data := p.AndroidMk()
	data.fillInData(config, bpPath, mod)
	return data
}
+11 −0
Original line number Diff line number Diff line
@@ -115,6 +115,17 @@ func PrefixInList(s string, list []string) bool {
	return false
}

// IndexListPred returns the index of the element which in the given `list` satisfying the predicate, or -1 if there is no such element.
func IndexListPred(pred func(s string) bool, list []string) int {
	for i, l := range list {
		if pred(l) {
			return i
		}
	}

	return -1
}

func FilterList(list []string, filter []string) (remainder []string, filtered []string) {
	for _, l := range list {
		if InList(l, filter) {
Loading