1*333d2b36SAndroid Build Coastguard Worker// Copyright 2016 Google Inc. All rights reserved. 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 Workerpackage cc 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "path/filepath" 19*333d2b36SAndroid Build Coastguard Worker 20*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 21*333d2b36SAndroid Build Coastguard Worker) 22*333d2b36SAndroid Build Coastguard Worker 23*333d2b36SAndroid Build Coastguard Worker// This file handles installing files into their final location 24*333d2b36SAndroid Build Coastguard Worker 25*333d2b36SAndroid Build Coastguard Workertype InstallerProperties struct { 26*333d2b36SAndroid Build Coastguard Worker // install to a subdirectory of the default install path for the module 27*333d2b36SAndroid Build Coastguard Worker Relative_install_path *string `android:"arch_variant"` 28*333d2b36SAndroid Build Coastguard Worker 29*333d2b36SAndroid Build Coastguard Worker // Install output directly in {partition}/, not in any subdir. This is only intended for use by 30*333d2b36SAndroid Build Coastguard Worker // init_first_stage. 31*333d2b36SAndroid Build Coastguard Worker Install_in_root *bool `android:"arch_variant"` 32*333d2b36SAndroid Build Coastguard Worker 33*333d2b36SAndroid Build Coastguard Worker // Install output directly in {partition}/xbin 34*333d2b36SAndroid Build Coastguard Worker Install_in_xbin *bool `android:"arch_variant"` 35*333d2b36SAndroid Build Coastguard Worker} 36*333d2b36SAndroid Build Coastguard Worker 37*333d2b36SAndroid Build Coastguard Workertype installLocation int 38*333d2b36SAndroid Build Coastguard Worker 39*333d2b36SAndroid Build Coastguard Workerconst ( 40*333d2b36SAndroid Build Coastguard Worker InstallInSystem installLocation = 0 41*333d2b36SAndroid Build Coastguard Worker InstallInData = iota 42*333d2b36SAndroid Build Coastguard Worker InstallInSanitizerDir = iota 43*333d2b36SAndroid Build Coastguard Worker) 44*333d2b36SAndroid Build Coastguard Worker 45*333d2b36SAndroid Build Coastguard Workerfunc NewBaseInstaller(dir, dir64 string, location installLocation) *baseInstaller { 46*333d2b36SAndroid Build Coastguard Worker return &baseInstaller{ 47*333d2b36SAndroid Build Coastguard Worker dir: dir, 48*333d2b36SAndroid Build Coastguard Worker dir64: dir64, 49*333d2b36SAndroid Build Coastguard Worker location: location, 50*333d2b36SAndroid Build Coastguard Worker } 51*333d2b36SAndroid Build Coastguard Worker} 52*333d2b36SAndroid Build Coastguard Worker 53*333d2b36SAndroid Build Coastguard Workertype baseInstaller struct { 54*333d2b36SAndroid Build Coastguard Worker Properties InstallerProperties 55*333d2b36SAndroid Build Coastguard Worker 56*333d2b36SAndroid Build Coastguard Worker dir string 57*333d2b36SAndroid Build Coastguard Worker dir64 string 58*333d2b36SAndroid Build Coastguard Worker subDir string 59*333d2b36SAndroid Build Coastguard Worker relative string 60*333d2b36SAndroid Build Coastguard Worker location installLocation 61*333d2b36SAndroid Build Coastguard Worker 62*333d2b36SAndroid Build Coastguard Worker installDeps android.InstallPaths 63*333d2b36SAndroid Build Coastguard Worker 64*333d2b36SAndroid Build Coastguard Worker path android.InstallPath 65*333d2b36SAndroid Build Coastguard Worker} 66*333d2b36SAndroid Build Coastguard Worker 67*333d2b36SAndroid Build Coastguard Workervar _ installer = (*baseInstaller)(nil) 68*333d2b36SAndroid Build Coastguard Worker 69*333d2b36SAndroid Build Coastguard Workerfunc (installer *baseInstaller) installerProps() []interface{} { 70*333d2b36SAndroid Build Coastguard Worker return []interface{}{&installer.Properties} 71*333d2b36SAndroid Build Coastguard Worker} 72*333d2b36SAndroid Build Coastguard Worker 73*333d2b36SAndroid Build Coastguard Workerfunc (installer *baseInstaller) installDir(ctx ModuleContext) android.InstallPath { 74*333d2b36SAndroid Build Coastguard Worker dir := installer.dir 75*333d2b36SAndroid Build Coastguard Worker if ctx.toolchain().Is64Bit() && installer.dir64 != "" { 76*333d2b36SAndroid Build Coastguard Worker dir = installer.dir64 77*333d2b36SAndroid Build Coastguard Worker } 78*333d2b36SAndroid Build Coastguard Worker 79*333d2b36SAndroid Build Coastguard Worker if installer.installInRoot() { 80*333d2b36SAndroid Build Coastguard Worker dir = "" 81*333d2b36SAndroid Build Coastguard Worker } else if installer.installInXbin() { 82*333d2b36SAndroid Build Coastguard Worker dir = "xbin" 83*333d2b36SAndroid Build Coastguard Worker } 84*333d2b36SAndroid Build Coastguard Worker 85*333d2b36SAndroid Build Coastguard Worker if ctx.Target().NativeBridge == android.NativeBridgeEnabled { 86*333d2b36SAndroid Build Coastguard Worker dir = filepath.Join(dir, ctx.Target().NativeBridgeRelativePath) 87*333d2b36SAndroid Build Coastguard Worker } else if !ctx.Host() && ctx.Config().HasMultilibConflict(ctx.Arch().ArchType) { 88*333d2b36SAndroid Build Coastguard Worker dir = filepath.Join(dir, ctx.Arch().ArchType.String()) 89*333d2b36SAndroid Build Coastguard Worker } 90*333d2b36SAndroid Build Coastguard Worker if installer.location == InstallInData && ctx.InVendorOrProduct() { 91*333d2b36SAndroid Build Coastguard Worker if ctx.inProduct() { 92*333d2b36SAndroid Build Coastguard Worker dir = filepath.Join(dir, "product") 93*333d2b36SAndroid Build Coastguard Worker } else { 94*333d2b36SAndroid Build Coastguard Worker dir = filepath.Join(dir, "vendor") 95*333d2b36SAndroid Build Coastguard Worker } 96*333d2b36SAndroid Build Coastguard Worker } 97*333d2b36SAndroid Build Coastguard Worker return android.PathForModuleInstall(ctx, dir, installer.subDir, 98*333d2b36SAndroid Build Coastguard Worker installer.relativeInstallPath(), installer.relative) 99*333d2b36SAndroid Build Coastguard Worker} 100*333d2b36SAndroid Build Coastguard Worker 101*333d2b36SAndroid Build Coastguard Workerfunc (installer *baseInstaller) install(ctx ModuleContext, file android.Path) { 102*333d2b36SAndroid Build Coastguard Worker installer.path = ctx.InstallFile(installer.installDir(ctx), file.Base(), file, installer.installDeps...) 103*333d2b36SAndroid Build Coastguard Worker} 104*333d2b36SAndroid Build Coastguard Worker 105*333d2b36SAndroid Build Coastguard Workerfunc (installer *baseInstaller) installTestData(ctx ModuleContext, data []android.DataPath) { 106*333d2b36SAndroid Build Coastguard Worker installedData := ctx.InstallTestData(installer.installDir(ctx), data) 107*333d2b36SAndroid Build Coastguard Worker installer.installDeps = append(installer.installDeps, installedData...) 108*333d2b36SAndroid Build Coastguard Worker} 109*333d2b36SAndroid Build Coastguard Worker 110*333d2b36SAndroid Build Coastguard Workerfunc (installer *baseInstaller) everInstallable() bool { 111*333d2b36SAndroid Build Coastguard Worker // Most cc modules are installable. 112*333d2b36SAndroid Build Coastguard Worker return true 113*333d2b36SAndroid Build Coastguard Worker} 114*333d2b36SAndroid Build Coastguard Worker 115*333d2b36SAndroid Build Coastguard Workerfunc (installer *baseInstaller) inData() bool { 116*333d2b36SAndroid Build Coastguard Worker return installer.location == InstallInData 117*333d2b36SAndroid Build Coastguard Worker} 118*333d2b36SAndroid Build Coastguard Worker 119*333d2b36SAndroid Build Coastguard Workerfunc (installer *baseInstaller) inSanitizerDir() bool { 120*333d2b36SAndroid Build Coastguard Worker return installer.location == InstallInSanitizerDir 121*333d2b36SAndroid Build Coastguard Worker} 122*333d2b36SAndroid Build Coastguard Worker 123*333d2b36SAndroid Build Coastguard Workerfunc (installer *baseInstaller) hostToolPath() android.OptionalPath { 124*333d2b36SAndroid Build Coastguard Worker return android.OptionalPath{} 125*333d2b36SAndroid Build Coastguard Worker} 126*333d2b36SAndroid Build Coastguard Worker 127*333d2b36SAndroid Build Coastguard Workerfunc (installer *baseInstaller) relativeInstallPath() string { 128*333d2b36SAndroid Build Coastguard Worker return String(installer.Properties.Relative_install_path) 129*333d2b36SAndroid Build Coastguard Worker} 130*333d2b36SAndroid Build Coastguard Worker 131*333d2b36SAndroid Build Coastguard Workerfunc (installer *baseInstaller) makeUninstallable(mod *Module) { 132*333d2b36SAndroid Build Coastguard Worker mod.ModuleBase.MakeUninstallable() 133*333d2b36SAndroid Build Coastguard Worker} 134*333d2b36SAndroid Build Coastguard Worker 135*333d2b36SAndroid Build Coastguard Workerfunc (installer *baseInstaller) installInRoot() bool { 136*333d2b36SAndroid Build Coastguard Worker return Bool(installer.Properties.Install_in_root) 137*333d2b36SAndroid Build Coastguard Worker} 138*333d2b36SAndroid Build Coastguard Worker 139*333d2b36SAndroid Build Coastguard Workerfunc (installer *baseInstaller) installInXbin() bool { 140*333d2b36SAndroid Build Coastguard Worker return Bool(installer.Properties.Install_in_xbin) 141*333d2b36SAndroid Build Coastguard Worker} 142