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