From f75c415810c29a4edb6ae0364473ad3feb161f79 Mon Sep 17 00:00:00 2001 From: Inseob Kim Date: Mon, 14 Jun 2021 12:03:51 +0900 Subject: [PATCH] Add install_in_root to cc_binary To support init_first_stage, install_in_root property is added to cc_binary. The output is installed to {partition}, rather than {partition}/{mount_point}/bin. Bug: 187196593 Test: build init_first_stage Change-Id: Ibc351645308676ed188f748972eb6312c9cbd64f Merged-In: Ibc351645308676ed188f748972eb6312c9cbd64f --- android/neverallow.go | 10 ++++++++++ cc/cc.go | 5 +++++ cc/installer.go | 13 +++++++++++++ 3 files changed, 28 insertions(+) diff --git a/android/neverallow.go b/android/neverallow.go index 41b399a70..19b58a775 100644 --- a/android/neverallow.go +++ b/android/neverallow.go @@ -55,6 +55,7 @@ func init() { AddNeverAllowRules(createCcSdkVariantRules()...) AddNeverAllowRules(createUncompressDexRules()...) AddNeverAllowRules(createMakefileGoalRules()...) + AddNeverAllowRules(createInitFirstStageRules()...) } // Add a NeverAllow rule to the set of rules to apply. @@ -216,6 +217,15 @@ func createMakefileGoalRules() []Rule { } } +func createInitFirstStageRules() []Rule { + return []Rule{ + NeverAllow(). + Without("name", "init_first_stage"). + With("install_in_root", "true"). + Because("install_in_root is only for init_first_stage."), + } +} + func neverallowMutator(ctx BottomUpMutatorContext) { m, ok := ctx.Module().(Module) if !ok { diff --git a/cc/cc.go b/cc/cc.go index be2c0a39a..89c4fc38e 100644 --- a/cc/cc.go +++ b/cc/cc.go @@ -580,6 +580,7 @@ type installer interface { hostToolPath() android.OptionalPath relativeInstallPath() string makeUninstallable(mod *Module) + installInRoot() bool } // bazelHandler is the interface for a helper object related to deferring to Bazel for @@ -1306,6 +1307,10 @@ func (c *Module) isCfiAssemblySupportEnabled() bool { Bool(c.sanitize.Properties.Sanitize.Config.Cfi_assembly_support) } +func (c *Module) InstallInRoot() bool { + return c.installer != nil && c.installer.installInRoot() +} + type baseModuleContext struct { android.BaseModuleContext moduleContextImpl diff --git a/cc/installer.go b/cc/installer.go index e551c63e2..f95b49346 100644 --- a/cc/installer.go +++ b/cc/installer.go @@ -25,6 +25,10 @@ import ( type InstallerProperties struct { // install to a subdirectory of the default install path for the module Relative_install_path *string `android:"arch_variant"` + + // Install output directly in {partition}/, not in any subdir. This is only intended for use by + // init_first_stage. + Install_in_root *bool `android:"arch_variant"` } type installLocation int @@ -66,6 +70,11 @@ func (installer *baseInstaller) installDir(ctx ModuleContext) android.InstallPat if ctx.toolchain().Is64Bit() && installer.dir64 != "" { dir = installer.dir64 } + + if installer.installInRoot() { + dir = "" + } + if ctx.Target().NativeBridge == android.NativeBridgeEnabled { dir = filepath.Join(dir, ctx.Target().NativeBridgeRelativePath) } else if !ctx.Host() && ctx.Config().HasMultilibConflict(ctx.Arch().ArchType) { @@ -110,3 +119,7 @@ func (installer *baseInstaller) relativeInstallPath() string { func (installer *baseInstaller) makeUninstallable(mod *Module) { mod.ModuleBase.MakeUninstallable() } + +func (installer *baseInstaller) installInRoot() bool { + return Bool(installer.Properties.Install_in_root) +}