diff options
| -rw-r--r-- | android/buildinfo_prop.go | 29 | ||||
| -rw-r--r-- | android/config.go | 9 | ||||
| -rw-r--r-- | android/gen_notice.go | 11 | ||||
| -rw-r--r-- | android/module_context.go | 3 | ||||
| -rw-r--r-- | android/register.go | 1 | ||||
| -rw-r--r-- | android/test_config.go | 2 | ||||
| -rw-r--r-- | android/variable.go | 7 | ||||
| -rw-r--r-- | apex/bootclasspath_fragment_test.go | 26 | ||||
| -rw-r--r-- | cmd/release_config/release_config_lib/release_configs.go | 36 | ||||
| -rw-r--r-- | cmd/soong_build/main.go | 1 | ||||
| -rw-r--r-- | java/bootclasspath_fragment.go | 14 | ||||
| -rw-r--r-- | ui/build/config.go | 8 | ||||
| -rw-r--r-- | ui/build/dumpvars.go | 2 | ||||
| -rw-r--r-- | ui/build/soong.go | 1 | ||||
| -rw-r--r-- | ui/build/test_build.go | 7 |
15 files changed, 90 insertions, 67 deletions
diff --git a/android/buildinfo_prop.go b/android/buildinfo_prop.go index 8288fc555..083f3efcb 100644 --- a/android/buildinfo_prop.go +++ b/android/buildinfo_prop.go @@ -23,7 +23,7 @@ import ( func init() { ctx := InitRegistrationContext - ctx.RegisterParallelSingletonModuleType("buildinfo_prop", buildinfoPropFactory) + ctx.RegisterModuleType("buildinfo_prop", buildinfoPropFactory) } type buildinfoPropProperties struct { @@ -32,7 +32,7 @@ type buildinfoPropProperties struct { } type buildinfoPropModule struct { - SingletonModuleBase + ModuleBase properties buildinfoPropProperties @@ -88,6 +88,10 @@ func shouldAddBuildThumbprint(config Config) bool { } 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 if !ctx.Config().KatiEnabled() { WriteFileRule(ctx, p.outputFilePath, "# no buildinfo.prop if kati is disabled") @@ -111,10 +115,11 @@ func (p *buildinfoPropModule) GenerateAndroidBuildActions(ctx ModuleContext) { cmd.FlagWithArg("--build-id=", config.BuildId()) cmd.FlagWithArg("--build-keys=", config.BuildKeys()) - // shouldn't depend on BuildNumberFile and BuildThumbprintFile to prevent from rebuilding - // on every incremental build. - cmd.FlagWithArg("--build-number-file=", config.BuildNumberFile(ctx).String()) + // 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)) 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()) } @@ -123,8 +128,10 @@ func (p *buildinfoPropModule) GenerateAndroidBuildActions(ctx ModuleContext) { cmd.FlagWithArg("--build-variant=", buildVariant) cmd.FlagForEachArg("--cpu-abis=", config.DeviceAbi()) - // shouldn't depend on BUILD_DATETIME_FILE to prevent from rebuilding on every incremental - // build. + // 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")) if len(config.ProductLocales()) > 0 { @@ -163,12 +170,8 @@ func (p *buildinfoPropModule) GenerateAndroidBuildActions(ctx ModuleContext) { ctx.InstallFile(p.installPath, p.Name(), p.outputFilePath) } -func (f *buildinfoPropModule) GenerateSingletonBuildActions(ctx SingletonContext) { - // does nothing; buildinfo_prop is a singeton because two buildinfo modules don't make sense. -} - func (p *buildinfoPropModule) AndroidMkEntries() []AndroidMkEntries { - return []AndroidMkEntries{AndroidMkEntries{ + return []AndroidMkEntries{{ Class: "ETC", OutputFile: OptionalPathForPath(p.outputFilePath), ExtraEntries: []AndroidMkExtraEntriesFunc{ @@ -184,7 +187,7 @@ func (p *buildinfoPropModule) AndroidMkEntries() []AndroidMkEntries { // 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() SingletonModule { +func buildinfoPropFactory() Module { module := &buildinfoPropModule{} module.AddProperties(&module.properties) InitAndroidModule(module) diff --git a/android/config.go b/android/config.go index 5a6d40f31..a18cb8be8 100644 --- a/android/config.go +++ b/android/config.go @@ -370,6 +370,7 @@ func loadFromConfigFile(configurable *ProductVariables, filename string) error { } else { // Make a decoder for it jsonDecoder := json.NewDecoder(configFileReader) + jsonDecoder.DisallowUnknownFields() err = jsonDecoder.Decode(configurable) if err != nil { return fmt.Errorf("config file: %s did not parse correctly: %s", filename, err.Error()) @@ -1333,10 +1334,6 @@ func (c *config) SourceRootDirs() []string { return c.productVariables.SourceRootDirs } -func (c *config) IncludeTags() []string { - return c.productVariables.IncludeTags -} - func (c *config) HostStaticBinaries() bool { return Bool(c.productVariables.HostStaticBinaries) } @@ -1912,10 +1909,10 @@ func (c *deviceConfig) HostFakeSnapshotEnabled() bool { } func (c *deviceConfig) ShippingApiLevel() ApiLevel { - if c.config.productVariables.ShippingApiLevel == nil { + if c.config.productVariables.Shipping_api_level == nil { return NoneApiLevel } - apiLevel, _ := strconv.Atoi(*c.config.productVariables.ShippingApiLevel) + apiLevel, _ := strconv.Atoi(*c.config.productVariables.Shipping_api_level) return uncheckedFinalApiLevel(apiLevel) } diff --git a/android/gen_notice.go b/android/gen_notice.go index 6815f6467..9adde9e9b 100644 --- a/android/gen_notice.go +++ b/android/gen_notice.go @@ -176,6 +176,7 @@ func (m *genNoticeModule) GenerateAndroidBuildActions(ctx ModuleContext) { } out := m.getStem() + m.getSuffix() m.output = PathForModuleOut(ctx, out).OutputPath + ctx.SetOutputFiles(Paths{m.output}, "") } func GenNoticeFactory() Module { @@ -193,16 +194,6 @@ func GenNoticeFactory() Module { return module } -var _ OutputFileProducer = (*genNoticeModule)(nil) - -// Implements OutputFileProducer -func (m *genNoticeModule) OutputFiles(tag string) (Paths, error) { - if tag == "" { - return Paths{m.output}, nil - } - return nil, fmt.Errorf("unrecognized tag %q", tag) -} - var _ AndroidMkEntriesProvider = (*genNoticeModule)(nil) // Implements AndroidMkEntriesProvider diff --git a/android/module_context.go b/android/module_context.go index bc089114f..591e270f0 100644 --- a/android/module_context.go +++ b/android/module_context.go @@ -718,6 +718,9 @@ func (m *moduleContext) SetOutputFiles(outputFiles Paths, tag string) { } m.module.base().outputFiles.DefaultOutputFiles = outputFiles } else { + if m.module.base().outputFiles.TaggedOutputFiles == nil { + m.module.base().outputFiles.TaggedOutputFiles = make(map[string]Paths) + } if _, exists := m.module.base().outputFiles.TaggedOutputFiles[tag]; exists { m.ModuleErrorf("Module %s OutputFiles at tag %s cannot be overwritten", m.ModuleName(), tag) } else { diff --git a/android/register.go b/android/register.go index aeb3b4c1b..eb6a35e05 100644 --- a/android/register.go +++ b/android/register.go @@ -156,7 +156,6 @@ type Context struct { func NewContext(config Config) *Context { ctx := &Context{blueprint.NewContext(), config} ctx.SetSrcDir(absSrcDir) - ctx.AddIncludeTags(config.IncludeTags()...) ctx.AddSourceRootDirs(config.SourceRootDirs()...) return ctx } diff --git a/android/test_config.go b/android/test_config.go index a15343adb..f2510387f 100644 --- a/android/test_config.go +++ b/android/test_config.go @@ -50,7 +50,7 @@ func TestConfig(buildDir string, env map[string]string, bp string, fs map[string AAPTCharacteristics: stringPtr("nosdcard"), AAPTPrebuiltDPI: []string{"xhdpi", "xxhdpi"}, UncompressPrivAppDex: boolPtr(true), - ShippingApiLevel: stringPtr("30"), + Shipping_api_level: stringPtr("30"), }, outDir: buildDir, diff --git a/android/variable.go b/android/variable.go index 9a9556314..16338166b 100644 --- a/android/variable.go +++ b/android/variable.go @@ -55,6 +55,10 @@ type variableProperties struct { Base_dir *string } + Shipping_api_level struct { + Cflags []string + } + // unbundled_build is a catch-all property to annotate modules that don't build in one or // more unbundled branches, usually due to dependencies missing from the manifest. Unbundled_build struct { @@ -440,7 +444,7 @@ type ProductVariables struct { PrebuiltHiddenApiDir *string `json:",omitempty"` - ShippingApiLevel *string `json:",omitempty"` + Shipping_api_level *string `json:",omitempty"` BuildBrokenPluginValidation []string `json:",omitempty"` BuildBrokenClangAsFlags bool `json:",omitempty"` @@ -472,7 +476,6 @@ type ProductVariables struct { IgnorePrefer32OnDevice bool `json:",omitempty"` - IncludeTags []string `json:",omitempty"` SourceRootDirs []string `json:",omitempty"` AfdoProfiles []string `json:",omitempty"` diff --git a/apex/bootclasspath_fragment_test.go b/apex/bootclasspath_fragment_test.go index 778c20a56..af9123e70 100644 --- a/apex/bootclasspath_fragment_test.go +++ b/apex/bootclasspath_fragment_test.go @@ -197,6 +197,12 @@ func TestBootclasspathFragmentInArtApex(t *testing.T) { updatable: false, } + override_apex { + name: "com.mycompany.android.art", + base: "com.android.art", + min_sdk_version: "33", // mycompany overrides the min_sdk_version + } + apex_key { name: "com.android.art.key", public_key: "testkey.avbpubkey", @@ -325,6 +331,26 @@ func TestBootclasspathFragmentInArtApex(t *testing.T) { checkCopiesToPredefinedLocationForArt(t, result.Config, module, "bar", "foo") }) + t.Run("boot image files from source of override apex", func(t *testing.T) { + result := android.GroupFixturePreparers( + commonPreparer, + + // Configure some libraries in the art bootclasspath_fragment that match the source + // bootclasspath_fragment's contents property. + java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"), + dexpreopt.FixtureSetTestOnlyArtBootImageJars("com.android.art:foo", "com.android.art:bar"), + addSource("foo", "bar"), + java.FixtureSetBootImageInstallDirOnDevice("art", "apex/com.android.art/javalib"), + ).RunTest(t) + + ensureExactContents(t, result.TestContext, "com.android.art", "android_common_com.mycompany.android.art_com.mycompany.android.art", []string{ + "etc/boot-image.prof", + "etc/classpaths/bootclasspath.pb", + "javalib/bar.jar", + "javalib/foo.jar", + }) + }) + t.Run("generate boot image profile even if dexpreopt is disabled", func(t *testing.T) { result := android.GroupFixturePreparers( commonPreparer, diff --git a/cmd/release_config/release_config_lib/release_configs.go b/cmd/release_config/release_config_lib/release_configs.go index 02eedc822..052cde898 100644 --- a/cmd/release_config/release_config_lib/release_configs.go +++ b/cmd/release_config/release_config_lib/release_configs.go @@ -87,16 +87,15 @@ func (configs *ReleaseConfigs) WriteInheritanceGraph(outFile string) error { data := []string{} usedAliases := make(map[string]bool) priorStages := make(map[string][]string) - rankedStageNames := make(map[string]bool) for _, config := range configs.ReleaseConfigs { + if config.Name == "root" { + continue + } var fillColor string inherits := []string{} for _, inherit := range config.InheritNames { if inherit == "root" { - // Only show "root" if we have no other inheritance. - if len(config.InheritNames) > 1 { - continue - } + continue } data = append(data, fmt.Sprintf(`"%s" -> "%s"`, config.Name, inherit)) inherits = append(inherits, inherit) @@ -113,14 +112,9 @@ func (configs *ReleaseConfigs) WriteInheritanceGraph(outFile string) error { } // Add links for all of the advancement progressions. for priorStage := range config.PriorStagesMap { - stageName := config.Name - if len(config.OtherNames) > 0 { - stageName = config.OtherNames[0] - } data = append(data, fmt.Sprintf(`"%s" -> "%s" [ style=dashed color="#81c995" ]`, - priorStage, stageName)) - priorStages[stageName] = append(priorStages[stageName], priorStage) - rankedStageNames[stageName] = true + priorStage, config.Name)) + priorStages[config.Name] = append(priorStages[config.Name], priorStage) } label := config.Name if len(inherits) > 0 { @@ -129,16 +123,24 @@ func (configs *ReleaseConfigs) WriteInheritanceGraph(outFile string) error { if len(config.OtherNames) > 0 { label += "\\nother names: " + strings.Join(config.OtherNames, " ") } - // The active release config has a light blue fill. - if config.Name == *configs.Artifact.ReleaseConfig.Name { + switch config.Name { + case *configs.Artifact.ReleaseConfig.Name: + // The active release config has a light blue fill. fillColor = `fillcolor="#d2e3fc" ` + case "trunk", "trunk_staging": + // Certain workflow stages have a light green fill. + fillColor = `fillcolor="#ceead6" ` + default: + // Look for "next" and "*_next", make them light green as well. + for _, n := range config.OtherNames { + if n == "next" || strings.HasSuffix(n, "_next") { + fillColor = `fillcolor="#ceead6" ` + } + } } data = append(data, fmt.Sprintf(`"%s" [ label="%s" %s]`, config.Name, label, fillColor)) } - if len(rankedStageNames) > 0 { - data = append(data, fmt.Sprintf("subgraph {rank=same %s}", strings.Join(SortedMapKeys(rankedStageNames), " "))) - } slices.Sort(data) data = append([]string{ "digraph {", diff --git a/cmd/soong_build/main.go b/cmd/soong_build/main.go index 4490dd2af..3dac8bdae 100644 --- a/cmd/soong_build/main.go +++ b/cmd/soong_build/main.go @@ -98,7 +98,6 @@ func newContext(configuration android.Config) *android.Context { ctx := android.NewContext(configuration) ctx.SetNameInterface(newNameResolver(configuration)) ctx.SetAllowMissingDependencies(configuration.AllowMissingDependencies()) - ctx.AddIncludeTags(configuration.IncludeTags()...) ctx.AddSourceRootDirs(configuration.SourceRootDirs()...) return ctx } diff --git a/java/bootclasspath_fragment.go b/java/bootclasspath_fragment.go index 4d3d794d8..16209b72e 100644 --- a/java/bootclasspath_fragment.go +++ b/java/bootclasspath_fragment.go @@ -524,10 +524,16 @@ func (b *BootclasspathFragmentModule) getProfileProviderApex(ctx android.BaseMod } // Bootclasspath fragment modules that are for the platform do not produce boot related files. - apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) - for _, apex := range apexInfo.InApexVariants { - if isProfileProviderApex(ctx, apex) { - return apex + apexInfos, _ := android.ModuleProvider(ctx, android.AllApexInfoProvider) + if apexInfos == nil { + return "" + } + + for _, apexInfo := range apexInfos.ApexInfos { + for _, apex := range apexInfo.InApexVariants { + if isProfileProviderApex(ctx, apex) { + return apex + } } } diff --git a/ui/build/config.go b/ui/build/config.go index 7426a78ee..feded1c85 100644 --- a/ui/build/config.go +++ b/ui/build/config.go @@ -1164,14 +1164,6 @@ func (c *configImpl) SetSourceRootDirs(i []string) { c.sourceRootDirs = i } -func (c *configImpl) GetIncludeTags() []string { - return c.includeTags -} - -func (c *configImpl) SetIncludeTags(i []string) { - c.includeTags = i -} - func (c *configImpl) GetLogsPrefix() string { return c.logsPrefix } diff --git a/ui/build/dumpvars.go b/ui/build/dumpvars.go index e17bd5402..eba86a0fc 100644 --- a/ui/build/dumpvars.go +++ b/ui/build/dumpvars.go @@ -147,7 +147,6 @@ func dumpMakeVars(ctx Context, config Config, goals, vars []string, write_soong_ var BannerVars = []string{ "PLATFORM_VERSION_CODENAME", "PLATFORM_VERSION", - "PRODUCT_INCLUDE_TAGS", "PRODUCT_SOURCE_ROOT_DIRS", "TARGET_PRODUCT", "TARGET_BUILD_VARIANT", @@ -301,6 +300,5 @@ func runMakeProductConfig(ctx Context, config Config) { config.SetBuildBrokenDupRules(makeVars["BUILD_BROKEN_DUP_RULES"] == "true") config.SetBuildBrokenUsesNetwork(makeVars["BUILD_BROKEN_USES_NETWORK"] == "true") config.SetBuildBrokenNinjaUsesEnvVars(strings.Fields(makeVars["BUILD_BROKEN_NINJA_USES_ENV_VARS"])) - config.SetIncludeTags(strings.Fields(makeVars["PRODUCT_INCLUDE_TAGS"])) config.SetSourceRootDirs(strings.Fields(makeVars["PRODUCT_SOURCE_ROOT_DIRS"])) } diff --git a/ui/build/soong.go b/ui/build/soong.go index 9955b1fdc..2f3150d03 100644 --- a/ui/build/soong.go +++ b/ui/build/soong.go @@ -401,7 +401,6 @@ func bootstrapBlueprint(ctx Context, config Config) { } blueprintCtx := blueprint.NewContext() - blueprintCtx.AddIncludeTags(config.GetIncludeTags()...) blueprintCtx.AddSourceRootDirs(config.GetSourceRootDirs()...) blueprintCtx.SetIgnoreUnknownModuleTypes(true) blueprintConfig := BlueprintConfig{ diff --git a/ui/build/test_build.go b/ui/build/test_build.go index 309513919..24ad08284 100644 --- a/ui/build/test_build.go +++ b/ui/build/test_build.go @@ -79,6 +79,10 @@ func testForDanglingRules(ctx Context, config Config) { // bpglob is built explicitly using Microfactory bpglob := filepath.Join(config.SoongOutDir(), "bpglob") + // release-config files are generated from the initial lunch or Kati phase + // before running soong and ninja. + releaseConfigDir := filepath.Join(outDir, "soong", "release-config") + danglingRules := make(map[string]bool) scanner := bufio.NewScanner(stdout) @@ -93,7 +97,8 @@ func testForDanglingRules(ctx Context, config Config) { line == variablesFilePath || line == dexpreoptConfigFilePath || line == buildDatetimeFilePath || - line == bpglob { + line == bpglob || + strings.HasPrefix(line, releaseConfigDir) { // Leaf node is in one of Soong's bootstrap directories, which do not have // full build rules in the primary build.ninja file. continue |