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

Commit 4526269c authored by Romain Jobredeaux's avatar Romain Jobredeaux Committed by Gerrit Code Review
Browse files

Merge "Initial bp2build converter for android_app."

parents 022a5fae 1282c424
Loading
Loading
Loading
Loading
+51 −2
Original line number Diff line number Diff line
@@ -228,6 +228,7 @@ var (
	bp2buildDefaultConfig = Bp2BuildConfig{
		"art/libdexfile":                        Bp2BuildDefaultTrueRecursively,
		"bionic":                                Bp2BuildDefaultTrueRecursively,
		"bootable/recovery/tools/recovery_l10n": Bp2BuildDefaultTrue,
		"build/bazel/examples/soong_config_variables":        Bp2BuildDefaultTrueRecursively,
		"build/bazel/examples/apex/minimal":                  Bp2BuildDefaultTrueRecursively,
		"build/soong":                                        Bp2BuildDefaultTrue,
@@ -235,6 +236,40 @@ var (
		"build/soong/cc/ndkstubgen":                          Bp2BuildDefaultTrue,
		"build/soong/cc/symbolfile":                          Bp2BuildDefaultTrue,
		"cts/common/device-side/nativetesthelper/jni":        Bp2BuildDefaultTrueRecursively,
		"development/apps/DevelopmentSettings":               Bp2BuildDefaultTrue,
		"development/apps/Fallback":                          Bp2BuildDefaultTrue,
		"development/apps/WidgetPreview":                     Bp2BuildDefaultTrue,
		"development/samples/BasicGLSurfaceView":             Bp2BuildDefaultTrue,
		"development/samples/BluetoothChat":                  Bp2BuildDefaultTrue,
		"development/samples/BrokenKeyDerivation":            Bp2BuildDefaultTrue,
		"development/samples/Compass":                        Bp2BuildDefaultTrue,
		"development/samples/ContactManager":                 Bp2BuildDefaultTrue,
		"development/samples/FixedGridLayout":                Bp2BuildDefaultTrue,
		"development/samples/HelloEffects":                   Bp2BuildDefaultTrue,
		"development/samples/Home":                           Bp2BuildDefaultTrue,
		"development/samples/HoneycombGallery":               Bp2BuildDefaultTrue,
		"development/samples/JetBoy":                         Bp2BuildDefaultTrue,
		"development/samples/KeyChainDemo":                   Bp2BuildDefaultTrue,
		"development/samples/LceDemo":                        Bp2BuildDefaultTrue,
		"development/samples/LunarLander":                    Bp2BuildDefaultTrue,
		"development/samples/MultiResolution":                Bp2BuildDefaultTrue,
		"development/samples/MultiWindow":                    Bp2BuildDefaultTrue,
		"development/samples/NotePad":                        Bp2BuildDefaultTrue,
		"development/samples/Obb":                            Bp2BuildDefaultTrue,
		"development/samples/RSSReader":                      Bp2BuildDefaultTrue,
		"development/samples/ReceiveShareDemo":               Bp2BuildDefaultTrue,
		"development/samples/SearchableDictionary":           Bp2BuildDefaultTrue,
		"development/samples/SipDemo":                        Bp2BuildDefaultTrue,
		"development/samples/SkeletonApp":                    Bp2BuildDefaultTrue,
		"development/samples/Snake":                          Bp2BuildDefaultTrue,
		"development/samples/SpellChecker/":                  Bp2BuildDefaultTrueRecursively,
		"development/samples/ThemedNavBarKeyboard":           Bp2BuildDefaultTrue,
		"development/samples/ToyVpn":                         Bp2BuildDefaultTrue,
		"development/samples/TtsEngine":                      Bp2BuildDefaultTrue,
		"development/samples/USB/AdbTest":                    Bp2BuildDefaultTrue,
		"development/samples/USB/MissileLauncher":            Bp2BuildDefaultTrue,
		"development/samples/VoiceRecognitionService":        Bp2BuildDefaultTrue,
		"development/samples/VoicemailProviderDemo":          Bp2BuildDefaultTrue,
		"development/sdk":                                    Bp2BuildDefaultTrueRecursively,
		"external/arm-optimized-routines":                    Bp2BuildDefaultTrueRecursively,
		"external/boringssl":                                 Bp2BuildDefaultTrueRecursively,
@@ -261,9 +296,19 @@ var (
		"external/selinux/libselinux":                        Bp2BuildDefaultTrueRecursively,
		"external/zlib":                                      Bp2BuildDefaultTrueRecursively,
		"external/zstd":                                      Bp2BuildDefaultTrueRecursively,
		"frameworks/base/media/tests/MediaDump":              Bp2BuildDefaultTrue,
		"frameworks/base/startop/apps/test":                  Bp2BuildDefaultTrue,
		"frameworks/native/libs/adbd_auth":                   Bp2BuildDefaultTrueRecursively,
		"frameworks/native/opengl/tests/gl2_cameraeye":       Bp2BuildDefaultTrue,
		"frameworks/native/opengl/tests/gl2_java":            Bp2BuildDefaultTrue,
		"frameworks/native/opengl/tests/testLatency":         Bp2BuildDefaultTrue,
		"frameworks/native/opengl/tests/testPauseResume":     Bp2BuildDefaultTrue,
		"frameworks/native/opengl/tests/testViewport":        Bp2BuildDefaultTrue,
		"frameworks/proto_logging/stats/stats_log_api_gen":   Bp2BuildDefaultTrueRecursively,
		"libnativehelper":                                    Bp2BuildDefaultTrueRecursively,
		"packages/apps/DevCamera":                            Bp2BuildDefaultTrue,
		"packages/apps/HTMLViewer":                           Bp2BuildDefaultTrue,
		"packages/apps/Protips":                              Bp2BuildDefaultTrue,
		"packages/modules/adb":                               Bp2BuildDefaultTrue,
		"packages/modules/adb/crypto":                        Bp2BuildDefaultTrueRecursively,
		"packages/modules/adb/libs":                          Bp2BuildDefaultTrueRecursively,
@@ -271,6 +316,9 @@ var (
		"packages/modules/adb/pairing_connection":            Bp2BuildDefaultTrueRecursively,
		"packages/modules/adb/proto":                         Bp2BuildDefaultTrueRecursively,
		"packages/modules/adb/tls":                           Bp2BuildDefaultTrueRecursively,
		"packages/providers/MediaProvider/tools/dialogs":     Bp2BuildDefaultTrue,
		"packages/screensavers/Basic":                        Bp2BuildDefaultTrue,
		"packages/services/Car/tests/SampleRearViewCamera":   Bp2BuildDefaultTrue,
		"prebuilts/clang/host/linux-x86":                     Bp2BuildDefaultTrueRecursively,
		"system/apex":                                        Bp2BuildDefaultFalse, // TODO(b/207466993): flaky failures
		"system/core/debuggerd":                              Bp2BuildDefaultTrue,
@@ -393,6 +441,7 @@ var (
		"mdnsd",        // http://b/202876379 has arch-variant static_executable

		"acvp_modulewrapper", // disabled for android x86/x86_64
		"CarHTMLViewer",      // depends on unconverted modules android.car-stubs, car-ui-lib
	}

	// Per-module denylist of cc_library modules to only generate the static
+11 −6
Original line number Diff line number Diff line
@@ -279,6 +279,16 @@ func transformSubpackagePaths(ctx BazelConversionPathContext, paths bazel.LabelL
	return newPaths
}

// Converts root-relative Paths to a list of bazel.Label relative to the module in ctx.
func RootToModuleRelativePaths(ctx BazelConversionPathContext, paths Paths) []bazel.Label {
	var newPaths []bazel.Label
	for _, path := range PathsWithModuleSrcSubDir(ctx, paths, "") {
		s := path.Rel()
		newPaths = append(newPaths, bazel.Label{Label: s})
	}
	return newPaths
}

// expandSrcsForBazel returns bazel.LabelList with paths rooted from the module's local source
// directory and Bazel target labels, excluding those included in the excludes argument (which
// should already be expanded to resolve references to Soong-modules). Valid elements of paths
@@ -328,12 +338,7 @@ func expandSrcsForBazel(ctx BazelConversionPathContext, paths, expandedExcludes
				// e.g. turn "math/*.c" in
				// external/arm-optimized-routines to external/arm-optimized-routines/math/*.c
				rootRelativeGlobPath := pathForModuleSrc(ctx, p).String()
				globbedPaths := GlobFiles(ctx, rootRelativeGlobPath, rootRelativeExpandedExcludes)
				globbedPaths = PathsWithModuleSrcSubDir(ctx, globbedPaths, "")
				for _, path := range globbedPaths {
					s := path.Rel()
					expandedPaths = append(expandedPaths, bazel.Label{Label: s})
				}
				expandedPaths = RootToModuleRelativePaths(ctx, GlobFiles(ctx, rootRelativeGlobPath, rootRelativeExpandedExcludes))
			} else {
				if !InList(p, expandedExcludes) {
					expandedPaths = append(expandedPaths, bazel.Label{Label: p})
+92 −0
Original line number Diff line number Diff line
// Copyright 2021 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 bp2build

import (
	"android/soong/android"
	"android/soong/java"

	"testing"
)

func runAndroidAppTestCase(t *testing.T, tc bp2buildTestCase) {
	t.Helper()
	runBp2BuildTestCase(t, registerAndroidAppModuleTypes, tc)
}

func registerAndroidAppModuleTypes(ctx android.RegistrationContext) {
}

func TestMinimalAndroidApp(t *testing.T) {
	runAndroidAppTestCase(t, bp2buildTestCase{
		description:                        "Android app - simple example",
		moduleTypeUnderTest:                "android_app",
		moduleTypeUnderTestFactory:         java.AndroidAppFactory,
		moduleTypeUnderTestBp2BuildMutator: java.AppBp2Build,
		filesystem: map[string]string{
			"app.java":            "",
			"res/res.png":         "",
			"AndroidManifest.xml": "",
		},
		blueprint: `
android_app {
        name: "TestApp",
        srcs: ["app.java"],
        sdk_version: "current",
}
`,
		expectedBazelTargets: []string{
			makeBazelTarget("android_binary", "TestApp", attrNameToString{
				"srcs":           `["app.java"]`,
				"manifest":       `"AndroidManifest.xml"`,
				"resource_files": `["res/res.png"]`,
			}),
		}})
}

func TestAndroidAppAllSupportedFields(t *testing.T) {
	runAndroidAppTestCase(t, bp2buildTestCase{
		description:                        "Android app - all supported fields",
		moduleTypeUnderTest:                "android_app",
		moduleTypeUnderTestFactory:         java.AndroidAppFactory,
		moduleTypeUnderTestBp2BuildMutator: java.AppBp2Build,
		filesystem: map[string]string{
			"app.java":                     "",
			"resa/res.png":                 "",
			"resb/res.png":                 "",
			"manifest/AndroidManifest.xml": "",
		},
		blueprint: `
android_app {
        name: "TestApp",
        srcs: ["app.java"],
        sdk_version: "current",
        package_name: "com.google",
        resource_dirs: ["resa", "resb"],
        manifest: "manifest/AndroidManifest.xml",
}
`,
		expectedBazelTargets: []string{
			makeBazelTarget("android_binary", "TestApp", attrNameToString{
				"srcs":     `["app.java"]`,
				"manifest": `"manifest/AndroidManifest.xml"`,
				"resource_files": `[
        "resa/res.png",
        "resb/res.png",
    ]`,
				"custom_package": `"com.google"`,
			}),
		}})
}
+1 −1
Original line number Diff line number Diff line
@@ -43,7 +43,7 @@ var androidResourceIgnoreFilenames = []string{

// androidResourceGlob returns the list of files in the given directory, using the standard
// exclusion patterns for Android resources.
func androidResourceGlob(ctx android.ModuleContext, dir android.Path) android.Paths {
func androidResourceGlob(ctx android.EarlyModuleContext, dir android.Path) android.Paths {
	return ctx.GlobFiles(filepath.Join(dir.String(), "**/*"), androidResourceIgnoreFilenames)
}

+46 −0
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@ func RegisterAppBuildComponents(ctx android.RegistrationContext) {
	ctx.RegisterModuleType("override_android_test", OverrideAndroidTestModuleFactory)

	android.RegisterBp2BuildMutator("android_app_certificate", AndroidAppCertificateBp2Build)
	android.RegisterBp2BuildMutator("android_app", AppBp2Build)
}

// AndroidManifest.xml merging
@@ -139,6 +140,7 @@ type overridableAppProperties struct {
}

type AndroidApp struct {
	android.BazelModuleBase
	Library
	aapt
	android.OverridableModuleBase
@@ -1438,3 +1440,47 @@ func androidAppCertificateBp2BuildInternal(ctx android.TopDownMutatorContext, mo

	ctx.CreateBazelTargetModule(props, android.CommonAttributes{Name: module.Name()}, attrs)
}

type bazelAndroidAppAttributes struct {
	Srcs           bazel.LabelListAttribute
	Manifest       bazel.Label
	Custom_package *string
	Resource_files bazel.LabelListAttribute
}

// AppBp2Build is used for android_app.
func AppBp2Build(ctx android.TopDownMutatorContext) {
	a, ok := ctx.Module().(*AndroidApp)
	if !ok || !a.ConvertWithBp2build(ctx) {
		return
	}
	if ctx.ModuleType() != "android_app" {
		return
	}

	//TODO(b/209577426): Support multiple arch variants
	srcs := bazel.MakeLabelListAttribute(android.BazelLabelForModuleSrcExcludes(ctx, a.properties.Srcs, a.properties.Exclude_srcs))

	manifest := proptools.StringDefault(a.aaptProperties.Manifest, "AndroidManifest.xml")

	resourceFiles := bazel.LabelList{
		Includes: []bazel.Label{},
	}
	for _, dir := range android.PathsWithOptionalDefaultForModuleSrc(ctx, a.aaptProperties.Resource_dirs, "res") {
		files := android.RootToModuleRelativePaths(ctx, androidResourceGlob(ctx, dir))
		resourceFiles.Includes = append(resourceFiles.Includes, files...)
	}

	attrs := &bazelAndroidAppAttributes{
		Srcs:     srcs,
		Manifest: android.BazelLabelForModuleSrcSingle(ctx, manifest),
		// TODO(b/209576404): handle package name override by product variable PRODUCT_MANIFEST_PACKAGE_NAME_OVERRIDES
		Custom_package: a.overridableAppProperties.Package_name,
		Resource_files: bazel.MakeLabelListAttribute(resourceFiles),
	}
	props := bazel.BazelTargetModuleProperties{Rule_class: "android_binary",
		Bzl_load_location: "@rules_android//rules:rules.bzl"}

	ctx.CreateBazelTargetModule(props, android.CommonAttributes{Name: a.Name()}, attrs)

}