InstallPath keeps its partition dir
This change introduces the concept of partition dir for InstallPaths.
It's the path to the partition where the InstallPath is rooted at. For
example, it's out/soong/target/product/<device>/<partitoon> for paths
created for device modules. For host modules, it is defined as
out/soong/host/<host_os>-<host_arch>.
The partition dir is obtained using the new PartitionDir() function.
Another change is that a freshly created InstallPath (usually via
PathForModuleInstall) is the result of joining PartitionDir() and the
remaining path elements. For example, PathForModuleInstall(ctx, "foo",
"bar").Rel() now returns "foo/bar". Previously, that call returned the
relative path from config.buildDir() ("out/soong"). This change is in
line with the behavior of other path-creating functions like
PathForModuleSrc where Rel() returns the path relative to the
contextually determined path like the module source directory.
Notice that the Join() call to InstallPath doesn't change
PartitionDir(), while does change the result of Rel().
p := PathForModuleInstall(ctx, "foo", "bar")
p.PartitionDir() is out/soong/host/linux-x86
p.Rel() is foo/bar
q := p.Join(ctx, "baz")
q.PartitionDir() is still out/soong/host/linux-x86
q.Rel() now returns baz
Bug: N/A
Test: m nothing
Change-Id: I916bb1c782a4bfe0fbd4854e349cd2a2a42f56b6
diff --git a/android/paths.go b/android/paths.go
index 3825d45..842aaac 100644
--- a/android/paths.go
+++ b/android/paths.go
@@ -1236,7 +1236,12 @@
type InstallPath struct {
basePath
- baseDir string // "../" for Make paths to convert "out/soong" to "out", "" for Soong paths
+ // partitionDir is the part of the InstallPath that is automatically determined according to the context.
+ // For example, it is host/<os>-<arch> for host modules, and target/product/<device>/<partition> for device modules.
+ partitionDir string
+
+ // makePath indicates whether this path is for Soong (false) or Make (true).
+ makePath bool
}
func (p InstallPath) buildDir() string {
@@ -1249,7 +1254,23 @@
func (p InstallPath) writablePath() {}
func (p InstallPath) String() string {
- return filepath.Join(p.config.buildDir, p.baseDir, p.path)
+ if p.makePath {
+ // Make path starts with out/ instead of out/soong.
+ return filepath.Join(p.config.buildDir, "../", p.path)
+ } else {
+ return filepath.Join(p.config.buildDir, p.path)
+ }
+}
+
+// PartitionDir returns the path to the partition where the install path is rooted at. It is
+// out/soong/target/product/<device>/<partition> for device modules, and out/soong/host/<os>-<arch> for host modules.
+// The ./soong is dropped if the install path is for Make.
+func (p InstallPath) PartitionDir() string {
+ if p.makePath {
+ return filepath.Join(p.config.buildDir, "../", p.partitionDir)
+ } else {
+ return filepath.Join(p.config.buildDir, p.partitionDir)
+ }
}
// Join creates a new InstallPath with paths... joined with the current path. The
@@ -1270,7 +1291,7 @@
// ToMakePath returns a new InstallPath that points to Make's install directory instead of Soong's,
// i.e. out/ instead of out/soong/.
func (p InstallPath) ToMakePath() InstallPath {
- p.baseDir = "../"
+ p.makePath = true
return p
}
@@ -1300,10 +1321,10 @@
func pathForInstall(ctx PathContext, os OsType, arch ArchType, partition string, debug bool,
pathComponents ...string) InstallPath {
- var outPaths []string
+ var partionPaths []string
if os.Class == Device {
- outPaths = []string{"target", "product", ctx.Config().DeviceName(), partition}
+ partionPaths = []string{"target", "product", ctx.Config().DeviceName(), partition}
} else {
osName := os.String()
if os == Linux {
@@ -1319,30 +1340,33 @@
if os.Class == Host && (arch == X86_64 || arch == Common) {
archName = "x86"
}
- outPaths = []string{"host", osName + "-" + archName, partition}
+ partionPaths = []string{"host", osName + "-" + archName, partition}
}
if debug {
- outPaths = append([]string{"debug"}, outPaths...)
+ partionPaths = append([]string{"debug"}, partionPaths...)
}
- outPaths = append(outPaths, pathComponents...)
- path, err := validatePath(outPaths...)
+ partionPath, err := validatePath(partionPaths...)
if err != nil {
reportPathError(ctx, err)
}
- ret := InstallPath{basePath{path, ctx.Config(), ""}, ""}
+ base := InstallPath{
+ basePath: basePath{partionPath, ctx.Config(), ""},
+ partitionDir: partionPath,
+ makePath: false,
+ }
- return ret
+ return base.Join(ctx, pathComponents...)
}
func pathForNdkOrSdkInstall(ctx PathContext, prefix string, paths []string) InstallPath {
- paths = append([]string{prefix}, paths...)
- path, err := validatePath(paths...)
- if err != nil {
- reportPathError(ctx, err)
+ base := InstallPath{
+ basePath: basePath{prefix, ctx.Config(), ""},
+ partitionDir: prefix,
+ makePath: false,
}
- return InstallPath{basePath{path, ctx.Config(), ""}, ""}
+ return base.Join(ctx, paths...)
}
func PathForNdkInstall(ctx PathContext, paths ...string) InstallPath {