diff options
Diffstat (limited to 'android/makevars.go')
| -rw-r--r-- | android/makevars.go | 63 |
1 files changed, 54 insertions, 9 deletions
diff --git a/android/makevars.go b/android/makevars.go index 0800190c3..f92f4581e 100644 --- a/android/makevars.go +++ b/android/makevars.go @@ -16,9 +16,11 @@ package android import ( "bytes" + "cmp" "fmt" "path/filepath" "runtime" + "slices" "sort" "strings" @@ -92,10 +94,11 @@ type MakeVarsContext interface { ModuleDir(module blueprint.Module) string ModuleSubDir(module blueprint.Module) string ModuleType(module blueprint.Module) string - ModuleProvider(module blueprint.Module, key blueprint.ProviderKey) interface{} + moduleProvider(module blueprint.Module, key blueprint.AnyProviderKey) (any, bool) BlueprintFile(module blueprint.Module) string ModuleErrorf(module blueprint.Module, format string, args ...interface{}) + OtherModulePropertyErrorf(module Module, property, format string, args ...interface{}) Errorf(format string, args ...interface{}) VisitAllModules(visit func(Module)) @@ -242,6 +245,8 @@ func (s *makeVarsSingleton) GenerateBuildActions(ctx SingletonContext) { var dists []dist var phonies []phony var katiInstalls []katiInstall + var katiInitRcInstalls []katiInstall + var katiVintfManifestInstalls []katiInstall var katiSymlinks []katiInstall providers := append([]makeVarsProvider(nil), makeVarsInitProviders...) @@ -261,7 +266,7 @@ func (s *makeVarsSingleton) GenerateBuildActions(ctx SingletonContext) { } ctx.VisitAllModules(func(m Module) { - if provider, ok := m.(ModuleMakeVarsProvider); ok && m.Enabled() { + if provider, ok := m.(ModuleMakeVarsProvider); ok && m.Enabled(ctx) { mctx := &makeVarsContext{ SingletonContext: ctx, } @@ -275,10 +280,33 @@ func (s *makeVarsSingleton) GenerateBuildActions(ctx SingletonContext) { if m.ExportedToMake() { katiInstalls = append(katiInstalls, m.base().katiInstalls...) + katiInitRcInstalls = append(katiInitRcInstalls, m.base().katiInitRcInstalls...) + katiVintfManifestInstalls = append(katiVintfManifestInstalls, m.base().katiVintfInstalls...) katiSymlinks = append(katiSymlinks, m.base().katiSymlinks...) } }) + compareKatiInstalls := func(a, b katiInstall) int { + aTo, bTo := a.to.String(), b.to.String() + if cmpTo := cmp.Compare(aTo, bTo); cmpTo != 0 { + return cmpTo + } + + aFrom, bFrom := a.from.String(), b.from.String() + return cmp.Compare(aFrom, bFrom) + } + + slices.SortFunc(katiInitRcInstalls, compareKatiInstalls) + katiInitRcInstalls = slices.CompactFunc(katiInitRcInstalls, func(a, b katiInstall) bool { + return compareKatiInstalls(a, b) == 0 + }) + katiInstalls = append(katiInstalls, katiInitRcInstalls...) + + slices.SortFunc(katiVintfManifestInstalls, compareKatiInstalls) + katiVintfManifestInstalls = slices.CompactFunc(katiVintfManifestInstalls, func(a, b katiInstall) bool { + return compareKatiInstalls(a, b) == 0 + }) + if ctx.Failed() { return } @@ -316,7 +344,7 @@ func (s *makeVarsSingleton) GenerateBuildActions(ctx SingletonContext) { ctx.Errorf(err.Error()) } - installsBytes := s.writeInstalls(katiInstalls, katiSymlinks) + installsBytes := s.writeInstalls(katiInstalls, katiSymlinks, katiVintfManifestInstalls) if err := pathtools.WriteFileIfChanged(installsFile, installsBytes, 0666); err != nil { ctx.Errorf(err.Error()) } @@ -438,14 +466,14 @@ func (s *makeVarsSingleton) writeLate(phonies []phony, dists []dist) []byte { // writeInstalls writes the list of install rules generated by Soong to a makefile. The rules // are exported to Make instead of written directly to the ninja file so that main.mk can add // the dependencies from the `required` property that are hard to resolve in Soong. -func (s *makeVarsSingleton) writeInstalls(installs, symlinks []katiInstall) []byte { +func (s *makeVarsSingleton) writeInstalls(installs, symlinks, katiVintfManifestInstalls []katiInstall) []byte { buf := &bytes.Buffer{} fmt.Fprint(buf, `# Autogenerated file # Values written by Soong to generate install rules that can be amended by Kati. - +EXTRA_INSTALL_ZIPS := `) preserveSymlinksFlag := "-d" @@ -479,16 +507,20 @@ func (s *makeVarsSingleton) writeInstalls(installs, symlinks []katiInstall) []by if extraFiles := install.extraFiles; extraFiles != nil { fmt.Fprintf(buf, "\t( unzip -qDD -d '%s' '%s' 2>&1 | grep -v \"zipfile is empty\"; exit $${PIPESTATUS[0]} ) || \\\n", extraFiles.dir.String(), extraFiles.zip.String()) fmt.Fprintf(buf, "\t ( code=$$?; if [ $$code -ne 0 -a $$code -ne 1 ]; then exit $$code; fi )\n") + fmt.Fprintf(buf, "EXTRA_INSTALL_ZIPS += %s:%s:%s\n", install.to.String(), extraFiles.dir.String(), extraFiles.zip.String()) } + fmt.Fprintln(buf) } + fmt.Fprintf(buf, ".KATI_READONLY := EXTRA_INSTALL_ZIPS\n") + fmt.Fprintf(buf, "$(KATI_visibility_prefix EXTRA_INSTALL_ZIPS,build/make/core/Makefile)\n") for _, symlink := range symlinks { fmt.Fprintf(buf, "%s:", symlink.to.String()) if symlink.from != nil { - // The symlink doesn't need updating when the target is modified, but we sometimes - // have a dependency on a symlink to a binary instead of to the binary directly, and - // the mtime of the symlink must be updated when the binary is modified, so use a + // The katiVintfManifestInstall doesn't need updating when the target is modified, but we sometimes + // have a dependency on a katiVintfManifestInstall to a binary instead of to the binary directly, and + // the mtime of the katiVintfManifestInstall must be updated when the binary is modified, so use a // normal dependency here instead of an order-only dependency. fmt.Fprintf(buf, " %s", symlink.from.String()) } @@ -507,7 +539,7 @@ func (s *makeVarsSingleton) writeInstalls(installs, symlinks []katiInstall) []by if symlink.from != nil { rel, err := filepath.Rel(filepath.Dir(symlink.to.String()), symlink.from.String()) if err != nil { - panic(fmt.Errorf("failed to find relative path for symlink from %q to %q: %w", + panic(fmt.Errorf("failed to find relative path for katiVintfManifestInstall from %q to %q: %w", symlink.from.String(), symlink.to.String(), err)) } fromStr = rel @@ -521,6 +553,19 @@ func (s *makeVarsSingleton) writeInstalls(installs, symlinks []katiInstall) []by fmt.Fprintln(buf) } + for _, install := range katiVintfManifestInstalls { + // Write a rule for each vintf install request that calls the copy-vintf-manifest-chedk make function. + fmt.Fprintf(buf, "$(eval $(call copy-vintf-manifest-checked, %s, %s))\n", install.from.String(), install.to.String()) + + if len(install.implicitDeps) > 0 { + panic(fmt.Errorf("unsupported implicitDeps %q in vintf install rule %q", install.implicitDeps, install.to)) + } + if len(install.orderOnlyDeps) > 0 { + panic(fmt.Errorf("unsupported orderOnlyDeps %q in vintf install rule %q", install.orderOnlyDeps, install.to)) + } + + fmt.Fprintln(buf) + } return buf.Bytes() } |