Merge "InstallPath keeps its partition dir"
diff --git a/android/paths.go b/android/paths.go
index 4eb9d20..a056ad4 100644
--- a/android/paths.go
+++ b/android/paths.go
@@ -1237,7 +1237,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 {
@@ -1250,7 +1255,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
@@ -1271,7 +1292,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
}
@@ -1301,10 +1322,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 {
@@ -1320,30 +1341,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 {
diff --git a/android/paths_test.go b/android/paths_test.go
index 9ecf4a1..51e4ba5 100644
--- a/android/paths_test.go
+++ b/android/paths_test.go
@@ -264,10 +264,11 @@
deviceTarget := Target{Os: Android, Arch: Arch{ArchType: Arm64}}
testCases := []struct {
- name string
- ctx *moduleInstallPathContextImpl
- in []string
- out string
+ name string
+ ctx *moduleInstallPathContextImpl
+ in []string
+ out string
+ partitionDir string
}{
{
name: "host binary",
@@ -277,8 +278,9 @@
target: hostTarget,
},
},
- in: []string{"bin", "my_test"},
- out: "host/linux-x86/bin/my_test",
+ in: []string{"bin", "my_test"},
+ out: "host/linux-x86/bin/my_test",
+ partitionDir: "host/linux-x86",
},
{
@@ -289,8 +291,9 @@
target: deviceTarget,
},
},
- in: []string{"bin", "my_test"},
- out: "target/product/test_device/system/bin/my_test",
+ in: []string{"bin", "my_test"},
+ out: "target/product/test_device/system/bin/my_test",
+ partitionDir: "target/product/test_device/system",
},
{
name: "vendor binary",
@@ -303,8 +306,9 @@
},
},
},
- in: []string{"bin", "my_test"},
- out: "target/product/test_device/vendor/bin/my_test",
+ in: []string{"bin", "my_test"},
+ out: "target/product/test_device/vendor/bin/my_test",
+ partitionDir: "target/product/test_device/vendor",
},
{
name: "odm binary",
@@ -317,8 +321,9 @@
},
},
},
- in: []string{"bin", "my_test"},
- out: "target/product/test_device/odm/bin/my_test",
+ in: []string{"bin", "my_test"},
+ out: "target/product/test_device/odm/bin/my_test",
+ partitionDir: "target/product/test_device/odm",
},
{
name: "product binary",
@@ -331,8 +336,9 @@
},
},
},
- in: []string{"bin", "my_test"},
- out: "target/product/test_device/product/bin/my_test",
+ in: []string{"bin", "my_test"},
+ out: "target/product/test_device/product/bin/my_test",
+ partitionDir: "target/product/test_device/product",
},
{
name: "system_ext binary",
@@ -345,8 +351,9 @@
},
},
},
- in: []string{"bin", "my_test"},
- out: "target/product/test_device/system_ext/bin/my_test",
+ in: []string{"bin", "my_test"},
+ out: "target/product/test_device/system_ext/bin/my_test",
+ partitionDir: "target/product/test_device/system_ext",
},
{
name: "root binary",
@@ -357,8 +364,9 @@
},
inRoot: true,
},
- in: []string{"my_test"},
- out: "target/product/test_device/root/my_test",
+ in: []string{"my_test"},
+ out: "target/product/test_device/root/my_test",
+ partitionDir: "target/product/test_device/root",
},
{
name: "recovery binary",
@@ -369,8 +377,9 @@
},
inRecovery: true,
},
- in: []string{"bin/my_test"},
- out: "target/product/test_device/recovery/root/system/bin/my_test",
+ in: []string{"bin/my_test"},
+ out: "target/product/test_device/recovery/root/system/bin/my_test",
+ partitionDir: "target/product/test_device/recovery/root/system",
},
{
name: "recovery root binary",
@@ -382,8 +391,9 @@
inRecovery: true,
inRoot: true,
},
- in: []string{"my_test"},
- out: "target/product/test_device/recovery/root/my_test",
+ in: []string{"my_test"},
+ out: "target/product/test_device/recovery/root/my_test",
+ partitionDir: "target/product/test_device/recovery/root",
},
{
@@ -395,8 +405,9 @@
},
inData: true,
},
- in: []string{"nativetest", "my_test"},
- out: "target/product/test_device/data/nativetest/my_test",
+ in: []string{"nativetest", "my_test"},
+ out: "target/product/test_device/data/nativetest/my_test",
+ partitionDir: "target/product/test_device/data",
},
{
name: "vendor native test binary",
@@ -410,8 +421,9 @@
},
inData: true,
},
- in: []string{"nativetest", "my_test"},
- out: "target/product/test_device/data/nativetest/my_test",
+ in: []string{"nativetest", "my_test"},
+ out: "target/product/test_device/data/nativetest/my_test",
+ partitionDir: "target/product/test_device/data",
},
{
name: "odm native test binary",
@@ -425,8 +437,9 @@
},
inData: true,
},
- in: []string{"nativetest", "my_test"},
- out: "target/product/test_device/data/nativetest/my_test",
+ in: []string{"nativetest", "my_test"},
+ out: "target/product/test_device/data/nativetest/my_test",
+ partitionDir: "target/product/test_device/data",
},
{
name: "product native test binary",
@@ -440,8 +453,9 @@
},
inData: true,
},
- in: []string{"nativetest", "my_test"},
- out: "target/product/test_device/data/nativetest/my_test",
+ in: []string{"nativetest", "my_test"},
+ out: "target/product/test_device/data/nativetest/my_test",
+ partitionDir: "target/product/test_device/data",
},
{
@@ -456,8 +470,9 @@
},
inData: true,
},
- in: []string{"nativetest", "my_test"},
- out: "target/product/test_device/data/nativetest/my_test",
+ in: []string{"nativetest", "my_test"},
+ out: "target/product/test_device/data/nativetest/my_test",
+ partitionDir: "target/product/test_device/data",
},
{
@@ -469,8 +484,9 @@
},
inSanitizerDir: true,
},
- in: []string{"bin", "my_test"},
- out: "target/product/test_device/data/asan/system/bin/my_test",
+ in: []string{"bin", "my_test"},
+ out: "target/product/test_device/data/asan/system/bin/my_test",
+ partitionDir: "target/product/test_device/data/asan/system",
},
{
name: "sanitized vendor binary",
@@ -484,8 +500,9 @@
},
inSanitizerDir: true,
},
- in: []string{"bin", "my_test"},
- out: "target/product/test_device/data/asan/vendor/bin/my_test",
+ in: []string{"bin", "my_test"},
+ out: "target/product/test_device/data/asan/vendor/bin/my_test",
+ partitionDir: "target/product/test_device/data/asan/vendor",
},
{
name: "sanitized odm binary",
@@ -499,8 +516,9 @@
},
inSanitizerDir: true,
},
- in: []string{"bin", "my_test"},
- out: "target/product/test_device/data/asan/odm/bin/my_test",
+ in: []string{"bin", "my_test"},
+ out: "target/product/test_device/data/asan/odm/bin/my_test",
+ partitionDir: "target/product/test_device/data/asan/odm",
},
{
name: "sanitized product binary",
@@ -514,8 +532,9 @@
},
inSanitizerDir: true,
},
- in: []string{"bin", "my_test"},
- out: "target/product/test_device/data/asan/product/bin/my_test",
+ in: []string{"bin", "my_test"},
+ out: "target/product/test_device/data/asan/product/bin/my_test",
+ partitionDir: "target/product/test_device/data/asan/product",
},
{
@@ -530,8 +549,9 @@
},
inSanitizerDir: true,
},
- in: []string{"bin", "my_test"},
- out: "target/product/test_device/data/asan/system_ext/bin/my_test",
+ in: []string{"bin", "my_test"},
+ out: "target/product/test_device/data/asan/system_ext/bin/my_test",
+ partitionDir: "target/product/test_device/data/asan/system_ext",
},
{
@@ -544,8 +564,9 @@
inData: true,
inSanitizerDir: true,
},
- in: []string{"nativetest", "my_test"},
- out: "target/product/test_device/data/asan/data/nativetest/my_test",
+ in: []string{"nativetest", "my_test"},
+ out: "target/product/test_device/data/asan/data/nativetest/my_test",
+ partitionDir: "target/product/test_device/data/asan/data",
},
{
name: "sanitized vendor native test binary",
@@ -560,8 +581,9 @@
inData: true,
inSanitizerDir: true,
},
- in: []string{"nativetest", "my_test"},
- out: "target/product/test_device/data/asan/data/nativetest/my_test",
+ in: []string{"nativetest", "my_test"},
+ out: "target/product/test_device/data/asan/data/nativetest/my_test",
+ partitionDir: "target/product/test_device/data/asan/data",
},
{
name: "sanitized odm native test binary",
@@ -576,8 +598,9 @@
inData: true,
inSanitizerDir: true,
},
- in: []string{"nativetest", "my_test"},
- out: "target/product/test_device/data/asan/data/nativetest/my_test",
+ in: []string{"nativetest", "my_test"},
+ out: "target/product/test_device/data/asan/data/nativetest/my_test",
+ partitionDir: "target/product/test_device/data/asan/data",
},
{
name: "sanitized product native test binary",
@@ -592,8 +615,9 @@
inData: true,
inSanitizerDir: true,
},
- in: []string{"nativetest", "my_test"},
- out: "target/product/test_device/data/asan/data/nativetest/my_test",
+ in: []string{"nativetest", "my_test"},
+ out: "target/product/test_device/data/asan/data/nativetest/my_test",
+ partitionDir: "target/product/test_device/data/asan/data",
},
{
name: "sanitized system_ext native test binary",
@@ -608,8 +632,9 @@
inData: true,
inSanitizerDir: true,
},
- in: []string{"nativetest", "my_test"},
- out: "target/product/test_device/data/asan/data/nativetest/my_test",
+ in: []string{"nativetest", "my_test"},
+ out: "target/product/test_device/data/asan/data/nativetest/my_test",
+ partitionDir: "target/product/test_device/data/asan/data",
}, {
name: "device testcases",
ctx: &moduleInstallPathContextImpl{
@@ -619,8 +644,9 @@
},
inTestcases: true,
},
- in: []string{"my_test", "my_test_bin"},
- out: "target/product/test_device/testcases/my_test/my_test_bin",
+ in: []string{"my_test", "my_test_bin"},
+ out: "target/product/test_device/testcases/my_test/my_test_bin",
+ partitionDir: "target/product/test_device/testcases",
}, {
name: "host testcases",
ctx: &moduleInstallPathContextImpl{
@@ -630,8 +656,9 @@
},
inTestcases: true,
},
- in: []string{"my_test", "my_test_bin"},
- out: "host/linux-x86/testcases/my_test/my_test_bin",
+ in: []string{"my_test", "my_test_bin"},
+ out: "host/linux-x86/testcases/my_test/my_test_bin",
+ partitionDir: "host/linux-x86/testcases",
}, {
name: "forced host testcases",
ctx: &moduleInstallPathContextImpl{
@@ -643,8 +670,9 @@
forceOS: &Linux,
forceArch: &X86,
},
- in: []string{"my_test", "my_test_bin"},
- out: "host/linux-x86/testcases/my_test/my_test_bin",
+ in: []string{"my_test", "my_test_bin"},
+ out: "host/linux-x86/testcases/my_test/my_test_bin",
+ partitionDir: "host/linux-x86/testcases",
},
}
@@ -657,10 +685,48 @@
output.basePath.path,
tc.out)
}
+ if output.partitionDir != tc.partitionDir {
+ t.Errorf("unexpected partitionDir:\n got: %q\nwant: %q\n",
+ output.partitionDir, tc.partitionDir)
+ }
})
}
}
+func TestBaseDirForInstallPath(t *testing.T) {
+ testConfig := pathTestConfig("")
+ deviceTarget := Target{Os: Android, Arch: Arch{ArchType: Arm64}}
+
+ ctx := &moduleInstallPathContextImpl{
+ baseModuleContext: baseModuleContext{
+ os: deviceTarget.Os,
+ target: deviceTarget,
+ },
+ }
+ ctx.baseModuleContext.config = testConfig
+
+ actual := PathForModuleInstall(ctx, "foo", "bar")
+ expectedBaseDir := "target/product/test_device/system"
+ if actual.partitionDir != expectedBaseDir {
+ t.Errorf("unexpected partitionDir:\n got: %q\nwant: %q\n", actual.partitionDir, expectedBaseDir)
+ }
+ expectedRelPath := "foo/bar"
+ if actual.Rel() != expectedRelPath {
+ t.Errorf("unexpected Rel():\n got: %q\nwant: %q\n", actual.Rel(), expectedRelPath)
+ }
+
+ actualAfterJoin := actual.Join(ctx, "baz")
+ // partitionDir is preserved even after joining
+ if actualAfterJoin.partitionDir != expectedBaseDir {
+ t.Errorf("unexpected partitionDir after joining:\n got: %q\nwant: %q\n", actualAfterJoin.partitionDir, expectedBaseDir)
+ }
+ // Rel() is updated though
+ expectedRelAfterJoin := "baz"
+ if actualAfterJoin.Rel() != expectedRelAfterJoin {
+ t.Errorf("unexpected Rel() after joining:\n got: %q\nwant: %q\n", actualAfterJoin.Rel(), expectedRelAfterJoin)
+ }
+}
+
func TestDirectorySortedPaths(t *testing.T) {
config := TestConfig("out", nil, "", map[string][]byte{
"Android.bp": nil,