diff options
| -rw-r--r-- | Android.bp | 25 | ||||
| -rw-r--r-- | android/Android.bp | 1 | ||||
| -rw-r--r-- | android/build_prop.go | 49 | ||||
| -rw-r--r-- | android/buildinfo_prop.go | 132 | ||||
| -rw-r--r-- | android/config.go | 8 | ||||
| -rw-r--r-- | android/configurable_properties.go | 6 | ||||
| -rw-r--r-- | android/paths.go | 52 | ||||
| -rw-r--r-- | android/prebuilt.go | 10 | ||||
| -rw-r--r-- | android/testing.go | 16 | ||||
| -rw-r--r-- | android/variable.go | 4 | ||||
| -rw-r--r-- | cc/Android.bp | 1 | ||||
| -rw-r--r-- | cc/androidmk.go | 4 | ||||
| -rw-r--r-- | cc/builder.go | 32 | ||||
| -rw-r--r-- | cc/cc.go | 24 | ||||
| -rw-r--r-- | cc/cc_test.go | 2 | ||||
| -rw-r--r-- | cc/config/darwin_host.go | 53 | ||||
| -rw-r--r-- | cc/ndk_prebuilt.go | 133 | ||||
| -rw-r--r-- | cc/stl.go | 2 | ||||
| -rw-r--r-- | cc/testing.go | 62 | ||||
| -rw-r--r-- | filesystem/filesystem_test.go | 5 | ||||
| -rw-r--r-- | java/app_set_test.go | 2 | ||||
| -rw-r--r-- | java/bootclasspath.go | 8 | ||||
| -rw-r--r-- | java/bootclasspath_fragment.go | 6 | ||||
| -rw-r--r-- | java/sdk_test.go | 3 | ||||
| -rw-r--r-- | rust/config/darwin_host.go | 15 | ||||
| -rw-r--r-- | scripts/Android.bp | 6 | ||||
| -rwxr-xr-x | scripts/buildinfo.py | 191 | ||||
| -rw-r--r-- | scripts/gen_build_prop.py | 17 |
28 files changed, 506 insertions, 363 deletions
diff --git a/Android.bp b/Android.bp index c37d777db..0d1ff02c7 100644 --- a/Android.bp +++ b/Android.bp @@ -121,6 +121,20 @@ dexpreopt_systemserver_check { name: "dexpreopt_systemserver_check", } +// buildinfo.prop contains common properties for system/build.prop, like ro.build.version.* +// TODO(b/322090587): merge this to gen_build_prop.py script. +buildinfo_prop { + name: "buildinfo.prop", + + // not installable because this will be included to system/build.prop + installable: false, + + product_config: ":product_config", + + // Currently, only microdroid can refer to buildinfo.prop + visibility: ["//packages/modules/Virtualization/build/microdroid"], +} + // container for apex_contributions selected using build flags all_apex_contributions { name: "all_apex_contributions", @@ -130,14 +144,3 @@ product_config { name: "product_config", visibility: ["//device/google/cuttlefish/system_image"], } - -build_prop { - name: "system-build.prop", - stem: "build.prop", - product_config: ":product_config", - // Currently, only microdroid and cf system image can refer to system-build.prop - visibility: [ - "//device/google/cuttlefish/system_image", - "//packages/modules/Virtualization/build/microdroid", - ], -} diff --git a/android/Android.bp b/android/Android.bp index 841a6af6e..ce27241ad 100644 --- a/android/Android.bp +++ b/android/Android.bp @@ -39,6 +39,7 @@ bootstrap_go_package { "arch_module_context.go", "base_module_context.go", "build_prop.go", + "buildinfo_prop.go", "compliance_metadata.go", "config.go", "container.go", diff --git a/android/build_prop.go b/android/build_prop.go index 14e5e2310..45c17c35b 100644 --- a/android/build_prop.go +++ b/android/build_prop.go @@ -31,6 +31,10 @@ type buildPropProperties struct { // properties in prop_files. Block_list []string + // Path to the input prop files. The contents of the files are directly + // emitted to the output + Prop_files []string `android:"path"` + // Files to be appended at the end of build.prop. These files are appended after // post_process_props without any further checking. Footer_files []string `android:"path"` @@ -52,34 +56,10 @@ func (p *buildPropModule) stem() string { return proptools.StringDefault(p.properties.Stem, "build.prop") } -func (p *buildPropModule) propFiles(ctx ModuleContext) Paths { - partition := p.PartitionTag(ctx.DeviceConfig()) - if partition == "system" { - return ctx.Config().SystemPropFiles(ctx) - } - return nil -} - -func shouldAddBuildThumbprint(config Config) bool { - knownOemProperties := []string{ - "ro.product.brand", - "ro.product.name", - "ro.product.device", - } - - for _, knownProp := range knownOemProperties { - if InList(knownProp, config.OemProperties()) { - return true - } - } - return false -} - func (p *buildPropModule) GenerateAndroidBuildActions(ctx ModuleContext) { p.outputFilePath = PathForModuleOut(ctx, "build.prop").OutputPath if !ctx.Config().KatiEnabled() { WriteFileRule(ctx, p.outputFilePath, "# no build.prop if kati is disabled") - ctx.SetOutputFiles(Paths{p.outputFilePath}, "") return } @@ -113,7 +93,6 @@ func (p *buildPropModule) GenerateAndroidBuildActions(ctx ModuleContext) { cmd.FlagWithInput("--platform-preview-sdk-fingerprint-file=", ApiFingerprintPath(ctx)) cmd.FlagWithInput("--product-config=", PathForModuleSrc(ctx, proptools.String(p.properties.Product_config))) cmd.FlagWithArg("--partition=", partition) - cmd.FlagForEachInput("--prop-files=", ctx.Config().SystemPropFiles(ctx)) cmd.FlagWithOutput("--out=", p.outputFilePath) postProcessCmd := rule.Command().BuiltTool("post_process_props") @@ -121,12 +100,7 @@ func (p *buildPropModule) GenerateAndroidBuildActions(ctx ModuleContext) { postProcessCmd.Flag("--allow-dup") } postProcessCmd.FlagWithArg("--sdk-version ", config.PlatformSdkVersion().String()) - if ctx.Config().EnableUffdGc() == "default" { - postProcessCmd.FlagWithInput("--kernel-version-file-for-uffd-gc ", PathForOutput(ctx, "dexpreopt/kernel_version_for_uffd_gc.txt")) - } else { - // still need to pass an empty string to kernel-version-file-for-uffd-gc - postProcessCmd.FlagWithArg("--kernel-version-file-for-uffd-gc ", `""`) - } + postProcessCmd.FlagWithInput("--kernel-version-file-for-uffd-gc ", PathForOutput(ctx, "dexpreopt/kernel_version_for_uffd_gc.txt")) postProcessCmd.Text(p.outputFilePath.String()) postProcessCmd.Flags(p.properties.Block_list) @@ -140,19 +114,6 @@ func (p *buildPropModule) GenerateAndroidBuildActions(ctx ModuleContext) { ctx.SetOutputFiles(Paths{p.outputFilePath}, "") } -func (p *buildPropModule) AndroidMkEntries() []AndroidMkEntries { - return []AndroidMkEntries{{ - Class: "ETC", - OutputFile: OptionalPathForPath(p.outputFilePath), - ExtraEntries: []AndroidMkExtraEntriesFunc{ - func(ctx AndroidMkExtraEntriesContext, entries *AndroidMkEntries) { - entries.SetString("LOCAL_MODULE_PATH", p.installPath.String()) - entries.SetString("LOCAL_INSTALLED_MODULE_STEM", p.outputFilePath.Base()) - }, - }, - }} -} - // build_prop module generates {partition}/build.prop file. At first common build properties are // printed based on Soong config variables. And then prop_files are printed as-is. Finally, // post_process_props tool is run to check if the result build.prop is valid or not. diff --git a/android/buildinfo_prop.go b/android/buildinfo_prop.go new file mode 100644 index 000000000..bba4c0d24 --- /dev/null +++ b/android/buildinfo_prop.go @@ -0,0 +1,132 @@ +// Copyright 2022 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package android + +import ( + "github.com/google/blueprint/proptools" +) + +func init() { + ctx := InitRegistrationContext + ctx.RegisterModuleType("buildinfo_prop", buildinfoPropFactory) +} + +type buildinfoPropProperties struct { + // Whether this module is directly installable to one of the partitions. Default: true. + Installable *bool + + Product_config *string `android:"path"` +} + +type buildinfoPropModule struct { + ModuleBase + + properties buildinfoPropProperties + + outputFilePath OutputPath + installPath InstallPath +} + +func (p *buildinfoPropModule) installable() bool { + return proptools.BoolDefault(p.properties.Installable, true) +} + +func shouldAddBuildThumbprint(config Config) bool { + knownOemProperties := []string{ + "ro.product.brand", + "ro.product.name", + "ro.product.device", + } + + for _, knownProp := range knownOemProperties { + if InList(knownProp, config.OemProperties()) { + return true + } + } + return false +} + +func (p *buildinfoPropModule) GenerateAndroidBuildActions(ctx ModuleContext) { + if ctx.ModuleName() != "buildinfo.prop" || ctx.ModuleDir() != "build/soong" { + ctx.ModuleErrorf("There can only be one buildinfo_prop module in build/soong") + return + } + p.outputFilePath = PathForModuleOut(ctx, p.Name()).OutputPath + ctx.SetOutputFiles(Paths{p.outputFilePath}, "") + + if !ctx.Config().KatiEnabled() { + WriteFileRule(ctx, p.outputFilePath, "# no buildinfo.prop if kati is disabled") + return + } + + rule := NewRuleBuilder(pctx, ctx) + + config := ctx.Config() + + cmd := rule.Command().BuiltTool("buildinfo") + + cmd.FlagWithInput("--build-hostname-file=", config.BuildHostnameFile(ctx)) + // Note: depending on BuildNumberFile will cause the build.prop file to be rebuilt + // every build, but that's intentional. + cmd.FlagWithInput("--build-number-file=", config.BuildNumberFile(ctx)) + // Export build thumbprint only if the product has specified at least one oem fingerprint property + // b/17888863 + if shouldAddBuildThumbprint(config) { + // In the previous make implementation, a dependency was not added on the thumbprint file + cmd.FlagWithArg("--build-thumbprint-file=", config.BuildThumbprintFile(ctx).String()) + } + cmd.FlagWithArg("--build-username=", config.Getenv("BUILD_USERNAME")) + // Technically we should also have a dependency on BUILD_DATETIME_FILE, + // but it can be either an absolute or relative path, which is hard to turn into + // a Path object. So just rely on the BuildNumberFile always changing to cause + // us to rebuild. + cmd.FlagWithArg("--date-file=", ctx.Config().Getenv("BUILD_DATETIME_FILE")) + cmd.FlagWithInput("--platform-preview-sdk-fingerprint-file=", ApiFingerprintPath(ctx)) + cmd.FlagWithInput("--product-config=", PathForModuleSrc(ctx, proptools.String(p.properties.Product_config))) + cmd.FlagWithOutput("--out=", p.outputFilePath) + + rule.Build(ctx.ModuleName(), "generating buildinfo props") + + if !p.installable() { + p.SkipInstall() + } + + p.installPath = PathForModuleInstall(ctx) + ctx.InstallFile(p.installPath, p.Name(), p.outputFilePath) +} + +func (p *buildinfoPropModule) AndroidMkEntries() []AndroidMkEntries { + return []AndroidMkEntries{{ + Class: "ETC", + OutputFile: OptionalPathForPath(p.outputFilePath), + ExtraEntries: []AndroidMkExtraEntriesFunc{ + func(ctx AndroidMkExtraEntriesContext, entries *AndroidMkEntries) { + entries.SetString("LOCAL_MODULE_PATH", p.installPath.String()) + entries.SetString("LOCAL_INSTALLED_MODULE_STEM", p.outputFilePath.Base()) + entries.SetBoolIfTrue("LOCAL_UNINSTALLABLE_MODULE", !p.installable()) + }, + }, + }} +} + +// buildinfo_prop module generates a build.prop file, which contains a set of common +// system/build.prop properties, such as ro.build.version.*. Not all properties are implemented; +// currently this module is only for microdroid. +func buildinfoPropFactory() Module { + module := &buildinfoPropModule{} + module.AddProperties(&module.properties) + InitAndroidModule(module) + return module +} diff --git a/android/config.go b/android/config.go index 40a73d6e7..cadc929c9 100644 --- a/android/config.go +++ b/android/config.go @@ -2081,11 +2081,3 @@ func (c *config) UseDebugArt() bool { return Bool(c.productVariables.Eng) } - -func (c *config) SystemPropFiles(ctx PathContext) Paths { - return PathsForSource(ctx, c.productVariables.SystemPropFiles) -} - -func (c *config) EnableUffdGc() string { - return String(c.productVariables.EnableUffdGc) -} diff --git a/android/configurable_properties.go b/android/configurable_properties.go index dad42fa1d..2c794a186 100644 --- a/android/configurable_properties.go +++ b/android/configurable_properties.go @@ -26,3 +26,9 @@ func CreateSelectOsToBool(cases map[string]*bool) proptools.Configurable[bool] { resultCases, ) } + +func NewSimpleConfigurable[T proptools.ConfigurableElements](value T) proptools.Configurable[T] { + return proptools.NewConfigurable(nil, []proptools.ConfigurableCase[T]{ + proptools.NewConfigurableCase(nil, &value), + }) +} diff --git a/android/paths.go b/android/paths.go index dda48dd54..dad70f770 100644 --- a/android/paths.go +++ b/android/paths.go @@ -245,13 +245,13 @@ type Path interface { // A standard build has the following structure: // ../top/ // out/ - make install files go here. - // out/soong - this is the soongOutDir passed to NewTestConfig() + // out/soong - this is the outDir passed to NewTestConfig() // ... - the source files // // This function converts a path so that it appears relative to the ../top/ directory, i.e. - // * Make install paths, which have the pattern "soongOutDir/../<path>" are converted into the top + // * Make install paths, which have the pattern "outDir/../<path>" are converted into the top // relative path "out/<path>" - // * Soong install paths and other writable paths, which have the pattern "soongOutDir/<path>" are + // * Soong install paths and other writable paths, which have the pattern "outDir/soong/<path>" are // converted into the top relative path "out/soong/<path>". // * Source paths are already relative to the top. // * Phony paths are not relative to anything. @@ -261,8 +261,9 @@ type Path interface { } const ( - OutDir = "out" - OutSoongDir = OutDir + "/soong" + testOutDir = "out" + testOutSoongSubDir = "/soong" + TestOutSoongDir = testOutDir + testOutSoongSubDir ) // WritablePath is a type of path that can be used as an output for build rules. @@ -1118,11 +1119,6 @@ func (p basePath) withRel(rel string) basePath { return p } -func (p basePath) RelativeToTop() Path { - ensureTestOnly() - return p -} - // SourcePath is a Path representing a file path rooted from SrcDir type SourcePath struct { basePath @@ -1135,6 +1131,11 @@ func (p SourcePath) withRel(rel string) SourcePath { return p } +func (p SourcePath) RelativeToTop() Path { + ensureTestOnly() + return p +} + // safePathForSource is for paths that we expect are safe -- only for use by go // code that is embedding ninja variables in paths func safePathForSource(ctx PathContext, pathComponents ...string) (SourcePath, error) { @@ -1218,11 +1219,13 @@ func PathForSource(ctx PathContext, pathComponents ...string) SourcePath { // PathForArbitraryOutput creates a path for the given components. Unlike PathForOutput, // the path is relative to the root of the output folder, not the out/soong folder. func PathForArbitraryOutput(ctx PathContext, pathComponents ...string) Path { - p, err := validatePath(pathComponents...) + path, err := validatePath(pathComponents...) if err != nil { reportPathError(ctx, err) } - return basePath{path: filepath.Join(ctx.Config().OutDir(), p)} + fullPath := filepath.Join(ctx.Config().OutDir(), path) + path = fullPath[len(fullPath)-len(path):] + return OutputPath{basePath{path, ""}, ctx.Config().OutDir(), fullPath} } // MaybeExistentPathForSource joins the provided path components and validates that the result @@ -1325,8 +1328,8 @@ func (p SourcePath) OverlayPath(ctx ModuleMissingDepsPathContext, path Path) Opt type OutputPath struct { basePath - // The soong build directory, i.e. Config.SoongOutDir() - soongOutDir string + // The base out directory for this path, either Config.SoongOutDir() or Config.OutDir() + outDir string fullPath string } @@ -1334,7 +1337,7 @@ type OutputPath struct { func (p OutputPath) GobEncode() ([]byte, error) { w := new(bytes.Buffer) encoder := gob.NewEncoder(w) - err := errors.Join(encoder.Encode(p.basePath), encoder.Encode(p.soongOutDir), encoder.Encode(p.fullPath)) + err := errors.Join(encoder.Encode(p.basePath), encoder.Encode(p.outDir), encoder.Encode(p.fullPath)) if err != nil { return nil, err } @@ -1345,7 +1348,7 @@ func (p OutputPath) GobEncode() ([]byte, error) { func (p *OutputPath) GobDecode(data []byte) error { r := bytes.NewBuffer(data) decoder := gob.NewDecoder(r) - err := errors.Join(decoder.Decode(&p.basePath), decoder.Decode(&p.soongOutDir), decoder.Decode(&p.fullPath)) + err := errors.Join(decoder.Decode(&p.basePath), decoder.Decode(&p.outDir), decoder.Decode(&p.fullPath)) if err != nil { return err } @@ -1365,7 +1368,7 @@ func (p OutputPath) WithoutRel() OutputPath { } func (p OutputPath) getSoongOutDir() string { - return p.soongOutDir + return p.outDir } func (p OutputPath) RelativeToTop() Path { @@ -1373,8 +1376,13 @@ func (p OutputPath) RelativeToTop() Path { } func (p OutputPath) outputPathRelativeToTop() OutputPath { - p.fullPath = StringPathRelativeToTop(p.soongOutDir, p.fullPath) - p.soongOutDir = OutSoongDir + p.fullPath = StringPathRelativeToTop(p.outDir, p.fullPath) + if strings.HasSuffix(p.outDir, testOutSoongSubDir) { + p.outDir = TestOutSoongDir + } else { + // Handle the PathForArbitraryOutput case + p.outDir = testOutDir + } return p } @@ -1420,7 +1428,7 @@ func PathForOutput(ctx PathContext, pathComponents ...string) OutputPath { return OutputPath{basePath{path, ""}, ctx.Config().soongOutDir, fullPath} } -// PathsForOutput returns Paths rooted from soongOutDir +// PathsForOutput returns Paths rooted from outDir func PathsForOutput(ctx PathContext, paths []string) WritablePaths { ret := make(WritablePaths, len(paths)) for i, path := range paths { @@ -1751,9 +1759,9 @@ func ensureTestOnly() { func (p InstallPath) RelativeToTop() Path { ensureTestOnly() if p.makePath { - p.soongOutDir = OutDir + p.soongOutDir = testOutDir } else { - p.soongOutDir = OutSoongDir + p.soongOutDir = TestOutSoongDir } p.fullPath = filepath.Join(p.soongOutDir, p.path) return p diff --git a/android/prebuilt.go b/android/prebuilt.go index 51b86a56f..8856d2619 100644 --- a/android/prebuilt.go +++ b/android/prebuilt.go @@ -61,7 +61,7 @@ var _ ExcludeFromApexContentsTag = PrebuiltDepTag type UserSuppliedPrebuiltProperties struct { // When prefer is set to true the prebuilt will be used instead of any source module with // a matching name. - Prefer *bool `android:"arch_variant"` + Prefer proptools.Configurable[bool] `android:"arch_variant,replace_instead_of_append"` // When specified this names a Soong config variable that controls the prefer property. // @@ -148,11 +148,7 @@ func PrebuiltNameFromSource(name string) string { } func (p *Prebuilt) ForcePrefer() { - p.properties.Prefer = proptools.BoolPtr(true) -} - -func (p *Prebuilt) Prefer() bool { - return proptools.Bool(p.properties.Prefer) + p.properties.Prefer = NewSimpleConfigurable(true) } // SingleSourcePathFromSupplier invokes the supplied supplier for the current module in the @@ -707,7 +703,7 @@ func (p *Prebuilt) usePrebuilt(ctx BaseMutatorContext, source Module, prebuilt M } // TODO: use p.Properties.Name and ctx.ModuleDir to override preference - return Bool(p.properties.Prefer) + return p.properties.Prefer.GetOrDefault(ctx, false) } func (p *Prebuilt) SourceExists() bool { diff --git a/android/testing.go b/android/testing.go index e39a1a749..dae787b7f 100644 --- a/android/testing.go +++ b/android/testing.go @@ -822,15 +822,15 @@ func newBaseTestingComponent(config Config, provider testBuildProvider) baseTest // containing at most one instance of the temporary build directory at the start of the path while // this assumes that there can be any number at any position. func normalizeStringRelativeToTop(config Config, s string) string { - // The soongOutDir usually looks something like: /tmp/testFoo2345/001 + // The outDir usually looks something like: /tmp/testFoo2345/001 // - // Replace any usage of the soongOutDir with out/soong, e.g. replace "/tmp/testFoo2345/001" with + // Replace any usage of the outDir with out/soong, e.g. replace "/tmp/testFoo2345/001" with // "out/soong". outSoongDir := filepath.Clean(config.soongOutDir) re := regexp.MustCompile(`\Q` + outSoongDir + `\E\b`) s = re.ReplaceAllString(s, "out/soong") - // Replace any usage of the soongOutDir/.. with out, e.g. replace "/tmp/testFoo2345" with + // Replace any usage of the outDir/.. with out, e.g. replace "/tmp/testFoo2345" with // "out". This must come after the previous replacement otherwise this would replace // "/tmp/testFoo2345/001" with "out/001" instead of "out/soong". outDir := filepath.Dir(outSoongDir) @@ -1234,8 +1234,14 @@ func StringPathRelativeToTop(soongOutDir string, path string) string { } if isRel { - // The path is in the soong out dir so indicate that in the relative path. - return filepath.Join("out/soong", rel) + if strings.HasSuffix(soongOutDir, testOutSoongSubDir) { + // The path is in the soong out dir so indicate that in the relative path. + return filepath.Join(TestOutSoongDir, rel) + } else { + // Handle the PathForArbitraryOutput case + return filepath.Join(testOutDir, rel) + + } } // Check to see if the path is relative to the top level out dir. diff --git a/android/variable.go b/android/variable.go index a715e0eb0..df0e59ce1 100644 --- a/android/variable.go +++ b/android/variable.go @@ -507,10 +507,6 @@ type ProductVariables struct { OemProperties []string `json:",omitempty"` ArtTargetIncludeDebugBuild *bool `json:",omitempty"` - - SystemPropFiles []string `json:",omitempty"` - - EnableUffdGc *string `json:",omitempty"` } type PartitionQualifiedVariablesType struct { diff --git a/cc/Android.bp b/cc/Android.bp index 3bbcaa92e..e68e4a398 100644 --- a/cc/Android.bp +++ b/cc/Android.bp @@ -73,7 +73,6 @@ bootstrap_go_package { "ndk_abi.go", "ndk_headers.go", "ndk_library.go", - "ndk_prebuilt.go", "ndk_sysroot.go", "llndk_library.go", diff --git a/cc/androidmk.go b/cc/androidmk.go index 41346538f..cecaae23a 100644 --- a/cc/androidmk.go +++ b/cc/androidmk.go @@ -451,10 +451,6 @@ func (c *vndkPrebuiltLibraryDecorator) AndroidMkEntries(ctx AndroidMkContext, en }) } -func (c *ndkPrebuiltStlLinker) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) { - entries.Class = "SHARED_LIBRARIES" -} - func (p *prebuiltLinker) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) { entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) { if p.properties.Check_elf_files != nil { diff --git a/cc/builder.go b/cc/builder.go index 367bda380..a05a16dcb 100644 --- a/cc/builder.go +++ b/cc/builder.go @@ -156,11 +156,17 @@ var ( "args") // Rule to invoke `strip` (to discard symbols and data from object files) on darwin architecture. - darwinStrip = pctx.AndroidStaticRule("darwinStrip", - blueprint.RuleParams{ - Command: "${config.MacStripPath} -u -r -o $out $in", - CommandDeps: []string{"${config.MacStripPath}"}, - }) + darwinStrip = func() blueprint.Rule { + if runtime.GOOS == "darwin" { + return pctx.AndroidStaticRule("darwinStrip", + blueprint.RuleParams{ + Command: "${config.MacStripPath} -u -r -o $out $in", + CommandDeps: []string{"${config.MacStripPath}"}, + }) + } else { + return nil + } + }() // b/132822437: objcopy uses a file descriptor per .o file when called on .a files, which runs the system out of // file descriptors on darwin. Limit concurrent calls to 5 on darwin. @@ -174,11 +180,17 @@ var ( } }() - darwinLipo = pctx.AndroidStaticRule("darwinLipo", - blueprint.RuleParams{ - Command: "${config.MacLipoPath} -create -output $out $in", - CommandDeps: []string{"${config.MacLipoPath}"}, - }) + darwinLipo = func() blueprint.Rule { + if runtime.GOOS == "darwin" { + return pctx.AndroidStaticRule("darwinLipo", + blueprint.RuleParams{ + Command: "${config.MacLipoPath} -create -output $out $in", + CommandDeps: []string{"${config.MacLipoPath}"}, + }) + } else { + return nil + } + }() _ = pctx.SourcePathVariable("archiveRepackPath", "build/soong/scripts/archive_repack.sh") @@ -1028,13 +1028,6 @@ func (c *Module) SelectedStl() string { return "" } -func (c *Module) NdkPrebuiltStl() bool { - if _, ok := c.linker.(*ndkPrebuiltStlLinker); ok { - return true - } - return false -} - func (c *Module) StubDecorator() bool { if _, ok := c.linker.(*stubDecorator); ok { return true @@ -1088,16 +1081,6 @@ func (c *Module) CcLibraryInterface() bool { return false } -func (c *Module) IsNdkPrebuiltStl() bool { - if c.linker == nil { - return false - } - if _, ok := c.linker.(*ndkPrebuiltStlLinker); ok { - return true - } - return false -} - func (c *Module) RlibStd() bool { panic(fmt.Errorf("RlibStd called on non-Rust module: %q", c.BaseModuleName())) } @@ -2754,10 +2737,6 @@ func checkLinkType(ctx android.BaseModuleContext, from LinkableInterface, to Lin return } if c, ok := to.(*Module); ok { - if c.NdkPrebuiltStl() { - // These are allowed, but they don't set sdk_version - return - } if c.StubDecorator() { // These aren't real libraries, but are the stub shared libraries that are included in // the NDK. @@ -3927,7 +3906,6 @@ const ( headerLibrary testBin // testBinary already declared ndkLibrary - ndkPrebuiltStl ) func (c *Module) typ() moduleType { @@ -3966,8 +3944,6 @@ func (c *Module) typ() moduleType { return sharedLibrary } else if c.isNDKStubLibrary() { return ndkLibrary - } else if c.IsNdkPrebuiltStl() { - return ndkPrebuiltStl } return unknownType } diff --git a/cc/cc_test.go b/cc/cc_test.go index ccdaae58f..b1c094547 100644 --- a/cc/cc_test.go +++ b/cc/cc_test.go @@ -2760,7 +2760,7 @@ func TestIncludeDirectoryOrdering(t *testing.T) { "external/foo/libarm", "external/foo/lib32", "external/foo/libandroid_arm", - "defaults/cc/common/ndk_libc++_shared", + "defaults/cc/common/ndk_libc++_shared_include_dirs", } conly := []string{"-fPIC", "${config.CommonGlobalConlyflags}"} diff --git a/cc/config/darwin_host.go b/cc/config/darwin_host.go index 485666954..2ea607a9d 100644 --- a/cc/config/darwin_host.go +++ b/cc/config/darwin_host.go @@ -18,6 +18,7 @@ import ( "fmt" "os/exec" "path/filepath" + "runtime" "strings" "sync" @@ -73,31 +74,33 @@ var ( ) func init() { - pctx.VariableFunc("macSdkRoot", func(ctx android.PackageVarContext) string { - return getMacTools(ctx).sdkRoot - }) - pctx.StaticVariable("macMinVersion", "10.14") - pctx.VariableFunc("MacArPath", func(ctx android.PackageVarContext) string { - return getMacTools(ctx).arPath - }) - - pctx.VariableFunc("MacLipoPath", func(ctx android.PackageVarContext) string { - return getMacTools(ctx).lipoPath - }) - - pctx.VariableFunc("MacStripPath", func(ctx android.PackageVarContext) string { - return getMacTools(ctx).stripPath - }) - - pctx.VariableFunc("MacToolPath", func(ctx android.PackageVarContext) string { - return getMacTools(ctx).toolPath - }) - - pctx.StaticVariable("DarwinCflags", strings.Join(darwinCflags, " ")) - pctx.StaticVariable("DarwinLdflags", strings.Join(darwinLdflags, " ")) - pctx.StaticVariable("DarwinLldflags", strings.Join(darwinLdflags, " ")) - - pctx.StaticVariable("DarwinYasmFlags", "-f macho -m amd64") + if runtime.GOOS == "darwin" { + pctx.VariableFunc("macSdkRoot", func(ctx android.PackageVarContext) string { + return getMacTools(ctx).sdkRoot + }) + pctx.StaticVariable("macMinVersion", "10.14") + pctx.VariableFunc("MacArPath", func(ctx android.PackageVarContext) string { + return getMacTools(ctx).arPath + }) + + pctx.VariableFunc("MacLipoPath", func(ctx android.PackageVarContext) string { + return getMacTools(ctx).lipoPath + }) + + pctx.VariableFunc("MacStripPath", func(ctx android.PackageVarContext) string { + return getMacTools(ctx).stripPath + }) + + pctx.VariableFunc("MacToolPath", func(ctx android.PackageVarContext) string { + return getMacTools(ctx).toolPath + }) + + pctx.StaticVariable("DarwinCflags", strings.Join(darwinCflags, " ")) + pctx.StaticVariable("DarwinLdflags", strings.Join(darwinLdflags, " ")) + pctx.StaticVariable("DarwinLldflags", strings.Join(darwinLdflags, " ")) + + pctx.StaticVariable("DarwinYasmFlags", "-f macho -m amd64") + } } func MacStripPath(ctx android.PathContext) string { diff --git a/cc/ndk_prebuilt.go b/cc/ndk_prebuilt.go deleted file mode 100644 index f503982cd..000000000 --- a/cc/ndk_prebuilt.go +++ /dev/null @@ -1,133 +0,0 @@ -// Copyright 2016 Google Inc. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package cc - -import ( - "strings" - - "android/soong/android" -) - -func init() { - android.RegisterModuleType("ndk_prebuilt_static_stl", NdkPrebuiltStaticStlFactory) - android.RegisterModuleType("ndk_prebuilt_shared_stl", NdkPrebuiltSharedStlFactory) -} - -// NDK prebuilt libraries. -// -// These differ from regular prebuilts in that they aren't stripped and usually aren't installed -// either (with the exception of the shared STLs, which are installed to the app's directory rather -// than to the system image). - -type ndkPrebuiltStlLinker struct { - *libraryDecorator -} - -func (ndk *ndkPrebuiltStlLinker) linkerProps() []interface{} { - return append(ndk.libraryDecorator.linkerProps(), &ndk.Properties, &ndk.flagExporter.Properties) -} - -func (*ndkPrebuiltStlLinker) linkerDeps(ctx DepsContext, deps Deps) Deps { - // NDK libraries can't have any dependencies - return deps -} - -func (*ndkPrebuiltStlLinker) availableFor(what string) bool { - // ndk prebuilt objects are available to everywhere - return true -} - -// ndk_prebuilt_shared_stl exports a precompiled ndk shared standard template -// library (stl) library for linking operation. The soong's module name format -// is ndk_<NAME>.so where the library is located under -// ./prebuilts/ndk/current/sources/cxx-stl/llvm-libc++/libs/$(HOST_ARCH)/<NAME>.so. -func NdkPrebuiltSharedStlFactory() android.Module { - module, library := NewLibrary(android.DeviceSupported) - library.BuildOnlyShared() - module.compiler = nil - module.linker = &ndkPrebuiltStlLinker{ - libraryDecorator: library, - } - module.installer = nil - module.Properties.Sdk_version = StringPtr("minimum") - module.Properties.AlwaysSdk = true - module.stl.Properties.Stl = StringPtr("none") - return module.Init() -} - -// ndk_prebuilt_static_stl exports a precompiled ndk static standard template -// library (stl) library for linking operation. The soong's module name format -// is ndk_<NAME>.a where the library is located under -// ./prebuilts/ndk/current/sources/cxx-stl/llvm-libc++/libs/$(HOST_ARCH)/<NAME>.a. -func NdkPrebuiltStaticStlFactory() android.Module { - module, library := NewLibrary(android.DeviceSupported) - library.BuildOnlyStatic() - module.compiler = nil - module.linker = &ndkPrebuiltStlLinker{ - libraryDecorator: library, - } - module.installer = nil - module.Properties.Sdk_version = StringPtr("minimum") - module.Properties.HideFromMake = true - module.Properties.AlwaysSdk = true - module.Properties.Sdk_version = StringPtr("current") - module.stl.Properties.Stl = StringPtr("none") - return module.Init() -} - -const ( - libDir = "current/sources/cxx-stl/llvm-libc++/libs" -) - -func getNdkStlLibDir(ctx android.ModuleContext) android.SourcePath { - return android.PathForSource(ctx, ctx.ModuleDir(), libDir).Join(ctx, ctx.Arch().Abi[0]) -} - -func (ndk *ndkPrebuiltStlLinker) link(ctx ModuleContext, flags Flags, - deps PathDeps, objs Objects) android.Path { - // A null build step, but it sets up the output path. - if !strings.HasPrefix(ctx.ModuleName(), "ndk_lib") { - ctx.ModuleErrorf("NDK prebuilt libraries must have an ndk_lib prefixed name") - } - - ndk.libraryDecorator.flagExporter.exportIncludesAsSystem(ctx) - - libName := strings.TrimPrefix(ctx.ModuleName(), "ndk_") - libExt := flags.Toolchain.ShlibSuffix() - if ndk.static() { - libExt = staticLibraryExtension - } - - libDir := getNdkStlLibDir(ctx) - lib := libDir.Join(ctx, libName+libExt) - - ndk.libraryDecorator.flagExporter.setProvider(ctx) - - if ndk.static() { - depSet := android.NewDepSetBuilder[android.Path](android.TOPOLOGICAL).Direct(lib).Build() - android.SetProvider(ctx, StaticLibraryInfoProvider, StaticLibraryInfo{ - StaticLibrary: lib, - - TransitiveStaticLibrariesForOrdering: depSet, - }) - } else { - android.SetProvider(ctx, SharedLibraryInfoProvider, SharedLibraryInfo{ - SharedLibrary: lib, - Target: ctx.Target(), - }) - } - - return lib -} @@ -177,7 +177,7 @@ func (stl *stl) deps(ctx BaseModuleContext, deps Deps) Deps { } else { deps.StaticLibs = append(deps.StaticLibs, stl.Properties.SelectedStl, "ndk_libc++abi") } - deps.StaticLibs = append(deps.StaticLibs, "ndk_libunwind") + deps.StaticLibs = append(deps.StaticLibs, "libunwind") default: panic(fmt.Errorf("Unknown stl: %q", stl.Properties.SelectedStl)) } diff --git a/cc/testing.go b/cc/testing.go index 02f992426..ed567af69 100644 --- a/cc/testing.go +++ b/cc/testing.go @@ -38,8 +38,6 @@ func RegisterRequiredBuildComponentsForTest(ctx android.RegistrationContext) { ctx.RegisterModuleType("cc_cmake_snapshot", CmakeSnapshotFactory) ctx.RegisterModuleType("cc_object", ObjectFactory) ctx.RegisterModuleType("cc_genrule", GenRuleFactory) - ctx.RegisterModuleType("ndk_prebuilt_shared_stl", NdkPrebuiltSharedStlFactory) - ctx.RegisterModuleType("ndk_prebuilt_static_stl", NdkPrebuiltStaticStlFactory) ctx.RegisterModuleType("ndk_library", NdkLibraryFactory) ctx.RegisterModuleType("ndk_headers", NdkHeadersFactory) } @@ -312,6 +310,25 @@ func commonDefaultModules() string { ], } cc_library { + name: "ndk_libc++_shared", + export_include_dirs: ["ndk_libc++_shared_include_dirs"], + no_libcrt: true, + nocrt: true, + system_shared_libs: [], + stl: "none", + vendor_available: true, + vendor_ramdisk_available: true, + product_available: true, + recovery_available: true, + host_supported: false, + sdk_version: "minimum", + double_loadable: true, + apex_available: [ + "//apex_available:platform", + "//apex_available:anyapex", + ], + } + cc_library { name: "libc++demangle", no_libcrt: true, nocrt: true, @@ -397,13 +414,6 @@ func commonDefaultModules() string { name: "libprotobuf-cpp-lite", } - cc_library { - name: "ndk_libunwind", - sdk_version: "minimum", - stl: "none", - system_shared_libs: [], - } - ndk_library { name: "libc", first_version: "minimum", @@ -422,11 +432,6 @@ func commonDefaultModules() string { symbol_file: "libdl.map.txt", } - ndk_prebuilt_shared_stl { - name: "ndk_libc++_shared", - export_include_dirs: ["ndk_libc++_shared"], - } - cc_library_static { name: "libgoogle-benchmark", sdk_version: "current", @@ -557,13 +562,6 @@ var PrepareForTestWithCcBuildComponents = android.GroupFixturePreparers( RegisterLlndkLibraryTxtType(ctx) }), - - // Additional files needed in tests that disallow non-existent source files. - // This includes files that are needed by all, or at least most, instances of a cc module type. - android.MockFS{ - // Needed for ndk_prebuilt_(shared|static)_stl. - "defaults/cc/common/current/sources/cxx-stl/llvm-libc++/libs": nil, - }.AddToFixture(), ) // Preparer that will define default cc modules, e.g. standard prebuilt modules. @@ -572,17 +570,17 @@ var PrepareForTestWithCcDefaultModules = android.GroupFixturePreparers( // Additional files needed in tests that disallow non-existent source. android.MockFS{ - "defaults/cc/common/libc.map.txt": nil, - "defaults/cc/common/libdl.map.txt": nil, - "defaults/cc/common/libft2.map.txt": nil, - "defaults/cc/common/libm.map.txt": nil, - "defaults/cc/common/ndk_libc++_shared": nil, - "defaults/cc/common/crtbegin_so.c": nil, - "defaults/cc/common/crtbegin.c": nil, - "defaults/cc/common/crtend_so.c": nil, - "defaults/cc/common/crtend.c": nil, - "defaults/cc/common/crtbrand.c": nil, - "external/compiler-rt/lib/cfi/cfi_blocklist.txt": nil, + "defaults/cc/common/libc.map.txt": nil, + "defaults/cc/common/libdl.map.txt": nil, + "defaults/cc/common/libft2.map.txt": nil, + "defaults/cc/common/libm.map.txt": nil, + "defaults/cc/common/ndk_libc++_shared_include_dirs": nil, + "defaults/cc/common/crtbegin_so.c": nil, + "defaults/cc/common/crtbegin.c": nil, + "defaults/cc/common/crtend_so.c": nil, + "defaults/cc/common/crtend.c": nil, + "defaults/cc/common/crtbrand.c": nil, + "external/compiler-rt/lib/cfi/cfi_blocklist.txt": nil, "defaults/cc/common/libclang_rt.ubsan_minimal.android_arm64.a": nil, "defaults/cc/common/libclang_rt.ubsan_minimal.android_arm.a": nil, diff --git a/filesystem/filesystem_test.go b/filesystem/filesystem_test.go index 2dc8c21e0..8c0d11178 100644 --- a/filesystem/filesystem_test.go +++ b/filesystem/filesystem_test.go @@ -16,7 +16,6 @@ package filesystem import ( "os" - "path/filepath" "testing" "android/soong/android" @@ -147,8 +146,8 @@ func TestIncludeMakeBuiltFiles(t *testing.T) { output := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img") - stampFile := filepath.Join(result.Config.OutDir(), "target/product/test_device/obj/PACKAGING/system_intermediates/staging_dir.stamp") - fileListFile := filepath.Join(result.Config.OutDir(), "target/product/test_device/obj/PACKAGING/system_intermediates/file_list.txt") + stampFile := "out/target/product/test_device/obj/PACKAGING/system_intermediates/staging_dir.stamp" + fileListFile := "out/target/product/test_device/obj/PACKAGING/system_intermediates/file_list.txt" android.AssertStringListContains(t, "deps of filesystem must include the staging dir stamp file", output.Implicits.Strings(), stampFile) android.AssertStringListContains(t, "deps of filesystem must include the staging dir file list", output.Implicits.Strings(), fileListFile) } diff --git a/java/app_set_test.go b/java/app_set_test.go index 10bc5de92..c02b3593b 100644 --- a/java/app_set_test.go +++ b/java/app_set_test.go @@ -56,7 +56,7 @@ func TestAndroidAppSet(t *testing.T) { mkEntries := android.AndroidMkEntriesForTest(t, result.TestContext, module.Module())[0] actualInstallFile := mkEntries.EntryMap["LOCAL_APK_SET_INSTALL_FILE"] expectedInstallFile := []string{ - strings.Replace(params.ImplicitOutputs[0].String(), android.OutSoongDir, result.Config.SoongOutDir(), 1), + strings.Replace(params.ImplicitOutputs[0].String(), android.TestOutSoongDir, result.Config.SoongOutDir(), 1), } if !reflect.DeepEqual(actualInstallFile, expectedInstallFile) { t.Errorf("Unexpected LOCAL_APK_SET_INSTALL_FILE value: '%s', expected: '%s',", diff --git a/java/bootclasspath.go b/java/bootclasspath.go index 77ddf5c05..029f6f623 100644 --- a/java/bootclasspath.go +++ b/java/bootclasspath.go @@ -196,7 +196,7 @@ var platformBootclasspathDepTag = bootclasspathDependencyTag{name: "platform"} type BootclasspathNestedAPIProperties struct { // java_library or preferably, java_sdk_library modules providing stub classes that define the // APIs provided by this bootclasspath_fragment. - Stub_libs []string + Stub_libs proptools.Configurable[[]string] } // BootclasspathAPIProperties defines properties for defining the API provided by parts of the @@ -229,11 +229,11 @@ type BootclasspathAPIProperties struct { // apiScopeToStubLibs calculates the stub library modules for each relevant *HiddenAPIScope from the // Stub_libs properties. -func (p BootclasspathAPIProperties) apiScopeToStubLibs() map[*HiddenAPIScope][]string { +func (p BootclasspathAPIProperties) apiScopeToStubLibs(ctx android.BaseModuleContext) map[*HiddenAPIScope][]string { m := map[*HiddenAPIScope][]string{} for _, apiScope := range hiddenAPISdkLibrarySupportedScopes { - m[apiScope] = p.Api.Stub_libs + m[apiScope] = p.Api.Stub_libs.GetOrDefault(ctx, nil) } - m[CorePlatformHiddenAPIScope] = p.Core_platform_api.Stub_libs + m[CorePlatformHiddenAPIScope] = p.Core_platform_api.Stub_libs.GetOrDefault(ctx, nil) return m } diff --git a/java/bootclasspath_fragment.go b/java/bootclasspath_fragment.go index 16209b72e..bce507a7d 100644 --- a/java/bootclasspath_fragment.go +++ b/java/bootclasspath_fragment.go @@ -445,7 +445,7 @@ func (b *BootclasspathFragmentModule) ComponentDepsMutator(ctx android.BottomUpM func (b *BootclasspathFragmentModule) DepsMutator(ctx android.BottomUpMutatorContext) { // Add dependencies onto all the modules that provide the API stubs for classes on this // bootclasspath fragment. - hiddenAPIAddStubLibDependencies(ctx, b.properties.apiScopeToStubLibs()) + hiddenAPIAddStubLibDependencies(ctx, b.properties.apiScopeToStubLibs(ctx)) for _, additionalStubModule := range b.properties.Additional_stubs { for _, apiScope := range hiddenAPISdkLibrarySupportedScopes { @@ -933,8 +933,8 @@ func (b *bootclasspathFragmentSdkMemberProperties) PopulateFromVariant(ctx andro b.Filtered_flags_path = android.OptionalPathForPath(hiddenAPIInfo.FilteredFlagsPath) // Copy stub_libs properties. - b.Stub_libs = module.properties.Api.Stub_libs - b.Core_platform_stub_libs = module.properties.Core_platform_api.Stub_libs + b.Stub_libs = module.properties.Api.Stub_libs.GetOrDefault(mctx, nil) + b.Core_platform_stub_libs = module.properties.Core_platform_api.Stub_libs.GetOrDefault(mctx, nil) // Copy fragment properties. b.Fragments = module.properties.Fragments diff --git a/java/sdk_test.go b/java/sdk_test.go index 9e8ba6ed0..2dac27af1 100644 --- a/java/sdk_test.go +++ b/java/sdk_test.go @@ -388,7 +388,9 @@ func TestClasspath(t *testing.T) { }, } + t.Parallel() t.Run("basic", func(t *testing.T) { + t.Parallel() testClasspathTestCases(t, classpathTestcases, false) }) @@ -404,6 +406,7 @@ func testClasspathTestCases(t *testing.T, classpathTestcases []classpathTestCase } t.Run(testcase.name, func(t *testing.T) { + t.Parallel() moduleType := "java_library" if testcase.moduleType != "" { moduleType = testcase.moduleType diff --git a/rust/config/darwin_host.go b/rust/config/darwin_host.go index a4bc1879c..df8c6ac5a 100644 --- a/rust/config/darwin_host.go +++ b/rust/config/darwin_host.go @@ -15,6 +15,7 @@ package config import ( + "runtime" "strings" "android/soong/android" @@ -35,13 +36,15 @@ func init() { registerToolchainFactory(android.Darwin, android.Arm64, darwinArm64ToolchainFactory) registerToolchainFactory(android.Darwin, android.X86_64, darwinX8664ToolchainFactory) - pctx.StaticVariable("DarwinToolchainRustFlags", strings.Join(DarwinRustFlags, " ")) - pctx.StaticVariable("DarwinToolchainLinkFlags", strings.Join(DarwinRustLinkFlags, " ")) + if runtime.GOOS == "darwin" { + pctx.StaticVariable("DarwinToolchainRustFlags", strings.Join(DarwinRustFlags, " ")) + pctx.StaticVariable("DarwinToolchainLinkFlags", strings.Join(DarwinRustLinkFlags, " ")) - pctx.StaticVariable("DarwinToolchainArm64RustFlags", strings.Join(darwinArm64Rustflags, " ")) - pctx.StaticVariable("DarwinToolchainArm64LinkFlags", strings.Join(darwinArm64Linkflags, " ")) - pctx.StaticVariable("DarwinToolchainX8664RustFlags", strings.Join(darwinX8664Rustflags, " ")) - pctx.StaticVariable("DarwinToolchainX8664LinkFlags", strings.Join(darwinX8664Linkflags, " ")) + pctx.StaticVariable("DarwinToolchainArm64RustFlags", strings.Join(darwinArm64Rustflags, " ")) + pctx.StaticVariable("DarwinToolchainArm64LinkFlags", strings.Join(darwinArm64Linkflags, " ")) + pctx.StaticVariable("DarwinToolchainX8664RustFlags", strings.Join(darwinX8664Rustflags, " ")) + pctx.StaticVariable("DarwinToolchainX8664LinkFlags", strings.Join(darwinX8664Linkflags, " ")) + } } diff --git a/scripts/Android.bp b/scripts/Android.bp index 3d81b83c2..91aa19560 100644 --- a/scripts/Android.bp +++ b/scripts/Android.bp @@ -306,6 +306,12 @@ python_binary_host { } python_binary_host { + name: "buildinfo", + main: "buildinfo.py", + srcs: ["buildinfo.py"], +} + +python_binary_host { name: "extra_install_zips_file_list", main: "extra_install_zips_file_list.py", srcs: ["extra_install_zips_file_list.py"], diff --git a/scripts/buildinfo.py b/scripts/buildinfo.py new file mode 100755 index 000000000..8a24b63a8 --- /dev/null +++ b/scripts/buildinfo.py @@ -0,0 +1,191 @@ +#!/usr/bin/env python3 +# +# Copyright (C) 2024 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +"""A tool for generating buildinfo.prop""" + +import argparse +import contextlib +import json +import os +import subprocess + +TEST_KEY_DIR = "build/make/target/product/security" + +def get_build_variant(product_config): + if product_config["Eng"]: + return "eng" + elif product_config["Debuggable"]: + return "userdebug" + else: + return "user" + +def get_build_flavor(product_config): + build_flavor = product_config["DeviceProduct"] + "-" + get_build_variant(product_config) + if "address" in product_config.get("SanitizeDevice", []) and "_asan" not in build_flavor: + build_flavor += "_asan" + return build_flavor + +def get_build_keys(product_config): + default_cert = product_config.get("DefaultAppCertificate", "") + if default_cert == "" or default_cert == os.path.join(TEST_KEY_DIR, "testKey"): + return "test-keys" + return "dev-keys" + +def parse_args(): + """Parse commandline arguments.""" + parser = argparse.ArgumentParser() + parser.add_argument('--build-hostname-file', required=True, type=argparse.FileType('r')), + parser.add_argument('--build-number-file', required=True, type=argparse.FileType('r')) + parser.add_argument('--build-thumbprint-file', type=argparse.FileType('r')) + parser.add_argument('--build-username', required=True) + parser.add_argument('--date-file', required=True, type=argparse.FileType('r')) + parser.add_argument('--platform-preview-sdk-fingerprint-file', + required=True, + type=argparse.FileType('r')) + parser.add_argument('--product-config', required=True, type=argparse.FileType('r')) + parser.add_argument('--out', required=True, type=argparse.FileType('w')) + + option = parser.parse_args() + + product_config = json.load(option.product_config) + build_flags = product_config["BuildFlags"] + + option.build_flavor = get_build_flavor(product_config) + option.build_keys = get_build_keys(product_config) + option.build_id = product_config["BuildId"] + option.build_type = product_config["BuildType"] + option.build_variant = get_build_variant(product_config) + option.build_version_tags = product_config["BuildVersionTags"] + option.cpu_abis = product_config["DeviceAbi"] + option.default_locale = None + if len(product_config.get("ProductLocales", [])) > 0: + option.default_locale = product_config["ProductLocales"][0] + option.default_wifi_channels = product_config.get("ProductDefaultWifiChannels", []) + option.device = product_config["DeviceName"] + option.display_build_number = product_config["DisplayBuildNumber"] + option.platform_base_os = product_config["Platform_base_os"] + option.platform_display_version = product_config["Platform_display_version_name"] + option.platform_min_supported_target_sdk_version = build_flags["RELEASE_PLATFORM_MIN_SUPPORTED_TARGET_SDK_VERSION"] + option.platform_preview_sdk_version = product_config["Platform_preview_sdk_version"] + option.platform_sdk_version = product_config["Platform_sdk_version"] + option.platform_security_patch = product_config["Platform_security_patch"] + option.platform_version = product_config["Platform_version_name"] + option.platform_version_codename = product_config["Platform_sdk_codename"] + option.platform_version_all_codenames = product_config["Platform_version_active_codenames"] + option.platform_version_known_codenames = product_config["Platform_version_known_codenames"] + option.platform_version_last_stable = product_config["Platform_version_last_stable"] + option.product = product_config["DeviceProduct"] + option.use_vbmeta_digest_in_fingerprint = product_config["BoardUseVbmetaDigestInFingerprint"] + + return option + +def main(): + option = parse_args() + + build_hostname = option.build_hostname_file.read().strip() + build_number = option.build_number_file.read().strip() + build_version_tags_list = option.build_version_tags + if option.build_type == "debug": + build_version_tags_list.append("debug") + build_version_tags_list.append(option.build_keys) + build_version_tags = ",".join(sorted(set(build_version_tags_list))) + + raw_date = option.date_file.read().strip() + date = subprocess.check_output(["date", "-d", f"@{raw_date}"], text=True).strip() + date_utc = subprocess.check_output(["date", "-d", f"@{raw_date}", "+%s"], text=True).strip() + + # build_desc is human readable strings that describe this build. This has the same info as the + # build fingerprint. + # e.g. "aosp_cf_x86_64_phone-userdebug VanillaIceCream MAIN eng.20240319.143939 test-keys" + build_desc = f"{option.product}-{option.build_variant} {option.platform_version} " \ + f"{option.build_id} {build_number} {build_version_tags}" + + platform_preview_sdk_fingerprint = option.platform_preview_sdk_fingerprint_file.read().strip() + + with contextlib.redirect_stdout(option.out): + print("# begin build properties") + print("# autogenerated by buildinfo.py") + + # The ro.build.id will be set dynamically by init, by appending the unique vbmeta digest. + if option.use_vbmeta_digest_in_fingerprint: + print(f"ro.build.legacy.id={option.build_id}") + else: + print(f"ro.build.id?={option.build_id}") + + # ro.build.display.id is shown under Settings -> About Phone + if option.build_variant == "user": + # User builds should show: + # release build number or branch.buld_number non-release builds + + # Dev. branches should have DISPLAY_BUILD_NUMBER set + if option.display_build_number: + print(f"ro.build.display.id?={option.build_id}.{build_number} {option.build_keys}") + else: + print(f"ro.build.display.id?={option.build_id} {option.build_keys}") + else: + # Non-user builds should show detailed build information (See build desc above) + print(f"ro.build.display.id?={build_desc}") + print(f"ro.build.version.incremental={build_number}") + print(f"ro.build.version.sdk={option.platform_sdk_version}") + print(f"ro.build.version.preview_sdk={option.platform_preview_sdk_version}") + print(f"ro.build.version.preview_sdk_fingerprint={platform_preview_sdk_fingerprint}") + print(f"ro.build.version.codename={option.platform_version_codename}") + print(f"ro.build.version.all_codenames={','.join(option.platform_version_all_codenames)}") + print(f"ro.build.version.known_codenames={option.platform_version_known_codenames}") + print(f"ro.build.version.release={option.platform_version_last_stable}") + print(f"ro.build.version.release_or_codename={option.platform_version}") + print(f"ro.build.version.release_or_preview_display={option.platform_display_version}") + print(f"ro.build.version.security_patch={option.platform_security_patch}") + print(f"ro.build.version.base_os={option.platform_base_os}") + print(f"ro.build.version.min_supported_target_sdk={option.platform_min_supported_target_sdk_version}") + print(f"ro.build.date={date}") + print(f"ro.build.date.utc={date_utc}") + print(f"ro.build.type={option.build_variant}") + print(f"ro.build.user={option.build_username}") + print(f"ro.build.host={build_hostname}") + # TODO: Remove any tag-related optional property declarations once the goals + # from go/arc-android-sigprop-changes have been achieved. + print(f"ro.build.tags?={build_version_tags}") + # ro.build.flavor are used only by the test harness to distinguish builds. + # Only add _asan for a sanitized build if it isn't already a part of the + # flavor (via a dedicated lunch config for example). + print(f"ro.build.flavor={option.build_flavor}") + + # These values are deprecated, use "ro.product.cpu.abilist" + # instead (see below). + print(f"# ro.product.cpu.abi and ro.product.cpu.abi2 are obsolete,") + print(f"# use ro.product.cpu.abilist instead.") + print(f"ro.product.cpu.abi={option.cpu_abis[0]}") + if len(option.cpu_abis) > 1: + print(f"ro.product.cpu.abi2={option.cpu_abis[1]}") + + if option.default_locale: + print(f"ro.product.locale={option.default_locale}") + print(f"ro.wifi.channels={' '.join(option.default_wifi_channels)}") + + print(f"# ro.build.product is obsolete; use ro.product.device") + print(f"ro.build.product={option.device}") + + print(f"# Do not try to parse description or thumbprint") + print(f"ro.build.description?={build_desc}") + if option.build_thumbprint_file: + build_thumbprint = option.build_thumbprint_file.read().strip() + print(f"ro.build.thumbprint={build_thumbprint}") + + print(f"# end build properties") + +if __name__ == "__main__": + main() diff --git a/scripts/gen_build_prop.py b/scripts/gen_build_prop.py index 56ce14fef..9ea56cbd2 100644 --- a/scripts/gen_build_prop.py +++ b/scripts/gen_build_prop.py @@ -279,7 +279,7 @@ def append_additional_system_props(args): config = args.config # Add the product-defined properties to the build properties. - if not config["PropertySplitEnabled"] or not config["VendorImageFileSystemType"]: + if config["PropertySplitEnabled"] or config["VendorImageFileSystemType"]: if "PRODUCT_PROPERTY_OVERRIDES" in config: props += config["PRODUCT_PROPERTY_OVERRIDES"] @@ -311,7 +311,6 @@ def append_additional_system_props(args): props.append("ro.postinstall.fstab.prefix=/system") enable_target_debugging = True - enable_dalvik_lock_contention_logging = True if config["BuildVariant"] == "user" or config["BuildVariant"] == "userdebug": # Target is secure in user builds. props.append("ro.secure=1") @@ -321,12 +320,6 @@ def append_additional_system_props(args): # Disable debugging in plain user builds. props.append("ro.adb.secure=1") enable_target_debugging = False - enable_dalvik_lock_contention_logging = False - else: - # Disable debugging in userdebug builds if PRODUCT_NOT_DEBUGGABLE_IN_USERDEBUG - # is set. - if config["ProductNotDebuggableInUserdebug"]: - enable_target_debugging = False # Disallow mock locations by default for user builds props.append("ro.allow.mock.location=0") @@ -338,11 +331,10 @@ def append_additional_system_props(args): # Allow mock locations by default for non user builds props.append("ro.allow.mock.location=1") - if enable_dalvik_lock_contention_logging: + if enable_target_debugging: # Enable Dalvik lock contention logging. props.append("dalvik.vm.lockprof.threshold=500") - if enable_target_debugging: # Target is more debuggable and adbd is on by default props.append("ro.debuggable=1") else: @@ -424,7 +416,7 @@ def append_additional_vendor_props(args): # This must not be defined for the non-GRF devices. # The values of the GRF properties will be verified by post_process_props.py if config["BoardShippingApiLevel"]: - props.append(f"ro.board.first_api_level={config['BoardShippingApiLevel']}") + props.append(f"ro.board.first_api_level={config['ProductShippingApiLevel']}") # Build system set BOARD_API_LEVEL to show the api level of the vendor API surface. # This must not be altered outside of build system. @@ -483,9 +475,6 @@ def append_additional_product_props(args): if config["NoBionicPageSizeMacro"]: props.append(f"ro.product.build.no_bionic_page_size_macro=true") - # This is a temporary system property that controls the ART module. The plan is - # to remove it by Aug 2025, at which time Mainline updates of the ART module - # will ignore it as well. # If the value is "default", it will be mangled by post_process_props.py. props.append(f"ro.dalvik.vm.enable_uffd_gc={config['EnableUffdGc']}") |