xref: /aosp_15_r20/build/soong/sysprop/sysprop_library.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright (C) 2019 The Android Open Source Project
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Worker// sysprop package defines a module named sysprop_library that can implement sysprop as API
16*333d2b36SAndroid Build Coastguard Worker// See https://source.android.com/devices/architecture/sysprops-apis for details
17*333d2b36SAndroid Build Coastguard Workerpackage sysprop
18*333d2b36SAndroid Build Coastguard Worker
19*333d2b36SAndroid Build Coastguard Workerimport (
20*333d2b36SAndroid Build Coastguard Worker	"fmt"
21*333d2b36SAndroid Build Coastguard Worker	"io"
22*333d2b36SAndroid Build Coastguard Worker	"os"
23*333d2b36SAndroid Build Coastguard Worker	"path"
24*333d2b36SAndroid Build Coastguard Worker	"strings"
25*333d2b36SAndroid Build Coastguard Worker	"sync"
26*333d2b36SAndroid Build Coastguard Worker
27*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint"
28*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/proptools"
29*333d2b36SAndroid Build Coastguard Worker
30*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
31*333d2b36SAndroid Build Coastguard Worker	"android/soong/cc"
32*333d2b36SAndroid Build Coastguard Worker	"android/soong/java"
33*333d2b36SAndroid Build Coastguard Worker	"android/soong/rust"
34*333d2b36SAndroid Build Coastguard Worker)
35*333d2b36SAndroid Build Coastguard Worker
36*333d2b36SAndroid Build Coastguard Workertype dependencyTag struct {
37*333d2b36SAndroid Build Coastguard Worker	blueprint.BaseDependencyTag
38*333d2b36SAndroid Build Coastguard Worker	name string
39*333d2b36SAndroid Build Coastguard Worker}
40*333d2b36SAndroid Build Coastguard Worker
41*333d2b36SAndroid Build Coastguard Workertype syspropGenProperties struct {
42*333d2b36SAndroid Build Coastguard Worker	Srcs      []string `android:"path"`
43*333d2b36SAndroid Build Coastguard Worker	Scope     string
44*333d2b36SAndroid Build Coastguard Worker	Name      *string
45*333d2b36SAndroid Build Coastguard Worker	Check_api *string
46*333d2b36SAndroid Build Coastguard Worker}
47*333d2b36SAndroid Build Coastguard Worker
48*333d2b36SAndroid Build Coastguard Workertype syspropJavaGenRule struct {
49*333d2b36SAndroid Build Coastguard Worker	android.ModuleBase
50*333d2b36SAndroid Build Coastguard Worker
51*333d2b36SAndroid Build Coastguard Worker	properties syspropGenProperties
52*333d2b36SAndroid Build Coastguard Worker}
53*333d2b36SAndroid Build Coastguard Worker
54*333d2b36SAndroid Build Coastguard Workertype syspropRustGenRule struct {
55*333d2b36SAndroid Build Coastguard Worker	*rust.BaseSourceProvider
56*333d2b36SAndroid Build Coastguard Worker
57*333d2b36SAndroid Build Coastguard Worker	properties rustLibraryProperties
58*333d2b36SAndroid Build Coastguard Worker}
59*333d2b36SAndroid Build Coastguard Worker
60*333d2b36SAndroid Build Coastguard Workervar _ rust.SourceProvider = (*syspropRustGenRule)(nil)
61*333d2b36SAndroid Build Coastguard Worker
62*333d2b36SAndroid Build Coastguard Workervar (
63*333d2b36SAndroid Build Coastguard Worker	syspropJava = pctx.AndroidStaticRule("syspropJava",
64*333d2b36SAndroid Build Coastguard Worker		blueprint.RuleParams{
65*333d2b36SAndroid Build Coastguard Worker			Command: `rm -rf $out.tmp && mkdir -p $out.tmp && ` +
66*333d2b36SAndroid Build Coastguard Worker				`$syspropJavaCmd --scope $scope --java-output-dir $out.tmp $in && ` +
67*333d2b36SAndroid Build Coastguard Worker				`$soongZipCmd -jar -o $out -C $out.tmp -D $out.tmp && rm -rf $out.tmp`,
68*333d2b36SAndroid Build Coastguard Worker			CommandDeps: []string{
69*333d2b36SAndroid Build Coastguard Worker				"$syspropJavaCmd",
70*333d2b36SAndroid Build Coastguard Worker				"$soongZipCmd",
71*333d2b36SAndroid Build Coastguard Worker			},
72*333d2b36SAndroid Build Coastguard Worker		}, "scope")
73*333d2b36SAndroid Build Coastguard Worker	syspropRust = pctx.AndroidStaticRule("syspropRust",
74*333d2b36SAndroid Build Coastguard Worker		blueprint.RuleParams{
75*333d2b36SAndroid Build Coastguard Worker			Command: `rm -rf $out_dir && mkdir -p $out_dir && ` +
76*333d2b36SAndroid Build Coastguard Worker				`$syspropRustCmd --scope $scope --rust-output-dir $out_dir $in`,
77*333d2b36SAndroid Build Coastguard Worker			CommandDeps: []string{
78*333d2b36SAndroid Build Coastguard Worker				"$syspropRustCmd",
79*333d2b36SAndroid Build Coastguard Worker			},
80*333d2b36SAndroid Build Coastguard Worker		}, "scope", "out_dir")
81*333d2b36SAndroid Build Coastguard Worker)
82*333d2b36SAndroid Build Coastguard Worker
83*333d2b36SAndroid Build Coastguard Workerfunc init() {
84*333d2b36SAndroid Build Coastguard Worker	pctx.HostBinToolVariable("soongZipCmd", "soong_zip")
85*333d2b36SAndroid Build Coastguard Worker	pctx.HostBinToolVariable("syspropJavaCmd", "sysprop_java")
86*333d2b36SAndroid Build Coastguard Worker	pctx.HostBinToolVariable("syspropRustCmd", "sysprop_rust")
87*333d2b36SAndroid Build Coastguard Worker}
88*333d2b36SAndroid Build Coastguard Worker
89*333d2b36SAndroid Build Coastguard Worker// syspropJavaGenRule module generates srcjar containing generated java APIs.
90*333d2b36SAndroid Build Coastguard Worker// It also depends on check api rule, so api check has to pass to use sysprop_library.
91*333d2b36SAndroid Build Coastguard Workerfunc (g *syspropJavaGenRule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
92*333d2b36SAndroid Build Coastguard Worker	var checkApiFileTimeStamp android.WritablePath
93*333d2b36SAndroid Build Coastguard Worker
94*333d2b36SAndroid Build Coastguard Worker	ctx.VisitDirectDeps(func(dep android.Module) {
95*333d2b36SAndroid Build Coastguard Worker		if m, ok := dep.(*syspropLibrary); ok {
96*333d2b36SAndroid Build Coastguard Worker			checkApiFileTimeStamp = m.checkApiFileTimeStamp
97*333d2b36SAndroid Build Coastguard Worker		}
98*333d2b36SAndroid Build Coastguard Worker	})
99*333d2b36SAndroid Build Coastguard Worker
100*333d2b36SAndroid Build Coastguard Worker	var genSrcjars android.Paths
101*333d2b36SAndroid Build Coastguard Worker	for _, syspropFile := range android.PathsForModuleSrc(ctx, g.properties.Srcs) {
102*333d2b36SAndroid Build Coastguard Worker		srcJarFile := android.GenPathWithExt(ctx, "sysprop", syspropFile, "srcjar")
103*333d2b36SAndroid Build Coastguard Worker
104*333d2b36SAndroid Build Coastguard Worker		ctx.Build(pctx, android.BuildParams{
105*333d2b36SAndroid Build Coastguard Worker			Rule:        syspropJava,
106*333d2b36SAndroid Build Coastguard Worker			Description: "sysprop_java " + syspropFile.Rel(),
107*333d2b36SAndroid Build Coastguard Worker			Output:      srcJarFile,
108*333d2b36SAndroid Build Coastguard Worker			Input:       syspropFile,
109*333d2b36SAndroid Build Coastguard Worker			Implicit:    checkApiFileTimeStamp,
110*333d2b36SAndroid Build Coastguard Worker			Args: map[string]string{
111*333d2b36SAndroid Build Coastguard Worker				"scope": g.properties.Scope,
112*333d2b36SAndroid Build Coastguard Worker			},
113*333d2b36SAndroid Build Coastguard Worker		})
114*333d2b36SAndroid Build Coastguard Worker
115*333d2b36SAndroid Build Coastguard Worker		genSrcjars = append(genSrcjars, srcJarFile)
116*333d2b36SAndroid Build Coastguard Worker	}
117*333d2b36SAndroid Build Coastguard Worker
118*333d2b36SAndroid Build Coastguard Worker	ctx.SetOutputFiles(genSrcjars, "")
119*333d2b36SAndroid Build Coastguard Worker}
120*333d2b36SAndroid Build Coastguard Worker
121*333d2b36SAndroid Build Coastguard Workerfunc (g *syspropJavaGenRule) DepsMutator(ctx android.BottomUpMutatorContext) {
122*333d2b36SAndroid Build Coastguard Worker	// Add a dependency from the stubs to sysprop library so that the generator rule can depend on
123*333d2b36SAndroid Build Coastguard Worker	// the check API rule of the sysprop library.
124*333d2b36SAndroid Build Coastguard Worker	ctx.AddFarVariationDependencies(nil, nil, proptools.String(g.properties.Check_api))
125*333d2b36SAndroid Build Coastguard Worker}
126*333d2b36SAndroid Build Coastguard Worker
127*333d2b36SAndroid Build Coastguard Workerfunc syspropJavaGenFactory() android.Module {
128*333d2b36SAndroid Build Coastguard Worker	g := &syspropJavaGenRule{}
129*333d2b36SAndroid Build Coastguard Worker	g.AddProperties(&g.properties)
130*333d2b36SAndroid Build Coastguard Worker	android.InitAndroidModule(g)
131*333d2b36SAndroid Build Coastguard Worker	return g
132*333d2b36SAndroid Build Coastguard Worker}
133*333d2b36SAndroid Build Coastguard Worker
134*333d2b36SAndroid Build Coastguard Worker// syspropRustGenRule module generates rust source files containing generated rust APIs.
135*333d2b36SAndroid Build Coastguard Worker// It also depends on check api rule, so api check has to pass to use sysprop_library.
136*333d2b36SAndroid Build Coastguard Workerfunc (g *syspropRustGenRule) GenerateSource(ctx rust.ModuleContext, deps rust.PathDeps) android.Path {
137*333d2b36SAndroid Build Coastguard Worker	var checkApiFileTimeStamp android.WritablePath
138*333d2b36SAndroid Build Coastguard Worker
139*333d2b36SAndroid Build Coastguard Worker	ctx.VisitDirectDeps(func(dep android.Module) {
140*333d2b36SAndroid Build Coastguard Worker		if m, ok := dep.(*syspropLibrary); ok {
141*333d2b36SAndroid Build Coastguard Worker			checkApiFileTimeStamp = m.checkApiFileTimeStamp
142*333d2b36SAndroid Build Coastguard Worker		}
143*333d2b36SAndroid Build Coastguard Worker	})
144*333d2b36SAndroid Build Coastguard Worker
145*333d2b36SAndroid Build Coastguard Worker	outputDir := android.PathForModuleOut(ctx, "src")
146*333d2b36SAndroid Build Coastguard Worker	libFile := outputDir.Join(ctx, "lib.rs")
147*333d2b36SAndroid Build Coastguard Worker	g.BaseSourceProvider.OutputFiles = append(g.BaseSourceProvider.OutputFiles, libFile)
148*333d2b36SAndroid Build Coastguard Worker	libFileLines := []string{"//! Autogenerated system property accessors."}
149*333d2b36SAndroid Build Coastguard Worker
150*333d2b36SAndroid Build Coastguard Worker	for _, syspropFile := range android.PathsForModuleSrc(ctx, g.properties.Sysprop_srcs) {
151*333d2b36SAndroid Build Coastguard Worker		moduleName := syspropPathToRustModule(syspropFile)
152*333d2b36SAndroid Build Coastguard Worker		moduleDir := outputDir.Join(ctx, moduleName)
153*333d2b36SAndroid Build Coastguard Worker		modulePath := moduleDir.Join(ctx, "mod.rs")
154*333d2b36SAndroid Build Coastguard Worker
155*333d2b36SAndroid Build Coastguard Worker		ctx.Build(pctx, android.BuildParams{
156*333d2b36SAndroid Build Coastguard Worker			Rule:        syspropRust,
157*333d2b36SAndroid Build Coastguard Worker			Description: "sysprop_rust " + syspropFile.Rel(),
158*333d2b36SAndroid Build Coastguard Worker			Output:      modulePath,
159*333d2b36SAndroid Build Coastguard Worker			Input:       syspropFile,
160*333d2b36SAndroid Build Coastguard Worker			Implicit:    checkApiFileTimeStamp,
161*333d2b36SAndroid Build Coastguard Worker			Args: map[string]string{
162*333d2b36SAndroid Build Coastguard Worker				"scope":   g.properties.Scope,
163*333d2b36SAndroid Build Coastguard Worker				"out_dir": moduleDir.String(),
164*333d2b36SAndroid Build Coastguard Worker			},
165*333d2b36SAndroid Build Coastguard Worker		})
166*333d2b36SAndroid Build Coastguard Worker
167*333d2b36SAndroid Build Coastguard Worker		g.BaseSourceProvider.OutputFiles = append(g.BaseSourceProvider.OutputFiles, modulePath)
168*333d2b36SAndroid Build Coastguard Worker		libFileLines = append(libFileLines, fmt.Sprintf("pub mod %s;", moduleName))
169*333d2b36SAndroid Build Coastguard Worker	}
170*333d2b36SAndroid Build Coastguard Worker
171*333d2b36SAndroid Build Coastguard Worker	libFileSource := strings.Join(libFileLines, "\n")
172*333d2b36SAndroid Build Coastguard Worker	android.WriteFileRule(ctx, libFile, libFileSource)
173*333d2b36SAndroid Build Coastguard Worker
174*333d2b36SAndroid Build Coastguard Worker	return libFile
175*333d2b36SAndroid Build Coastguard Worker}
176*333d2b36SAndroid Build Coastguard Worker
177*333d2b36SAndroid Build Coastguard Workerfunc (g *syspropRustGenRule) SourceProviderProps() []interface{} {
178*333d2b36SAndroid Build Coastguard Worker	return append(g.BaseSourceProvider.SourceProviderProps(), &g.Properties)
179*333d2b36SAndroid Build Coastguard Worker}
180*333d2b36SAndroid Build Coastguard Worker
181*333d2b36SAndroid Build Coastguard Worker// syspropPathToRustModule takes a path to a .sysprop file and returns the name to use for the
182*333d2b36SAndroid Build Coastguard Worker// corresponding Rust module.
183*333d2b36SAndroid Build Coastguard Workerfunc syspropPathToRustModule(syspropFilename android.Path) string {
184*333d2b36SAndroid Build Coastguard Worker	filenameBase := strings.TrimSuffix(syspropFilename.Base(), ".sysprop")
185*333d2b36SAndroid Build Coastguard Worker	return strings.ToLower(filenameBase)
186*333d2b36SAndroid Build Coastguard Worker}
187*333d2b36SAndroid Build Coastguard Worker
188*333d2b36SAndroid Build Coastguard Workerfunc (g *syspropRustGenRule) DepsMutator(ctx android.BottomUpMutatorContext) {
189*333d2b36SAndroid Build Coastguard Worker	// Add a dependency from the stubs to sysprop library so that the generator rule can depend on
190*333d2b36SAndroid Build Coastguard Worker	// the check API rule of the sysprop library.
191*333d2b36SAndroid Build Coastguard Worker	ctx.AddFarVariationDependencies(nil, nil, proptools.String(g.properties.Check_api))
192*333d2b36SAndroid Build Coastguard Worker}
193*333d2b36SAndroid Build Coastguard Worker
194*333d2b36SAndroid Build Coastguard Workerfunc syspropRustGenFactory() android.Module {
195*333d2b36SAndroid Build Coastguard Worker	g := &syspropRustGenRule{
196*333d2b36SAndroid Build Coastguard Worker		BaseSourceProvider: rust.NewSourceProvider(),
197*333d2b36SAndroid Build Coastguard Worker	}
198*333d2b36SAndroid Build Coastguard Worker	sourceProvider := rust.NewSourceProviderModule(android.DeviceSupported, g, false, false)
199*333d2b36SAndroid Build Coastguard Worker	sourceProvider.AddProperties(&g.properties)
200*333d2b36SAndroid Build Coastguard Worker	return sourceProvider.Init()
201*333d2b36SAndroid Build Coastguard Worker}
202*333d2b36SAndroid Build Coastguard Worker
203*333d2b36SAndroid Build Coastguard Workertype syspropLibrary struct {
204*333d2b36SAndroid Build Coastguard Worker	android.ModuleBase
205*333d2b36SAndroid Build Coastguard Worker	android.ApexModuleBase
206*333d2b36SAndroid Build Coastguard Worker
207*333d2b36SAndroid Build Coastguard Worker	properties syspropLibraryProperties
208*333d2b36SAndroid Build Coastguard Worker
209*333d2b36SAndroid Build Coastguard Worker	checkApiFileTimeStamp android.WritablePath
210*333d2b36SAndroid Build Coastguard Worker	latestApiFile         android.OptionalPath
211*333d2b36SAndroid Build Coastguard Worker	currentApiFile        android.OptionalPath
212*333d2b36SAndroid Build Coastguard Worker	dumpedApiFile         android.WritablePath
213*333d2b36SAndroid Build Coastguard Worker}
214*333d2b36SAndroid Build Coastguard Worker
215*333d2b36SAndroid Build Coastguard Workertype syspropLibraryProperties struct {
216*333d2b36SAndroid Build Coastguard Worker	// Determine who owns this sysprop library. Possible values are
217*333d2b36SAndroid Build Coastguard Worker	// "Platform", "Vendor", or "Odm"
218*333d2b36SAndroid Build Coastguard Worker	Property_owner string
219*333d2b36SAndroid Build Coastguard Worker
220*333d2b36SAndroid Build Coastguard Worker	// list of package names that will be documented and publicized as API
221*333d2b36SAndroid Build Coastguard Worker	Api_packages []string
222*333d2b36SAndroid Build Coastguard Worker
223*333d2b36SAndroid Build Coastguard Worker	// If set to true, allow this module to be dexed and installed on devices.
224*333d2b36SAndroid Build Coastguard Worker	Installable *bool
225*333d2b36SAndroid Build Coastguard Worker
226*333d2b36SAndroid Build Coastguard Worker	// Make this module available when building for ramdisk
227*333d2b36SAndroid Build Coastguard Worker	Ramdisk_available *bool
228*333d2b36SAndroid Build Coastguard Worker
229*333d2b36SAndroid Build Coastguard Worker	// Make this module available when building for recovery
230*333d2b36SAndroid Build Coastguard Worker	Recovery_available *bool
231*333d2b36SAndroid Build Coastguard Worker
232*333d2b36SAndroid Build Coastguard Worker	// Make this module available when building for vendor
233*333d2b36SAndroid Build Coastguard Worker	Vendor_available *bool
234*333d2b36SAndroid Build Coastguard Worker
235*333d2b36SAndroid Build Coastguard Worker	// Make this module available when building for product
236*333d2b36SAndroid Build Coastguard Worker	Product_available *bool
237*333d2b36SAndroid Build Coastguard Worker
238*333d2b36SAndroid Build Coastguard Worker	// list of .sysprop files which defines the properties.
239*333d2b36SAndroid Build Coastguard Worker	Srcs []string `android:"path"`
240*333d2b36SAndroid Build Coastguard Worker
241*333d2b36SAndroid Build Coastguard Worker	// If set to true, build a variant of the module for the host.  Defaults to false.
242*333d2b36SAndroid Build Coastguard Worker	Host_supported *bool
243*333d2b36SAndroid Build Coastguard Worker
244*333d2b36SAndroid Build Coastguard Worker	Cpp struct {
245*333d2b36SAndroid Build Coastguard Worker		// Minimum sdk version that the artifact should support when it runs as part of mainline modules(APEX).
246*333d2b36SAndroid Build Coastguard Worker		// Forwarded to cc_library.min_sdk_version
247*333d2b36SAndroid Build Coastguard Worker		Min_sdk_version *string
248*333d2b36SAndroid Build Coastguard Worker
249*333d2b36SAndroid Build Coastguard Worker		// C compiler flags used to build library
250*333d2b36SAndroid Build Coastguard Worker		Cflags []string
251*333d2b36SAndroid Build Coastguard Worker
252*333d2b36SAndroid Build Coastguard Worker		// Linker flags used to build binary
253*333d2b36SAndroid Build Coastguard Worker		Ldflags []string
254*333d2b36SAndroid Build Coastguard Worker	}
255*333d2b36SAndroid Build Coastguard Worker
256*333d2b36SAndroid Build Coastguard Worker	Java struct {
257*333d2b36SAndroid Build Coastguard Worker		// Minimum sdk version that the artifact should support when it runs as part of mainline modules(APEX).
258*333d2b36SAndroid Build Coastguard Worker		// Forwarded to java_library.min_sdk_version
259*333d2b36SAndroid Build Coastguard Worker		Min_sdk_version *string
260*333d2b36SAndroid Build Coastguard Worker	}
261*333d2b36SAndroid Build Coastguard Worker
262*333d2b36SAndroid Build Coastguard Worker	Rust struct {
263*333d2b36SAndroid Build Coastguard Worker		// Minimum sdk version that the artifact should support when it runs as part of mainline modules(APEX).
264*333d2b36SAndroid Build Coastguard Worker		// Forwarded to rust_library.min_sdk_version
265*333d2b36SAndroid Build Coastguard Worker		Min_sdk_version *string
266*333d2b36SAndroid Build Coastguard Worker	}
267*333d2b36SAndroid Build Coastguard Worker}
268*333d2b36SAndroid Build Coastguard Worker
269*333d2b36SAndroid Build Coastguard Workervar (
270*333d2b36SAndroid Build Coastguard Worker	pctx         = android.NewPackageContext("android/soong/sysprop")
271*333d2b36SAndroid Build Coastguard Worker	syspropCcTag = dependencyTag{name: "syspropCc"}
272*333d2b36SAndroid Build Coastguard Worker
273*333d2b36SAndroid Build Coastguard Worker	syspropLibrariesKey  = android.NewOnceKey("syspropLibraries")
274*333d2b36SAndroid Build Coastguard Worker	syspropLibrariesLock sync.Mutex
275*333d2b36SAndroid Build Coastguard Worker)
276*333d2b36SAndroid Build Coastguard Worker
277*333d2b36SAndroid Build Coastguard Worker// List of sysprop_library used by property_contexts to perform type check.
278*333d2b36SAndroid Build Coastguard Workerfunc syspropLibraries(config android.Config) *[]string {
279*333d2b36SAndroid Build Coastguard Worker	return config.Once(syspropLibrariesKey, func() interface{} {
280*333d2b36SAndroid Build Coastguard Worker		return &[]string{}
281*333d2b36SAndroid Build Coastguard Worker	}).(*[]string)
282*333d2b36SAndroid Build Coastguard Worker}
283*333d2b36SAndroid Build Coastguard Worker
284*333d2b36SAndroid Build Coastguard Workerfunc SyspropLibraries(config android.Config) []string {
285*333d2b36SAndroid Build Coastguard Worker	return append([]string{}, *syspropLibraries(config)...)
286*333d2b36SAndroid Build Coastguard Worker}
287*333d2b36SAndroid Build Coastguard Worker
288*333d2b36SAndroid Build Coastguard Workerfunc init() {
289*333d2b36SAndroid Build Coastguard Worker	registerSyspropBuildComponents(android.InitRegistrationContext)
290*333d2b36SAndroid Build Coastguard Worker}
291*333d2b36SAndroid Build Coastguard Worker
292*333d2b36SAndroid Build Coastguard Workerfunc registerSyspropBuildComponents(ctx android.RegistrationContext) {
293*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterModuleType("sysprop_library", syspropLibraryFactory)
294*333d2b36SAndroid Build Coastguard Worker}
295*333d2b36SAndroid Build Coastguard Worker
296*333d2b36SAndroid Build Coastguard Workerfunc (m *syspropLibrary) Name() string {
297*333d2b36SAndroid Build Coastguard Worker	return m.BaseModuleName() + "_sysprop_library"
298*333d2b36SAndroid Build Coastguard Worker}
299*333d2b36SAndroid Build Coastguard Worker
300*333d2b36SAndroid Build Coastguard Workerfunc (m *syspropLibrary) Owner() string {
301*333d2b36SAndroid Build Coastguard Worker	return m.properties.Property_owner
302*333d2b36SAndroid Build Coastguard Worker}
303*333d2b36SAndroid Build Coastguard Worker
304*333d2b36SAndroid Build Coastguard Workerfunc (m *syspropLibrary) CcImplementationModuleName() string {
305*333d2b36SAndroid Build Coastguard Worker	return "lib" + m.BaseModuleName()
306*333d2b36SAndroid Build Coastguard Worker}
307*333d2b36SAndroid Build Coastguard Worker
308*333d2b36SAndroid Build Coastguard Workerfunc (m *syspropLibrary) javaPublicStubName() string {
309*333d2b36SAndroid Build Coastguard Worker	return m.BaseModuleName() + "_public"
310*333d2b36SAndroid Build Coastguard Worker}
311*333d2b36SAndroid Build Coastguard Worker
312*333d2b36SAndroid Build Coastguard Workerfunc (m *syspropLibrary) javaGenModuleName() string {
313*333d2b36SAndroid Build Coastguard Worker	return m.BaseModuleName() + "_java_gen"
314*333d2b36SAndroid Build Coastguard Worker}
315*333d2b36SAndroid Build Coastguard Worker
316*333d2b36SAndroid Build Coastguard Workerfunc (m *syspropLibrary) javaGenPublicStubName() string {
317*333d2b36SAndroid Build Coastguard Worker	return m.BaseModuleName() + "_java_gen_public"
318*333d2b36SAndroid Build Coastguard Worker}
319*333d2b36SAndroid Build Coastguard Worker
320*333d2b36SAndroid Build Coastguard Workerfunc (m *syspropLibrary) rustGenStubName() string {
321*333d2b36SAndroid Build Coastguard Worker	return "lib" + m.rustCrateName() + "_rust"
322*333d2b36SAndroid Build Coastguard Worker}
323*333d2b36SAndroid Build Coastguard Worker
324*333d2b36SAndroid Build Coastguard Workerfunc (m *syspropLibrary) rustCrateName() string {
325*333d2b36SAndroid Build Coastguard Worker	moduleName := strings.ToLower(m.BaseModuleName())
326*333d2b36SAndroid Build Coastguard Worker	moduleName = strings.ReplaceAll(moduleName, "-", "_")
327*333d2b36SAndroid Build Coastguard Worker	moduleName = strings.ReplaceAll(moduleName, ".", "_")
328*333d2b36SAndroid Build Coastguard Worker	return moduleName
329*333d2b36SAndroid Build Coastguard Worker}
330*333d2b36SAndroid Build Coastguard Worker
331*333d2b36SAndroid Build Coastguard Workerfunc (m *syspropLibrary) BaseModuleName() string {
332*333d2b36SAndroid Build Coastguard Worker	return m.ModuleBase.Name()
333*333d2b36SAndroid Build Coastguard Worker}
334*333d2b36SAndroid Build Coastguard Worker
335*333d2b36SAndroid Build Coastguard Workerfunc (m *syspropLibrary) CurrentSyspropApiFile() android.OptionalPath {
336*333d2b36SAndroid Build Coastguard Worker	return m.currentApiFile
337*333d2b36SAndroid Build Coastguard Worker}
338*333d2b36SAndroid Build Coastguard Worker
339*333d2b36SAndroid Build Coastguard Worker// GenerateAndroidBuildActions of sysprop_library handles API dump and API check.
340*333d2b36SAndroid Build Coastguard Worker// generated java_library will depend on these API files.
341*333d2b36SAndroid Build Coastguard Workerfunc (m *syspropLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) {
342*333d2b36SAndroid Build Coastguard Worker	baseModuleName := m.BaseModuleName()
343*333d2b36SAndroid Build Coastguard Worker	srcs := android.PathsForModuleSrc(ctx, m.properties.Srcs)
344*333d2b36SAndroid Build Coastguard Worker	for _, syspropFile := range srcs {
345*333d2b36SAndroid Build Coastguard Worker		if syspropFile.Ext() != ".sysprop" {
346*333d2b36SAndroid Build Coastguard Worker			ctx.PropertyErrorf("srcs", "srcs contains non-sysprop file %q", syspropFile.String())
347*333d2b36SAndroid Build Coastguard Worker		}
348*333d2b36SAndroid Build Coastguard Worker	}
349*333d2b36SAndroid Build Coastguard Worker	android.SetProvider(ctx, blueprint.SrcsFileProviderKey, blueprint.SrcsFileProviderData{SrcPaths: srcs.Strings()})
350*333d2b36SAndroid Build Coastguard Worker
351*333d2b36SAndroid Build Coastguard Worker	if ctx.Failed() {
352*333d2b36SAndroid Build Coastguard Worker		return
353*333d2b36SAndroid Build Coastguard Worker	}
354*333d2b36SAndroid Build Coastguard Worker
355*333d2b36SAndroid Build Coastguard Worker	apiDirectoryPath := path.Join(ctx.ModuleDir(), "api")
356*333d2b36SAndroid Build Coastguard Worker	currentApiFilePath := path.Join(apiDirectoryPath, baseModuleName+"-current.txt")
357*333d2b36SAndroid Build Coastguard Worker	latestApiFilePath := path.Join(apiDirectoryPath, baseModuleName+"-latest.txt")
358*333d2b36SAndroid Build Coastguard Worker	m.currentApiFile = android.ExistentPathForSource(ctx, currentApiFilePath)
359*333d2b36SAndroid Build Coastguard Worker	m.latestApiFile = android.ExistentPathForSource(ctx, latestApiFilePath)
360*333d2b36SAndroid Build Coastguard Worker
361*333d2b36SAndroid Build Coastguard Worker	// dump API rule
362*333d2b36SAndroid Build Coastguard Worker	rule := android.NewRuleBuilder(pctx, ctx)
363*333d2b36SAndroid Build Coastguard Worker	m.dumpedApiFile = android.PathForModuleOut(ctx, "api-dump.txt")
364*333d2b36SAndroid Build Coastguard Worker	rule.Command().
365*333d2b36SAndroid Build Coastguard Worker		BuiltTool("sysprop_api_dump").
366*333d2b36SAndroid Build Coastguard Worker		Output(m.dumpedApiFile).
367*333d2b36SAndroid Build Coastguard Worker		Inputs(srcs)
368*333d2b36SAndroid Build Coastguard Worker	rule.Build(baseModuleName+"_api_dump", baseModuleName+" api dump")
369*333d2b36SAndroid Build Coastguard Worker
370*333d2b36SAndroid Build Coastguard Worker	// check API rule
371*333d2b36SAndroid Build Coastguard Worker	rule = android.NewRuleBuilder(pctx, ctx)
372*333d2b36SAndroid Build Coastguard Worker
373*333d2b36SAndroid Build Coastguard Worker	// We allow that the API txt files don't exist, when the sysprop_library only contains internal
374*333d2b36SAndroid Build Coastguard Worker	// properties. But we have to feed current api file and latest api file to the rule builder.
375*333d2b36SAndroid Build Coastguard Worker	// Currently we can't get android.Path representing the null device, so we add any existing API
376*333d2b36SAndroid Build Coastguard Worker	// txt files to implicits, and then directly feed string paths, rather than calling Input(Path)
377*333d2b36SAndroid Build Coastguard Worker	// method.
378*333d2b36SAndroid Build Coastguard Worker	var apiFileList android.Paths
379*333d2b36SAndroid Build Coastguard Worker	currentApiArgument := os.DevNull
380*333d2b36SAndroid Build Coastguard Worker	if m.currentApiFile.Valid() {
381*333d2b36SAndroid Build Coastguard Worker		apiFileList = append(apiFileList, m.currentApiFile.Path())
382*333d2b36SAndroid Build Coastguard Worker		currentApiArgument = m.currentApiFile.String()
383*333d2b36SAndroid Build Coastguard Worker	}
384*333d2b36SAndroid Build Coastguard Worker
385*333d2b36SAndroid Build Coastguard Worker	latestApiArgument := os.DevNull
386*333d2b36SAndroid Build Coastguard Worker	if m.latestApiFile.Valid() {
387*333d2b36SAndroid Build Coastguard Worker		apiFileList = append(apiFileList, m.latestApiFile.Path())
388*333d2b36SAndroid Build Coastguard Worker		latestApiArgument = m.latestApiFile.String()
389*333d2b36SAndroid Build Coastguard Worker	}
390*333d2b36SAndroid Build Coastguard Worker
391*333d2b36SAndroid Build Coastguard Worker	// 1. compares current.txt to api-dump.txt
392*333d2b36SAndroid Build Coastguard Worker	// current.txt should be identical to api-dump.txt.
393*333d2b36SAndroid Build Coastguard Worker	msg := fmt.Sprintf(`\n******************************\n`+
394*333d2b36SAndroid Build Coastguard Worker		`API of sysprop_library %s doesn't match with current.txt\n`+
395*333d2b36SAndroid Build Coastguard Worker		`Please update current.txt by:\n`+
396*333d2b36SAndroid Build Coastguard Worker		`m %s-dump-api && mkdir -p %q && rm -rf %q && cp -f %q %q\n`+
397*333d2b36SAndroid Build Coastguard Worker		`******************************\n`, baseModuleName, baseModuleName,
398*333d2b36SAndroid Build Coastguard Worker		apiDirectoryPath, currentApiFilePath, m.dumpedApiFile.String(), currentApiFilePath)
399*333d2b36SAndroid Build Coastguard Worker
400*333d2b36SAndroid Build Coastguard Worker	rule.Command().
401*333d2b36SAndroid Build Coastguard Worker		Text("( cmp").Flag("-s").
402*333d2b36SAndroid Build Coastguard Worker		Input(m.dumpedApiFile).
403*333d2b36SAndroid Build Coastguard Worker		Text(currentApiArgument).
404*333d2b36SAndroid Build Coastguard Worker		Text("|| ( echo").Flag("-e").
405*333d2b36SAndroid Build Coastguard Worker		Flag(`"` + msg + `"`).
406*333d2b36SAndroid Build Coastguard Worker		Text("; exit 38) )")
407*333d2b36SAndroid Build Coastguard Worker
408*333d2b36SAndroid Build Coastguard Worker	// 2. compares current.txt to latest.txt (frozen API)
409*333d2b36SAndroid Build Coastguard Worker	// current.txt should be compatible with latest.txt
410*333d2b36SAndroid Build Coastguard Worker	msg = fmt.Sprintf(`\n******************************\n`+
411*333d2b36SAndroid Build Coastguard Worker		`API of sysprop_library %s doesn't match with latest version\n`+
412*333d2b36SAndroid Build Coastguard Worker		`Please fix the breakage and rebuild.\n`+
413*333d2b36SAndroid Build Coastguard Worker		`******************************\n`, baseModuleName)
414*333d2b36SAndroid Build Coastguard Worker
415*333d2b36SAndroid Build Coastguard Worker	rule.Command().
416*333d2b36SAndroid Build Coastguard Worker		Text("( ").
417*333d2b36SAndroid Build Coastguard Worker		BuiltTool("sysprop_api_checker").
418*333d2b36SAndroid Build Coastguard Worker		Text(latestApiArgument).
419*333d2b36SAndroid Build Coastguard Worker		Text(currentApiArgument).
420*333d2b36SAndroid Build Coastguard Worker		Text(" || ( echo").Flag("-e").
421*333d2b36SAndroid Build Coastguard Worker		Flag(`"` + msg + `"`).
422*333d2b36SAndroid Build Coastguard Worker		Text("; exit 38) )").
423*333d2b36SAndroid Build Coastguard Worker		Implicits(apiFileList)
424*333d2b36SAndroid Build Coastguard Worker
425*333d2b36SAndroid Build Coastguard Worker	m.checkApiFileTimeStamp = android.PathForModuleOut(ctx, "check_api.timestamp")
426*333d2b36SAndroid Build Coastguard Worker
427*333d2b36SAndroid Build Coastguard Worker	rule.Command().
428*333d2b36SAndroid Build Coastguard Worker		Text("touch").
429*333d2b36SAndroid Build Coastguard Worker		Output(m.checkApiFileTimeStamp)
430*333d2b36SAndroid Build Coastguard Worker
431*333d2b36SAndroid Build Coastguard Worker	rule.Build(baseModuleName+"_check_api", baseModuleName+" check api")
432*333d2b36SAndroid Build Coastguard Worker}
433*333d2b36SAndroid Build Coastguard Worker
434*333d2b36SAndroid Build Coastguard Workerfunc (m *syspropLibrary) AndroidMk() android.AndroidMkData {
435*333d2b36SAndroid Build Coastguard Worker	return android.AndroidMkData{
436*333d2b36SAndroid Build Coastguard Worker		Custom: func(w io.Writer, name, prefix, moduleDir string, data android.AndroidMkData) {
437*333d2b36SAndroid Build Coastguard Worker			// sysprop_library module itself is defined as a FAKE module to perform API check.
438*333d2b36SAndroid Build Coastguard Worker			// Actual implementation libraries are created on LoadHookMutator
439*333d2b36SAndroid Build Coastguard Worker			fmt.Fprintln(w, "\ninclude $(CLEAR_VARS)", " # sysprop.syspropLibrary")
440*333d2b36SAndroid Build Coastguard Worker			fmt.Fprintln(w, "LOCAL_MODULE :=", m.Name())
441*333d2b36SAndroid Build Coastguard Worker			fmt.Fprintf(w, "LOCAL_MODULE_CLASS := FAKE\n")
442*333d2b36SAndroid Build Coastguard Worker			fmt.Fprintf(w, "LOCAL_MODULE_TAGS := optional\n")
443*333d2b36SAndroid Build Coastguard Worker			// AconfigUpdateAndroidMkData may have added elements to Extra.  Process them here.
444*333d2b36SAndroid Build Coastguard Worker			for _, extra := range data.Extra {
445*333d2b36SAndroid Build Coastguard Worker				extra(w, nil)
446*333d2b36SAndroid Build Coastguard Worker			}
447*333d2b36SAndroid Build Coastguard Worker			fmt.Fprintf(w, "include $(BUILD_SYSTEM)/base_rules.mk\n\n")
448*333d2b36SAndroid Build Coastguard Worker			fmt.Fprintf(w, "$(LOCAL_BUILT_MODULE): %s\n", m.checkApiFileTimeStamp.String())
449*333d2b36SAndroid Build Coastguard Worker			fmt.Fprintf(w, "\ttouch $@\n\n")
450*333d2b36SAndroid Build Coastguard Worker			fmt.Fprintf(w, ".PHONY: %s-check-api %s-dump-api\n\n", name, name)
451*333d2b36SAndroid Build Coastguard Worker
452*333d2b36SAndroid Build Coastguard Worker			// dump API rule
453*333d2b36SAndroid Build Coastguard Worker			fmt.Fprintf(w, "%s-dump-api: %s\n\n", name, m.dumpedApiFile.String())
454*333d2b36SAndroid Build Coastguard Worker
455*333d2b36SAndroid Build Coastguard Worker			// check API rule
456*333d2b36SAndroid Build Coastguard Worker			fmt.Fprintf(w, "%s-check-api: %s\n\n", name, m.checkApiFileTimeStamp.String())
457*333d2b36SAndroid Build Coastguard Worker		}}
458*333d2b36SAndroid Build Coastguard Worker}
459*333d2b36SAndroid Build Coastguard Worker
460*333d2b36SAndroid Build Coastguard Workervar _ android.ApexModule = (*syspropLibrary)(nil)
461*333d2b36SAndroid Build Coastguard Worker
462*333d2b36SAndroid Build Coastguard Worker// Implements android.ApexModule
463*333d2b36SAndroid Build Coastguard Workerfunc (m *syspropLibrary) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
464*333d2b36SAndroid Build Coastguard Worker	sdkVersion android.ApiLevel) error {
465*333d2b36SAndroid Build Coastguard Worker	return fmt.Errorf("sysprop_library is not supposed to be part of apex modules")
466*333d2b36SAndroid Build Coastguard Worker}
467*333d2b36SAndroid Build Coastguard Worker
468*333d2b36SAndroid Build Coastguard Worker// sysprop_library creates schematized APIs from sysprop description files (.sysprop).
469*333d2b36SAndroid Build Coastguard Worker// Both Java and C++ modules can link against sysprop_library, and API stability check
470*333d2b36SAndroid Build Coastguard Worker// against latest APIs (see build/soong/scripts/freeze-sysprop-api-files.sh)
471*333d2b36SAndroid Build Coastguard Worker// is performed. Note that the generated C++ module has its name prefixed with
472*333d2b36SAndroid Build Coastguard Worker// `lib`, and it is this module that should be depended on from other C++
473*333d2b36SAndroid Build Coastguard Worker// modules; i.e., if the sysprop_library module is named `foo`, C++ modules
474*333d2b36SAndroid Build Coastguard Worker// should depend on `libfoo`.
475*333d2b36SAndroid Build Coastguard Workerfunc syspropLibraryFactory() android.Module {
476*333d2b36SAndroid Build Coastguard Worker	m := &syspropLibrary{}
477*333d2b36SAndroid Build Coastguard Worker
478*333d2b36SAndroid Build Coastguard Worker	m.AddProperties(
479*333d2b36SAndroid Build Coastguard Worker		&m.properties,
480*333d2b36SAndroid Build Coastguard Worker	)
481*333d2b36SAndroid Build Coastguard Worker	android.InitAndroidModule(m)
482*333d2b36SAndroid Build Coastguard Worker	android.InitApexModule(m)
483*333d2b36SAndroid Build Coastguard Worker	android.AddLoadHook(m, func(ctx android.LoadHookContext) { syspropLibraryHook(ctx, m) })
484*333d2b36SAndroid Build Coastguard Worker	return m
485*333d2b36SAndroid Build Coastguard Worker}
486*333d2b36SAndroid Build Coastguard Worker
487*333d2b36SAndroid Build Coastguard Workertype ccLibraryProperties struct {
488*333d2b36SAndroid Build Coastguard Worker	Name             *string
489*333d2b36SAndroid Build Coastguard Worker	Srcs             []string
490*333d2b36SAndroid Build Coastguard Worker	Soc_specific     *bool
491*333d2b36SAndroid Build Coastguard Worker	Device_specific  *bool
492*333d2b36SAndroid Build Coastguard Worker	Product_specific *bool
493*333d2b36SAndroid Build Coastguard Worker	Sysprop          struct {
494*333d2b36SAndroid Build Coastguard Worker		Platform *bool
495*333d2b36SAndroid Build Coastguard Worker	}
496*333d2b36SAndroid Build Coastguard Worker	Target struct {
497*333d2b36SAndroid Build Coastguard Worker		Android struct {
498*333d2b36SAndroid Build Coastguard Worker			Header_libs []string
499*333d2b36SAndroid Build Coastguard Worker			Shared_libs []string
500*333d2b36SAndroid Build Coastguard Worker		}
501*333d2b36SAndroid Build Coastguard Worker		Host struct {
502*333d2b36SAndroid Build Coastguard Worker			Static_libs []string
503*333d2b36SAndroid Build Coastguard Worker		}
504*333d2b36SAndroid Build Coastguard Worker	}
505*333d2b36SAndroid Build Coastguard Worker	Required           []string
506*333d2b36SAndroid Build Coastguard Worker	Recovery           *bool
507*333d2b36SAndroid Build Coastguard Worker	Recovery_available *bool
508*333d2b36SAndroid Build Coastguard Worker	Vendor_available   *bool
509*333d2b36SAndroid Build Coastguard Worker	Product_available  *bool
510*333d2b36SAndroid Build Coastguard Worker	Ramdisk_available  *bool
511*333d2b36SAndroid Build Coastguard Worker	Host_supported     *bool
512*333d2b36SAndroid Build Coastguard Worker	Apex_available     []string
513*333d2b36SAndroid Build Coastguard Worker	Min_sdk_version    *string
514*333d2b36SAndroid Build Coastguard Worker	Cflags             []string
515*333d2b36SAndroid Build Coastguard Worker	Ldflags            []string
516*333d2b36SAndroid Build Coastguard Worker}
517*333d2b36SAndroid Build Coastguard Worker
518*333d2b36SAndroid Build Coastguard Workertype javaLibraryProperties struct {
519*333d2b36SAndroid Build Coastguard Worker	Name              *string
520*333d2b36SAndroid Build Coastguard Worker	Srcs              []string
521*333d2b36SAndroid Build Coastguard Worker	Soc_specific      *bool
522*333d2b36SAndroid Build Coastguard Worker	Device_specific   *bool
523*333d2b36SAndroid Build Coastguard Worker	Product_specific  *bool
524*333d2b36SAndroid Build Coastguard Worker	Required          []string
525*333d2b36SAndroid Build Coastguard Worker	Sdk_version       *string
526*333d2b36SAndroid Build Coastguard Worker	Installable       *bool
527*333d2b36SAndroid Build Coastguard Worker	Libs              []string
528*333d2b36SAndroid Build Coastguard Worker	Stem              *string
529*333d2b36SAndroid Build Coastguard Worker	SyspropPublicStub string
530*333d2b36SAndroid Build Coastguard Worker	Apex_available    []string
531*333d2b36SAndroid Build Coastguard Worker	Min_sdk_version   *string
532*333d2b36SAndroid Build Coastguard Worker}
533*333d2b36SAndroid Build Coastguard Worker
534*333d2b36SAndroid Build Coastguard Workertype rustLibraryProperties struct {
535*333d2b36SAndroid Build Coastguard Worker	Name              *string
536*333d2b36SAndroid Build Coastguard Worker	Sysprop_srcs      []string `android:"path"`
537*333d2b36SAndroid Build Coastguard Worker	Scope             string
538*333d2b36SAndroid Build Coastguard Worker	Check_api         *string
539*333d2b36SAndroid Build Coastguard Worker	Srcs              []string
540*333d2b36SAndroid Build Coastguard Worker	Installable       *bool
541*333d2b36SAndroid Build Coastguard Worker	Crate_name        string
542*333d2b36SAndroid Build Coastguard Worker	Rustlibs          []string
543*333d2b36SAndroid Build Coastguard Worker	Vendor_available  *bool
544*333d2b36SAndroid Build Coastguard Worker	Product_available *bool
545*333d2b36SAndroid Build Coastguard Worker	Apex_available    []string
546*333d2b36SAndroid Build Coastguard Worker	Min_sdk_version   *string
547*333d2b36SAndroid Build Coastguard Worker}
548*333d2b36SAndroid Build Coastguard Worker
549*333d2b36SAndroid Build Coastguard Workerfunc syspropLibraryHook(ctx android.LoadHookContext, m *syspropLibrary) {
550*333d2b36SAndroid Build Coastguard Worker	if len(m.properties.Srcs) == 0 {
551*333d2b36SAndroid Build Coastguard Worker		ctx.PropertyErrorf("srcs", "sysprop_library must specify srcs")
552*333d2b36SAndroid Build Coastguard Worker	}
553*333d2b36SAndroid Build Coastguard Worker
554*333d2b36SAndroid Build Coastguard Worker	// ctx's Platform or Specific functions represent where this sysprop_library installed.
555*333d2b36SAndroid Build Coastguard Worker	installedInSystem := ctx.Platform() || ctx.SystemExtSpecific()
556*333d2b36SAndroid Build Coastguard Worker	installedInVendorOrOdm := ctx.SocSpecific() || ctx.DeviceSpecific()
557*333d2b36SAndroid Build Coastguard Worker	installedInProduct := ctx.ProductSpecific()
558*333d2b36SAndroid Build Coastguard Worker	isOwnerPlatform := false
559*333d2b36SAndroid Build Coastguard Worker	var javaSyspropStub string
560*333d2b36SAndroid Build Coastguard Worker
561*333d2b36SAndroid Build Coastguard Worker	// javaSyspropStub contains stub libraries used by generated APIs, instead of framework stub.
562*333d2b36SAndroid Build Coastguard Worker	// This is to make sysprop_library link against core_current.
563*333d2b36SAndroid Build Coastguard Worker	if installedInVendorOrOdm {
564*333d2b36SAndroid Build Coastguard Worker		javaSyspropStub = "sysprop-library-stub-vendor"
565*333d2b36SAndroid Build Coastguard Worker	} else if installedInProduct {
566*333d2b36SAndroid Build Coastguard Worker		javaSyspropStub = "sysprop-library-stub-product"
567*333d2b36SAndroid Build Coastguard Worker	} else {
568*333d2b36SAndroid Build Coastguard Worker		javaSyspropStub = "sysprop-library-stub-platform"
569*333d2b36SAndroid Build Coastguard Worker	}
570*333d2b36SAndroid Build Coastguard Worker
571*333d2b36SAndroid Build Coastguard Worker	switch m.Owner() {
572*333d2b36SAndroid Build Coastguard Worker	case "Platform":
573*333d2b36SAndroid Build Coastguard Worker		// Every partition can access platform-defined properties
574*333d2b36SAndroid Build Coastguard Worker		isOwnerPlatform = true
575*333d2b36SAndroid Build Coastguard Worker	case "Vendor":
576*333d2b36SAndroid Build Coastguard Worker		// System can't access vendor's properties
577*333d2b36SAndroid Build Coastguard Worker		if installedInSystem {
578*333d2b36SAndroid Build Coastguard Worker			ctx.ModuleErrorf("None of soc_specific, device_specific, product_specific is true. " +
579*333d2b36SAndroid Build Coastguard Worker				"System can't access sysprop_library owned by Vendor")
580*333d2b36SAndroid Build Coastguard Worker		}
581*333d2b36SAndroid Build Coastguard Worker	case "Odm":
582*333d2b36SAndroid Build Coastguard Worker		// Only vendor can access Odm-defined properties
583*333d2b36SAndroid Build Coastguard Worker		if !installedInVendorOrOdm {
584*333d2b36SAndroid Build Coastguard Worker			ctx.ModuleErrorf("Neither soc_speicifc nor device_specific is true. " +
585*333d2b36SAndroid Build Coastguard Worker				"Odm-defined properties should be accessed only in Vendor or Odm")
586*333d2b36SAndroid Build Coastguard Worker		}
587*333d2b36SAndroid Build Coastguard Worker	default:
588*333d2b36SAndroid Build Coastguard Worker		ctx.PropertyErrorf("property_owner",
589*333d2b36SAndroid Build Coastguard Worker			"Unknown value %s: must be one of Platform, Vendor or Odm", m.Owner())
590*333d2b36SAndroid Build Coastguard Worker	}
591*333d2b36SAndroid Build Coastguard Worker
592*333d2b36SAndroid Build Coastguard Worker	// Generate a C++ implementation library.
593*333d2b36SAndroid Build Coastguard Worker	// cc_library can receive *.sysprop files as their srcs, generating sources itself.
594*333d2b36SAndroid Build Coastguard Worker	ccProps := ccLibraryProperties{}
595*333d2b36SAndroid Build Coastguard Worker	ccProps.Name = proptools.StringPtr(m.CcImplementationModuleName())
596*333d2b36SAndroid Build Coastguard Worker	ccProps.Srcs = m.properties.Srcs
597*333d2b36SAndroid Build Coastguard Worker	ccProps.Soc_specific = proptools.BoolPtr(ctx.SocSpecific())
598*333d2b36SAndroid Build Coastguard Worker	ccProps.Device_specific = proptools.BoolPtr(ctx.DeviceSpecific())
599*333d2b36SAndroid Build Coastguard Worker	ccProps.Product_specific = proptools.BoolPtr(ctx.ProductSpecific())
600*333d2b36SAndroid Build Coastguard Worker	ccProps.Sysprop.Platform = proptools.BoolPtr(isOwnerPlatform)
601*333d2b36SAndroid Build Coastguard Worker	ccProps.Target.Android.Header_libs = []string{"libbase_headers"}
602*333d2b36SAndroid Build Coastguard Worker	ccProps.Target.Android.Shared_libs = []string{"liblog"}
603*333d2b36SAndroid Build Coastguard Worker	ccProps.Target.Host.Static_libs = []string{"libbase", "liblog"}
604*333d2b36SAndroid Build Coastguard Worker	ccProps.Recovery_available = m.properties.Recovery_available
605*333d2b36SAndroid Build Coastguard Worker	ccProps.Vendor_available = m.properties.Vendor_available
606*333d2b36SAndroid Build Coastguard Worker	ccProps.Product_available = m.properties.Product_available
607*333d2b36SAndroid Build Coastguard Worker	ccProps.Ramdisk_available = m.properties.Ramdisk_available
608*333d2b36SAndroid Build Coastguard Worker	ccProps.Host_supported = m.properties.Host_supported
609*333d2b36SAndroid Build Coastguard Worker	ccProps.Apex_available = m.ApexProperties.Apex_available
610*333d2b36SAndroid Build Coastguard Worker	ccProps.Min_sdk_version = m.properties.Cpp.Min_sdk_version
611*333d2b36SAndroid Build Coastguard Worker	ccProps.Cflags = m.properties.Cpp.Cflags
612*333d2b36SAndroid Build Coastguard Worker	ccProps.Ldflags = m.properties.Cpp.Ldflags
613*333d2b36SAndroid Build Coastguard Worker	ctx.CreateModule(cc.LibraryFactory, &ccProps)
614*333d2b36SAndroid Build Coastguard Worker
615*333d2b36SAndroid Build Coastguard Worker	scope := "internal"
616*333d2b36SAndroid Build Coastguard Worker
617*333d2b36SAndroid Build Coastguard Worker	// We need to only use public version, if the partition where sysprop_library will be installed
618*333d2b36SAndroid Build Coastguard Worker	// is different from owner.
619*333d2b36SAndroid Build Coastguard Worker	if ctx.ProductSpecific() {
620*333d2b36SAndroid Build Coastguard Worker		// Currently product partition can't own any sysprop_library. So product always uses public.
621*333d2b36SAndroid Build Coastguard Worker		scope = "public"
622*333d2b36SAndroid Build Coastguard Worker	} else if isOwnerPlatform && installedInVendorOrOdm {
623*333d2b36SAndroid Build Coastguard Worker		// Vendor or Odm should use public version of Platform's sysprop_library.
624*333d2b36SAndroid Build Coastguard Worker		scope = "public"
625*333d2b36SAndroid Build Coastguard Worker	}
626*333d2b36SAndroid Build Coastguard Worker
627*333d2b36SAndroid Build Coastguard Worker	// Generate a Java implementation library.
628*333d2b36SAndroid Build Coastguard Worker	// Contrast to C++, syspropJavaGenRule module will generate srcjar and the srcjar will be fed
629*333d2b36SAndroid Build Coastguard Worker	// to Java implementation library.
630*333d2b36SAndroid Build Coastguard Worker	ctx.CreateModule(syspropJavaGenFactory, &syspropGenProperties{
631*333d2b36SAndroid Build Coastguard Worker		Srcs:      m.properties.Srcs,
632*333d2b36SAndroid Build Coastguard Worker		Scope:     scope,
633*333d2b36SAndroid Build Coastguard Worker		Name:      proptools.StringPtr(m.javaGenModuleName()),
634*333d2b36SAndroid Build Coastguard Worker		Check_api: proptools.StringPtr(ctx.ModuleName()),
635*333d2b36SAndroid Build Coastguard Worker	})
636*333d2b36SAndroid Build Coastguard Worker
637*333d2b36SAndroid Build Coastguard Worker	// if platform sysprop_library is installed in /system or /system-ext, we regard it as an API
638*333d2b36SAndroid Build Coastguard Worker	// and allow any modules (even from different partition) to link against the sysprop_library.
639*333d2b36SAndroid Build Coastguard Worker	// To do that, we create a public stub and expose it to modules with sdk_version: system_*.
640*333d2b36SAndroid Build Coastguard Worker	var publicStub string
641*333d2b36SAndroid Build Coastguard Worker	if isOwnerPlatform && installedInSystem {
642*333d2b36SAndroid Build Coastguard Worker		publicStub = m.javaPublicStubName()
643*333d2b36SAndroid Build Coastguard Worker	}
644*333d2b36SAndroid Build Coastguard Worker
645*333d2b36SAndroid Build Coastguard Worker	ctx.CreateModule(java.LibraryFactory, &javaLibraryProperties{
646*333d2b36SAndroid Build Coastguard Worker		Name:              proptools.StringPtr(m.BaseModuleName()),
647*333d2b36SAndroid Build Coastguard Worker		Srcs:              []string{":" + m.javaGenModuleName()},
648*333d2b36SAndroid Build Coastguard Worker		Soc_specific:      proptools.BoolPtr(ctx.SocSpecific()),
649*333d2b36SAndroid Build Coastguard Worker		Device_specific:   proptools.BoolPtr(ctx.DeviceSpecific()),
650*333d2b36SAndroid Build Coastguard Worker		Product_specific:  proptools.BoolPtr(ctx.ProductSpecific()),
651*333d2b36SAndroid Build Coastguard Worker		Installable:       m.properties.Installable,
652*333d2b36SAndroid Build Coastguard Worker		Sdk_version:       proptools.StringPtr("core_current"),
653*333d2b36SAndroid Build Coastguard Worker		Libs:              []string{javaSyspropStub},
654*333d2b36SAndroid Build Coastguard Worker		SyspropPublicStub: publicStub,
655*333d2b36SAndroid Build Coastguard Worker		Apex_available:    m.ApexProperties.Apex_available,
656*333d2b36SAndroid Build Coastguard Worker		Min_sdk_version:   m.properties.Java.Min_sdk_version,
657*333d2b36SAndroid Build Coastguard Worker	})
658*333d2b36SAndroid Build Coastguard Worker
659*333d2b36SAndroid Build Coastguard Worker	if publicStub != "" {
660*333d2b36SAndroid Build Coastguard Worker		ctx.CreateModule(syspropJavaGenFactory, &syspropGenProperties{
661*333d2b36SAndroid Build Coastguard Worker			Srcs:      m.properties.Srcs,
662*333d2b36SAndroid Build Coastguard Worker			Scope:     "public",
663*333d2b36SAndroid Build Coastguard Worker			Name:      proptools.StringPtr(m.javaGenPublicStubName()),
664*333d2b36SAndroid Build Coastguard Worker			Check_api: proptools.StringPtr(ctx.ModuleName()),
665*333d2b36SAndroid Build Coastguard Worker		})
666*333d2b36SAndroid Build Coastguard Worker
667*333d2b36SAndroid Build Coastguard Worker		ctx.CreateModule(java.LibraryFactory, &javaLibraryProperties{
668*333d2b36SAndroid Build Coastguard Worker			Name:        proptools.StringPtr(publicStub),
669*333d2b36SAndroid Build Coastguard Worker			Srcs:        []string{":" + m.javaGenPublicStubName()},
670*333d2b36SAndroid Build Coastguard Worker			Installable: proptools.BoolPtr(false),
671*333d2b36SAndroid Build Coastguard Worker			Sdk_version: proptools.StringPtr("core_current"),
672*333d2b36SAndroid Build Coastguard Worker			Libs:        []string{javaSyspropStub},
673*333d2b36SAndroid Build Coastguard Worker			Stem:        proptools.StringPtr(m.BaseModuleName()),
674*333d2b36SAndroid Build Coastguard Worker		})
675*333d2b36SAndroid Build Coastguard Worker	}
676*333d2b36SAndroid Build Coastguard Worker
677*333d2b36SAndroid Build Coastguard Worker	// Generate a Rust implementation library.
678*333d2b36SAndroid Build Coastguard Worker	rustProps := rustLibraryProperties{
679*333d2b36SAndroid Build Coastguard Worker		Name:         proptools.StringPtr(m.rustGenStubName()),
680*333d2b36SAndroid Build Coastguard Worker		Sysprop_srcs: m.properties.Srcs,
681*333d2b36SAndroid Build Coastguard Worker		Scope:        scope,
682*333d2b36SAndroid Build Coastguard Worker		Check_api:    proptools.StringPtr(ctx.ModuleName()),
683*333d2b36SAndroid Build Coastguard Worker		Installable:  proptools.BoolPtr(false),
684*333d2b36SAndroid Build Coastguard Worker		Crate_name:   m.rustCrateName(),
685*333d2b36SAndroid Build Coastguard Worker		Rustlibs: []string{
686*333d2b36SAndroid Build Coastguard Worker			"liblog_rust",
687*333d2b36SAndroid Build Coastguard Worker			"librustutils",
688*333d2b36SAndroid Build Coastguard Worker		},
689*333d2b36SAndroid Build Coastguard Worker		Vendor_available:  m.properties.Vendor_available,
690*333d2b36SAndroid Build Coastguard Worker		Product_available: m.properties.Product_available,
691*333d2b36SAndroid Build Coastguard Worker		Apex_available:    m.ApexProperties.Apex_available,
692*333d2b36SAndroid Build Coastguard Worker		Min_sdk_version:   proptools.StringPtr("29"),
693*333d2b36SAndroid Build Coastguard Worker	}
694*333d2b36SAndroid Build Coastguard Worker	ctx.CreateModule(syspropRustGenFactory, &rustProps)
695*333d2b36SAndroid Build Coastguard Worker
696*333d2b36SAndroid Build Coastguard Worker	// syspropLibraries will be used by property_contexts to check types.
697*333d2b36SAndroid Build Coastguard Worker	// Record absolute paths of sysprop_library to prevent soong_namespace problem.
698*333d2b36SAndroid Build Coastguard Worker	if m.ExportedToMake() {
699*333d2b36SAndroid Build Coastguard Worker		syspropLibrariesLock.Lock()
700*333d2b36SAndroid Build Coastguard Worker		defer syspropLibrariesLock.Unlock()
701*333d2b36SAndroid Build Coastguard Worker
702*333d2b36SAndroid Build Coastguard Worker		libraries := syspropLibraries(ctx.Config())
703*333d2b36SAndroid Build Coastguard Worker		*libraries = append(*libraries, "//"+ctx.ModuleDir()+":"+ctx.ModuleName())
704*333d2b36SAndroid Build Coastguard Worker	}
705*333d2b36SAndroid Build Coastguard Worker}
706