Merge "InstallPath keeps its partition dir"

This commit is contained in:
Treehugger Robot 2020-10-27 01:33:12 +00:00 committed by Gerrit Code Review
commit f26f734867
2 changed files with 164 additions and 74 deletions

View File

@ -1237,7 +1237,12 @@ func PathForModuleRes(ctx ModuleContext, pathComponents ...string) ModuleResPath
type InstallPath struct { type InstallPath struct {
basePath 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 { func (p InstallPath) buildDir() string {
@ -1250,7 +1255,23 @@ var _ WritablePath = InstallPath{}
func (p InstallPath) writablePath() {} func (p InstallPath) writablePath() {}
func (p InstallPath) String() string { 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 // 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, // ToMakePath returns a new InstallPath that points to Make's install directory instead of Soong's,
// i.e. out/ instead of out/soong/. // i.e. out/ instead of out/soong/.
func (p InstallPath) ToMakePath() InstallPath { func (p InstallPath) ToMakePath() InstallPath {
p.baseDir = "../" p.makePath = true
return p return p
} }
@ -1301,10 +1322,10 @@ func PathForModuleInstall(ctx ModuleInstallPathContext, pathComponents ...string
func pathForInstall(ctx PathContext, os OsType, arch ArchType, partition string, debug bool, func pathForInstall(ctx PathContext, os OsType, arch ArchType, partition string, debug bool,
pathComponents ...string) InstallPath { pathComponents ...string) InstallPath {
var outPaths []string var partionPaths []string
if os.Class == Device { if os.Class == Device {
outPaths = []string{"target", "product", ctx.Config().DeviceName(), partition} partionPaths = []string{"target", "product", ctx.Config().DeviceName(), partition}
} else { } else {
osName := os.String() osName := os.String()
if os == Linux { 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) { if os.Class == Host && (arch == X86_64 || arch == Common) {
archName = "x86" archName = "x86"
} }
outPaths = []string{"host", osName + "-" + archName, partition} partionPaths = []string{"host", osName + "-" + archName, partition}
} }
if debug { 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 { if err != nil {
reportPathError(ctx, err) 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 { func pathForNdkOrSdkInstall(ctx PathContext, prefix string, paths []string) InstallPath {
paths = append([]string{prefix}, paths...) base := InstallPath{
path, err := validatePath(paths...) basePath: basePath{prefix, ctx.Config(), ""},
if err != nil { partitionDir: prefix,
reportPathError(ctx, err) makePath: false,
} }
return InstallPath{basePath{path, ctx.Config(), ""}, ""} return base.Join(ctx, paths...)
} }
func PathForNdkInstall(ctx PathContext, paths ...string) InstallPath { func PathForNdkInstall(ctx PathContext, paths ...string) InstallPath {

View File

@ -264,10 +264,11 @@ func TestPathForModuleInstall(t *testing.T) {
deviceTarget := Target{Os: Android, Arch: Arch{ArchType: Arm64}} deviceTarget := Target{Os: Android, Arch: Arch{ArchType: Arm64}}
testCases := []struct { testCases := []struct {
name string name string
ctx *moduleInstallPathContextImpl ctx *moduleInstallPathContextImpl
in []string in []string
out string out string
partitionDir string
}{ }{
{ {
name: "host binary", name: "host binary",
@ -277,8 +278,9 @@ func TestPathForModuleInstall(t *testing.T) {
target: hostTarget, target: hostTarget,
}, },
}, },
in: []string{"bin", "my_test"}, in: []string{"bin", "my_test"},
out: "host/linux-x86/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, target: deviceTarget,
}, },
}, },
in: []string{"bin", "my_test"}, in: []string{"bin", "my_test"},
out: "target/product/test_device/system/bin/my_test", out: "target/product/test_device/system/bin/my_test",
partitionDir: "target/product/test_device/system",
}, },
{ {
name: "vendor binary", name: "vendor binary",
@ -303,8 +306,9 @@ func TestPathForModuleInstall(t *testing.T) {
}, },
}, },
}, },
in: []string{"bin", "my_test"}, in: []string{"bin", "my_test"},
out: "target/product/test_device/vendor/bin/my_test", out: "target/product/test_device/vendor/bin/my_test",
partitionDir: "target/product/test_device/vendor",
}, },
{ {
name: "odm binary", name: "odm binary",
@ -317,8 +321,9 @@ func TestPathForModuleInstall(t *testing.T) {
}, },
}, },
}, },
in: []string{"bin", "my_test"}, in: []string{"bin", "my_test"},
out: "target/product/test_device/odm/bin/my_test", out: "target/product/test_device/odm/bin/my_test",
partitionDir: "target/product/test_device/odm",
}, },
{ {
name: "product binary", name: "product binary",
@ -331,8 +336,9 @@ func TestPathForModuleInstall(t *testing.T) {
}, },
}, },
}, },
in: []string{"bin", "my_test"}, in: []string{"bin", "my_test"},
out: "target/product/test_device/product/bin/my_test", out: "target/product/test_device/product/bin/my_test",
partitionDir: "target/product/test_device/product",
}, },
{ {
name: "system_ext binary", name: "system_ext binary",
@ -345,8 +351,9 @@ func TestPathForModuleInstall(t *testing.T) {
}, },
}, },
}, },
in: []string{"bin", "my_test"}, in: []string{"bin", "my_test"},
out: "target/product/test_device/system_ext/bin/my_test", out: "target/product/test_device/system_ext/bin/my_test",
partitionDir: "target/product/test_device/system_ext",
}, },
{ {
name: "root binary", name: "root binary",
@ -357,8 +364,9 @@ func TestPathForModuleInstall(t *testing.T) {
}, },
inRoot: true, inRoot: true,
}, },
in: []string{"my_test"}, in: []string{"my_test"},
out: "target/product/test_device/root/my_test", out: "target/product/test_device/root/my_test",
partitionDir: "target/product/test_device/root",
}, },
{ {
name: "recovery binary", name: "recovery binary",
@ -369,8 +377,9 @@ func TestPathForModuleInstall(t *testing.T) {
}, },
inRecovery: true, inRecovery: true,
}, },
in: []string{"bin/my_test"}, in: []string{"bin/my_test"},
out: "target/product/test_device/recovery/root/system/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", name: "recovery root binary",
@ -382,8 +391,9 @@ func TestPathForModuleInstall(t *testing.T) {
inRecovery: true, inRecovery: true,
inRoot: true, inRoot: true,
}, },
in: []string{"my_test"}, in: []string{"my_test"},
out: "target/product/test_device/recovery/root/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, inData: true,
}, },
in: []string{"nativetest", "my_test"}, in: []string{"nativetest", "my_test"},
out: "target/product/test_device/data/nativetest/my_test", out: "target/product/test_device/data/nativetest/my_test",
partitionDir: "target/product/test_device/data",
}, },
{ {
name: "vendor native test binary", name: "vendor native test binary",
@ -410,8 +421,9 @@ func TestPathForModuleInstall(t *testing.T) {
}, },
inData: true, inData: true,
}, },
in: []string{"nativetest", "my_test"}, in: []string{"nativetest", "my_test"},
out: "target/product/test_device/data/nativetest/my_test", out: "target/product/test_device/data/nativetest/my_test",
partitionDir: "target/product/test_device/data",
}, },
{ {
name: "odm native test binary", name: "odm native test binary",
@ -425,8 +437,9 @@ func TestPathForModuleInstall(t *testing.T) {
}, },
inData: true, inData: true,
}, },
in: []string{"nativetest", "my_test"}, in: []string{"nativetest", "my_test"},
out: "target/product/test_device/data/nativetest/my_test", out: "target/product/test_device/data/nativetest/my_test",
partitionDir: "target/product/test_device/data",
}, },
{ {
name: "product native test binary", name: "product native test binary",
@ -440,8 +453,9 @@ func TestPathForModuleInstall(t *testing.T) {
}, },
inData: true, inData: true,
}, },
in: []string{"nativetest", "my_test"}, in: []string{"nativetest", "my_test"},
out: "target/product/test_device/data/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, inData: true,
}, },
in: []string{"nativetest", "my_test"}, in: []string{"nativetest", "my_test"},
out: "target/product/test_device/data/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, inSanitizerDir: true,
}, },
in: []string{"bin", "my_test"}, in: []string{"bin", "my_test"},
out: "target/product/test_device/data/asan/system/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", name: "sanitized vendor binary",
@ -484,8 +500,9 @@ func TestPathForModuleInstall(t *testing.T) {
}, },
inSanitizerDir: true, inSanitizerDir: true,
}, },
in: []string{"bin", "my_test"}, in: []string{"bin", "my_test"},
out: "target/product/test_device/data/asan/vendor/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", name: "sanitized odm binary",
@ -499,8 +516,9 @@ func TestPathForModuleInstall(t *testing.T) {
}, },
inSanitizerDir: true, inSanitizerDir: true,
}, },
in: []string{"bin", "my_test"}, in: []string{"bin", "my_test"},
out: "target/product/test_device/data/asan/odm/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", name: "sanitized product binary",
@ -514,8 +532,9 @@ func TestPathForModuleInstall(t *testing.T) {
}, },
inSanitizerDir: true, inSanitizerDir: true,
}, },
in: []string{"bin", "my_test"}, in: []string{"bin", "my_test"},
out: "target/product/test_device/data/asan/product/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, inSanitizerDir: true,
}, },
in: []string{"bin", "my_test"}, in: []string{"bin", "my_test"},
out: "target/product/test_device/data/asan/system_ext/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, inData: true,
inSanitizerDir: true, inSanitizerDir: true,
}, },
in: []string{"nativetest", "my_test"}, in: []string{"nativetest", "my_test"},
out: "target/product/test_device/data/asan/data/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", name: "sanitized vendor native test binary",
@ -560,8 +581,9 @@ func TestPathForModuleInstall(t *testing.T) {
inData: true, inData: true,
inSanitizerDir: true, inSanitizerDir: true,
}, },
in: []string{"nativetest", "my_test"}, in: []string{"nativetest", "my_test"},
out: "target/product/test_device/data/asan/data/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", name: "sanitized odm native test binary",
@ -576,8 +598,9 @@ func TestPathForModuleInstall(t *testing.T) {
inData: true, inData: true,
inSanitizerDir: true, inSanitizerDir: true,
}, },
in: []string{"nativetest", "my_test"}, in: []string{"nativetest", "my_test"},
out: "target/product/test_device/data/asan/data/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", name: "sanitized product native test binary",
@ -592,8 +615,9 @@ func TestPathForModuleInstall(t *testing.T) {
inData: true, inData: true,
inSanitizerDir: true, inSanitizerDir: true,
}, },
in: []string{"nativetest", "my_test"}, in: []string{"nativetest", "my_test"},
out: "target/product/test_device/data/asan/data/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", name: "sanitized system_ext native test binary",
@ -608,8 +632,9 @@ func TestPathForModuleInstall(t *testing.T) {
inData: true, inData: true,
inSanitizerDir: true, inSanitizerDir: true,
}, },
in: []string{"nativetest", "my_test"}, in: []string{"nativetest", "my_test"},
out: "target/product/test_device/data/asan/data/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", name: "device testcases",
ctx: &moduleInstallPathContextImpl{ ctx: &moduleInstallPathContextImpl{
@ -619,8 +644,9 @@ func TestPathForModuleInstall(t *testing.T) {
}, },
inTestcases: true, inTestcases: true,
}, },
in: []string{"my_test", "my_test_bin"}, in: []string{"my_test", "my_test_bin"},
out: "target/product/test_device/testcases/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", name: "host testcases",
ctx: &moduleInstallPathContextImpl{ ctx: &moduleInstallPathContextImpl{
@ -630,8 +656,9 @@ func TestPathForModuleInstall(t *testing.T) {
}, },
inTestcases: true, inTestcases: true,
}, },
in: []string{"my_test", "my_test_bin"}, in: []string{"my_test", "my_test_bin"},
out: "host/linux-x86/testcases/my_test/my_test_bin", out: "host/linux-x86/testcases/my_test/my_test_bin",
partitionDir: "host/linux-x86/testcases",
}, { }, {
name: "forced host testcases", name: "forced host testcases",
ctx: &moduleInstallPathContextImpl{ ctx: &moduleInstallPathContextImpl{
@ -643,8 +670,9 @@ func TestPathForModuleInstall(t *testing.T) {
forceOS: &Linux, forceOS: &Linux,
forceArch: &X86, forceArch: &X86,
}, },
in: []string{"my_test", "my_test_bin"}, in: []string{"my_test", "my_test_bin"},
out: "host/linux-x86/testcases/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, output.basePath.path,
tc.out) 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) { func TestDirectorySortedPaths(t *testing.T) {
config := TestConfig("out", nil, "", map[string][]byte{ config := TestConfig("out", nil, "", map[string][]byte{
"Android.bp": nil, "Android.bp": nil,