Home | History | Annotate | Download | only in cc
      1 // Copyright 2016 Google Inc. All rights reserved.
      2 //
      3 // Licensed under the Apache License, Version 2.0 (the "License");
      4 // you may not use this file except in compliance with the License.
      5 // You may obtain a copy of the License at
      6 //
      7 //     http://www.apache.org/licenses/LICENSE-2.0
      8 //
      9 // Unless required by applicable law or agreed to in writing, software
     10 // distributed under the License is distributed on an "AS IS" BASIS,
     11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 // See the License for the specific language governing permissions and
     13 // limitations under the License.
     14 
     15 package cc
     16 
     17 import (
     18 	"path/filepath"
     19 
     20 	"android/soong/android"
     21 )
     22 
     23 // This file handles installing files into their final location
     24 
     25 type InstallerProperties struct {
     26 	// install to a subdirectory of the default install path for the module
     27 	Relative_install_path *string `android:"arch_variant"`
     28 }
     29 
     30 type installLocation int
     31 
     32 const (
     33 	InstallInSystem       installLocation = 0
     34 	InstallInData                         = iota
     35 	InstallInSanitizerDir                 = iota
     36 )
     37 
     38 func NewBaseInstaller(dir, dir64 string, location installLocation) *baseInstaller {
     39 	return &baseInstaller{
     40 		dir:      dir,
     41 		dir64:    dir64,
     42 		location: location,
     43 	}
     44 }
     45 
     46 type baseInstaller struct {
     47 	Properties InstallerProperties
     48 
     49 	dir      string
     50 	dir64    string
     51 	subDir   string
     52 	relative string
     53 	location installLocation
     54 
     55 	path android.OutputPath
     56 }
     57 
     58 var _ installer = (*baseInstaller)(nil)
     59 
     60 func (installer *baseInstaller) installerProps() []interface{} {
     61 	return []interface{}{&installer.Properties}
     62 }
     63 
     64 func (installer *baseInstaller) installDir(ctx ModuleContext) android.OutputPath {
     65 	dir := installer.dir
     66 	if ctx.toolchain().Is64Bit() && installer.dir64 != "" {
     67 		dir = installer.dir64
     68 	}
     69 	if !ctx.Host() && !ctx.Arch().Native {
     70 		dir = filepath.Join(dir, ctx.Arch().ArchType.String())
     71 	}
     72 	if installer.location == InstallInData && ctx.useVndk() {
     73 		dir = filepath.Join(dir, "vendor")
     74 	}
     75 	return android.PathForModuleInstall(ctx, dir, installer.subDir,
     76 		String(installer.Properties.Relative_install_path), installer.relative)
     77 }
     78 
     79 func (installer *baseInstaller) install(ctx ModuleContext, file android.Path) {
     80 	installer.path = ctx.InstallFile(installer.installDir(ctx), file.Base(), file)
     81 }
     82 
     83 func (installer *baseInstaller) inData() bool {
     84 	return installer.location == InstallInData
     85 }
     86 
     87 func (installer *baseInstaller) inSanitizerDir() bool {
     88 	return installer.location == InstallInSanitizerDir
     89 }
     90 
     91 func (installer *baseInstaller) hostToolPath() android.OptionalPath {
     92 	return android.OptionalPath{}
     93 }
     94