diff --git a/android/paths.go b/android/paths.go index 4eb9d2030..a056ad4bc 100644 --- a/android/paths.go +++ b/android/paths.go @@ -1237,7 +1237,12 @@ func PathForModuleRes(ctx ModuleContext, pathComponents ...string) ModuleResPath 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/- for host modules, and target/product// 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 @@ var _ WritablePath = InstallPath{} 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// for device modules, and out/soong/host/- 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 @@ func (p InstallPath) withRel(rel string) InstallPath { // 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 PathForModuleInstall(ctx ModuleInstallPathContext, pathComponents ...string 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 @@ func pathForInstall(ctx PathContext, os OsType, arch ArchType, partition string, 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 9ecf4a1e8..51e4ba545 100644 --- a/android/paths_test.go +++ b/android/paths_test.go @@ -264,10 +264,11 @@ func TestPathForModuleInstall(t *testing.T) { 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 @@ func TestPathForModuleInstall(t *testing.T) { 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 @@ func TestPathForModuleInstall(t *testing.T) { 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 @@ func TestPathForModuleInstall(t *testing.T) { }, }, }, - 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 @@ func TestPathForModuleInstall(t *testing.T) { }, }, }, - 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 @@ func TestPathForModuleInstall(t *testing.T) { }, }, }, - 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 @@ func TestPathForModuleInstall(t *testing.T) { }, }, }, - 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 @@ func TestPathForModuleInstall(t *testing.T) { }, 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 @@ func TestPathForModuleInstall(t *testing.T) { }, 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 @@ func TestPathForModuleInstall(t *testing.T) { 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 @@ func TestPathForModuleInstall(t *testing.T) { }, 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 @@ func TestPathForModuleInstall(t *testing.T) { }, 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 @@ func TestPathForModuleInstall(t *testing.T) { }, 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 @@ func TestPathForModuleInstall(t *testing.T) { }, 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 @@ func TestPathForModuleInstall(t *testing.T) { }, 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 @@ func TestPathForModuleInstall(t *testing.T) { }, 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 @@ func TestPathForModuleInstall(t *testing.T) { }, 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 @@ func TestPathForModuleInstall(t *testing.T) { }, 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 @@ func TestPathForModuleInstall(t *testing.T) { }, 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 @@ func TestPathForModuleInstall(t *testing.T) { }, 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 @@ func TestPathForModuleInstall(t *testing.T) { 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 @@ func TestPathForModuleInstall(t *testing.T) { 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 @@ func TestPathForModuleInstall(t *testing.T) { 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 @@ func TestPathForModuleInstall(t *testing.T) { 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 @@ func TestPathForModuleInstall(t *testing.T) { 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 @@ func TestPathForModuleInstall(t *testing.T) { }, 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 @@ func TestPathForModuleInstall(t *testing.T) { }, 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 @@ func TestPathForModuleInstall(t *testing.T) { 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 @@ func TestPathForModuleInstall(t *testing.T) { 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,