aboutsummaryrefslogtreecommitdiff
path: root/soong/robolectric.go
blob: cadeb0fadb0c9e755fb243f8eb75598412194afc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
// Copyright (C) 2019 The Android Open Source Project
//
// 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 robolectric

import (
	"fmt"
	"strings"

	"android/soong/android"
)

var pctx = android.NewPackageContext("android/soong/robolectric")

func init() {
	pctx.Import("android/soong/android")
	android.RegisterModuleType("robolectric_build_props", buildPropsFactory)
}

type buildProps struct {
	android.ModuleBase
	output android.WritablePath
}

var _ android.SourceFileProducer = (*buildProps)(nil)

func (b *buildProps) Srcs() android.Paths {
	return android.Paths{b.output}
}

func (b *buildProps) GenerateAndroidBuildActions(ctx android.ModuleContext) {

	displayID := fmt.Sprintf("robolectric %s %s",
		ctx.Config().PlatformVersionName(),
		ctx.Config().BuildId())

	lines := []string{
		"# build properties autogenerated by robolectric.go",
		"",
		"ro.build.id=" + ctx.Config().BuildId(),
		"ro.build.display.id=" + displayID,
		"ro.product.name=robolectric",
		"ro.product.device=robolectric",
		"ro.product.board=robolectric",
		"ro.product.manufacturer=robolectric",
		"ro.product.brand=robolectric",
		"ro.product.model=robolectric",
		"ro.hardware=robolectric",
		"ro.build.version.security_patch=" + ctx.Config().PlatformSecurityPatch(),
		"ro.build.version.sdk=" + ctx.Config().PlatformSdkVersion().String(),
		"ro.build.version.release=" + ctx.Config().PlatformVersionName(),
		"ro.build.version.preview_sdk=" + ctx.Config().PlatformPreviewSdkVersion(),
		// We don't have the API fingerprint available, just use the preview SDK version.
		"ro.build.version.preview_sdk_fingerprint=" + ctx.Config().PlatformPreviewSdkVersion(),
		"ro.build.version.codename=" + ctx.Config().PlatformSdkCodename(),
		"ro.build.version.all_codenames=" + strings.Join(ctx.Config().PlatformVersionActiveCodenames(), ","),
		"ro.build.version.min_supported_target_sdk=" + ctx.Config().PlatformMinSupportedTargetSdkVersion(),
		"ro.build.version.base_os=" + ctx.Config().PlatformBaseOS(),
		"ro.build.tags=robolectric",
		"ro.build.fingerprint=robolectric",
		"ro.build.characteristics=robolectric",
		"",
		"# for backwards-compatibility reasons, set CPUs to unknown/ARM",
		"ro.product.cpu.abi=unknown",
		"ro.product.cpu.abi2=unknown",
		"ro.product.cpu.abilist=armeabi-v7a",
		"ro.product.cpu.abilist32=armeabi-v7a,armeabi",
		"ro.product.cpu.abilist64=armeabi-v7a,armeabi",
		"",
		"# temp fix for robolectric freezing issue b/150011638",
		"persist.debug.new_insets=0",
	}

	b.output = android.PathForModuleGen(ctx, "build.prop")

	rule := android.NewRuleBuilder(pctx, ctx)

	rule.Command().Text("rm").Flag("-f").Output(b.output)
	for _, l := range lines {
		rule.Command().Text("echo").Text("'" + l + "'").Text(">>").Output(b.output)
	}

	rule.Build("build_prop", "robolectric build.prop")
}

func buildPropsFactory() android.Module {
	module := &buildProps{}
	android.InitAndroidModule(module)
	return module
}