Clean up installing

Use the config to get paths to install to, allow installing
a file to a different file name than the intermediate file,
and allow dependencies between installed files.

Change-Id: I37ac32d2fa1458150b6d54f6ec9cdac70a0259e8
diff --git a/common/module.go b/common/module.go
index ab90ade..a834384 100644
--- a/common/module.go
+++ b/common/module.go
@@ -25,6 +25,8 @@
 	SrcDir() string
 	Getenv(string) string
 	EnvDeps() map[string]string
+	DeviceOut() string
+	HostOut() string
 }
 
 var (
@@ -52,7 +54,8 @@
 	blueprint.ModuleContext
 	androidBaseContext
 
-	InstallFile(installPath, srcPath string)
+	InstallFile(installPath, srcPath string, deps ...string) string
+	InstallFileName(installPath, name, srcPath string, deps ...string) string
 	CheckbuildFile(srcPath string)
 }
 
@@ -377,25 +380,34 @@
 	return a.debug
 }
 
-func (a *androidModuleContext) InstallFile(installPath, srcPath string) {
+func (a *androidModuleContext) InstallFileName(installPath, name, srcPath string,
+	deps ...string) string {
+
+	config := a.Config().(Config)
 	var fullInstallPath string
 	if a.arch.HostOrDevice.Device() {
 		// TODO: replace unset with a device name once we have device targeting
-		fullInstallPath = filepath.Join("out/target/product/unset/system", installPath,
-			filepath.Base(srcPath))
+		fullInstallPath = filepath.Join(config.DeviceOut(), "system",
+			installPath, name)
 	} else {
-		// TODO: replace unset with a host name
-		fullInstallPath = filepath.Join("out/host/unset/", installPath, filepath.Base(srcPath))
+		fullInstallPath = filepath.Join(config.HostOut(), installPath, name)
 	}
 
+	deps = append(deps, a.installDeps...)
+
 	a.ModuleContext.Build(pctx, blueprint.BuildParams{
 		Rule:      Cp,
 		Outputs:   []string{fullInstallPath},
 		Inputs:    []string{srcPath},
-		OrderOnly: a.installDeps,
+		OrderOnly: deps,
 	})
 
 	a.installFiles = append(a.installFiles, fullInstallPath)
+	return fullInstallPath
+}
+
+func (a *androidModuleContext) InstallFile(installPath, srcPath string, deps ...string) string {
+	return a.InstallFileName(installPath, filepath.Base(srcPath), srcPath, deps...)
 }
 
 func (a *androidModuleContext) CheckbuildFile(srcPath string) {
diff --git a/config/config.go b/config/config.go
index 6cb61e4..4e9cbf1 100644
--- a/config/config.go
+++ b/config/config.go
@@ -19,6 +19,7 @@
 	"encoding/json"
 	"fmt"
 	"os"
+	"path/filepath"
 	"runtime"
 )
 
@@ -168,3 +169,29 @@
 func (c *Config) EnvDeps() map[string]string {
 	return c.envDeps
 }
+
+// DeviceName returns the name of the current device target
+// TODO: take an AndroidModuleContext to select the device name for multi-device builds
+func (c *Config) DeviceName() string {
+	return "unset"
+}
+
+// DeviceOut returns the path to out directory for device targets
+func (c *Config) DeviceOut() string {
+	return filepath.Join("target/product", c.DeviceName())
+}
+
+// HostOut returns the path to out directory for host targets
+func (c *Config) HostOut() string {
+	return filepath.Join("host", c.PrebuiltOS())
+}
+
+// HostBin returns the path to bin directory for host targets
+func (c *Config) HostBin() string {
+	return filepath.Join(c.HostOut(), "bin")
+}
+
+// HostBinTool returns the path to a host tool in the bin directory for host targets
+func (c *Config) HostBinTool(tool string) (string, error) {
+	return filepath.Join(c.HostBin(), tool), nil
+}