Separate InstallPath from OutputPath
Create a new type InstallPath that is similar to OutputPath to differentiate intermediates output paths from installed output paths. RelPathString is a poorly defined, undocumented function that is primarily used to get an install path relative to out/soong to generate an equivalent install path for Make relative to $(OUT_DIR). Move it to InstallPath for now, and fix the one remaining user on OutputPath. Add a method to create an NDK install path so that ndk_sysroot.go doesn't have to do it manually with PathForOutput. Bug: 141877526 Test: m checkbuild Change-Id: I83c5a0bd1fd6c3dba8d3b6d20d039f64f353ddd5
This commit is contained in:
parent
90ba5f4e98
commit
70dda7e3da
16 changed files with 91 additions and 53 deletions
|
@ -75,7 +75,7 @@ func (x *hooks) runArchHooks(ctx ArchHookContext, m *ModuleBase) {
|
|||
|
||||
type InstallHookContext interface {
|
||||
ModuleContext
|
||||
Path() OutputPath
|
||||
Path() InstallPath
|
||||
Symlink() bool
|
||||
}
|
||||
|
||||
|
@ -89,11 +89,11 @@ func AddInstallHook(m blueprint.Module, hook func(InstallHookContext)) {
|
|||
|
||||
type installHookContext struct {
|
||||
ModuleContext
|
||||
path OutputPath
|
||||
path InstallPath
|
||||
symlink bool
|
||||
}
|
||||
|
||||
func (x *installHookContext) Path() OutputPath {
|
||||
func (x *installHookContext) Path() InstallPath {
|
||||
return x.path
|
||||
}
|
||||
|
||||
|
@ -101,7 +101,7 @@ func (x *installHookContext) Symlink() bool {
|
|||
return x.symlink
|
||||
}
|
||||
|
||||
func (x *hooks) runInstallHooks(ctx ModuleContext, path OutputPath, symlink bool) {
|
||||
func (x *hooks) runInstallHooks(ctx ModuleContext, path InstallPath, symlink bool) {
|
||||
if len(x.install) > 0 {
|
||||
mctx := &installHookContext{
|
||||
ModuleContext: ctx,
|
||||
|
|
|
@ -147,10 +147,10 @@ type ModuleContext interface {
|
|||
ExpandSource(srcFile, prop string) Path
|
||||
ExpandOptionalSource(srcFile *string, prop string) OptionalPath
|
||||
|
||||
InstallExecutable(installPath OutputPath, name string, srcPath Path, deps ...Path) OutputPath
|
||||
InstallFile(installPath OutputPath, name string, srcPath Path, deps ...Path) OutputPath
|
||||
InstallSymlink(installPath OutputPath, name string, srcPath OutputPath) OutputPath
|
||||
InstallAbsoluteSymlink(installPath OutputPath, name string, absPath string) OutputPath
|
||||
InstallExecutable(installPath InstallPath, name string, srcPath Path, deps ...Path) InstallPath
|
||||
InstallFile(installPath InstallPath, name string, srcPath Path, deps ...Path) InstallPath
|
||||
InstallSymlink(installPath InstallPath, name string, srcPath InstallPath) InstallPath
|
||||
InstallAbsoluteSymlink(installPath InstallPath, name string, absPath string) InstallPath
|
||||
CheckbuildFile(srcPath Path)
|
||||
|
||||
InstallInData() bool
|
||||
|
@ -1536,7 +1536,7 @@ func (m *moduleContext) InstallBypassMake() bool {
|
|||
return m.module.InstallBypassMake()
|
||||
}
|
||||
|
||||
func (m *moduleContext) skipInstall(fullInstallPath OutputPath) bool {
|
||||
func (m *moduleContext) skipInstall(fullInstallPath InstallPath) bool {
|
||||
if m.module.base().commonProperties.SkipInstall {
|
||||
return true
|
||||
}
|
||||
|
@ -1561,18 +1561,18 @@ func (m *moduleContext) skipInstall(fullInstallPath OutputPath) bool {
|
|||
return false
|
||||
}
|
||||
|
||||
func (m *moduleContext) InstallFile(installPath OutputPath, name string, srcPath Path,
|
||||
deps ...Path) OutputPath {
|
||||
func (m *moduleContext) InstallFile(installPath InstallPath, name string, srcPath Path,
|
||||
deps ...Path) InstallPath {
|
||||
return m.installFile(installPath, name, srcPath, Cp, deps)
|
||||
}
|
||||
|
||||
func (m *moduleContext) InstallExecutable(installPath OutputPath, name string, srcPath Path,
|
||||
deps ...Path) OutputPath {
|
||||
func (m *moduleContext) InstallExecutable(installPath InstallPath, name string, srcPath Path,
|
||||
deps ...Path) InstallPath {
|
||||
return m.installFile(installPath, name, srcPath, CpExecutable, deps)
|
||||
}
|
||||
|
||||
func (m *moduleContext) installFile(installPath OutputPath, name string, srcPath Path,
|
||||
rule blueprint.Rule, deps []Path) OutputPath {
|
||||
func (m *moduleContext) installFile(installPath InstallPath, name string, srcPath Path,
|
||||
rule blueprint.Rule, deps []Path) InstallPath {
|
||||
|
||||
fullInstallPath := installPath.Join(m, name)
|
||||
m.module.base().hooks.runInstallHooks(m, fullInstallPath, false)
|
||||
|
@ -1607,7 +1607,7 @@ func (m *moduleContext) installFile(installPath OutputPath, name string, srcPath
|
|||
return fullInstallPath
|
||||
}
|
||||
|
||||
func (m *moduleContext) InstallSymlink(installPath OutputPath, name string, srcPath OutputPath) OutputPath {
|
||||
func (m *moduleContext) InstallSymlink(installPath InstallPath, name string, srcPath InstallPath) InstallPath {
|
||||
fullInstallPath := installPath.Join(m, name)
|
||||
m.module.base().hooks.runInstallHooks(m, fullInstallPath, true)
|
||||
|
||||
|
@ -1636,7 +1636,7 @@ func (m *moduleContext) InstallSymlink(installPath OutputPath, name string, srcP
|
|||
|
||||
// installPath/name -> absPath where absPath might be a path that is available only at runtime
|
||||
// (e.g. /apex/...)
|
||||
func (m *moduleContext) InstallAbsoluteSymlink(installPath OutputPath, name string, absPath string) OutputPath {
|
||||
func (m *moduleContext) InstallAbsoluteSymlink(installPath InstallPath, name string, absPath string) InstallPath {
|
||||
fullInstallPath := installPath.Join(m, name)
|
||||
m.module.base().hooks.runInstallHooks(m, fullInstallPath, true)
|
||||
|
||||
|
|
|
@ -60,7 +60,7 @@ func MergeNotices(ctx ModuleContext, mergedNotice WritablePath, noticePaths []Pa
|
|||
})
|
||||
}
|
||||
|
||||
func BuildNoticeOutput(ctx ModuleContext, installPath OutputPath, installFilename string,
|
||||
func BuildNoticeOutput(ctx ModuleContext, installPath InstallPath, installFilename string,
|
||||
noticePaths []Path) NoticeOutputs {
|
||||
// Merge all NOTICE files into one.
|
||||
// TODO(jungjw): We should just produce a well-formatted NOTICE.html file in a single pass.
|
||||
|
|
|
@ -793,7 +793,7 @@ func (p SourcePath) OverlayPath(ctx ModuleContext, path Path) OptionalPath {
|
|||
return OptionalPathForPath(PathForSource(ctx, relPath))
|
||||
}
|
||||
|
||||
// OutputPath is a Path representing a file path rooted from the build directory
|
||||
// OutputPath is a Path representing an intermediates file path rooted from the build directory
|
||||
type OutputPath struct {
|
||||
basePath
|
||||
}
|
||||
|
@ -824,12 +824,12 @@ func PathForOutput(ctx PathContext, pathComponents ...string) OutputPath {
|
|||
// pathForInstallInMakeDir is used by PathForModuleInstall when the module returns true
|
||||
// for InstallBypassMake to produce an OutputPath that installs to $OUT_DIR instead of
|
||||
// $OUT_DIR/soong.
|
||||
func pathForInstallInMakeDir(ctx PathContext, pathComponents ...string) OutputPath {
|
||||
func pathForInstallInMakeDir(ctx PathContext, pathComponents ...string) InstallPath {
|
||||
path, err := validatePath(pathComponents...)
|
||||
if err != nil {
|
||||
reportPathError(ctx, err)
|
||||
}
|
||||
return OutputPath{basePath{"../" + path, ctx.Config(), ""}}
|
||||
return InstallPath{basePath{"../" + path, ctx.Config(), ""}}
|
||||
}
|
||||
|
||||
// PathsForOutput returns Paths rooted from buildDir
|
||||
|
@ -847,10 +847,6 @@ func (p OutputPath) String() string {
|
|||
return filepath.Join(p.config.buildDir, p.path)
|
||||
}
|
||||
|
||||
func (p OutputPath) RelPathString() string {
|
||||
return p.path
|
||||
}
|
||||
|
||||
// Join creates a new OutputPath with paths... joined with the current path. The
|
||||
// provided paths... may not use '..' to escape from the current path.
|
||||
func (p OutputPath) Join(ctx PathContext, paths ...string) OutputPath {
|
||||
|
@ -1119,9 +1115,39 @@ func PathForModuleRes(ctx ModuleContext, pathComponents ...string) ModuleResPath
|
|||
return ModuleResPath{PathForModuleOut(ctx, "res", p)}
|
||||
}
|
||||
|
||||
// InstallPath is a Path representing a installed file path rooted from the build directory
|
||||
type InstallPath struct {
|
||||
basePath
|
||||
}
|
||||
|
||||
func (p InstallPath) writablePath() {}
|
||||
|
||||
func (p InstallPath) String() string {
|
||||
return filepath.Join(p.config.buildDir, p.path)
|
||||
}
|
||||
|
||||
// Join creates a new InstallPath with paths... joined with the current path. The
|
||||
// provided paths... may not use '..' to escape from the current path.
|
||||
func (p InstallPath) Join(ctx PathContext, paths ...string) InstallPath {
|
||||
path, err := validatePath(paths...)
|
||||
if err != nil {
|
||||
reportPathError(ctx, err)
|
||||
}
|
||||
return p.withRel(path)
|
||||
}
|
||||
|
||||
func (p InstallPath) withRel(rel string) InstallPath {
|
||||
p.basePath = p.basePath.withRel(rel)
|
||||
return p
|
||||
}
|
||||
|
||||
func (p InstallPath) RelPathString() string {
|
||||
return p.path
|
||||
}
|
||||
|
||||
// PathForModuleInstall returns a Path representing the install path for the
|
||||
// module appended with paths...
|
||||
func PathForModuleInstall(ctx ModuleInstallPathContext, pathComponents ...string) OutputPath {
|
||||
func PathForModuleInstall(ctx ModuleInstallPathContext, pathComponents ...string) InstallPath {
|
||||
var outPaths []string
|
||||
if ctx.Device() {
|
||||
partition := modulePartition(ctx)
|
||||
|
@ -1144,10 +1170,24 @@ func PathForModuleInstall(ctx ModuleInstallPathContext, pathComponents ...string
|
|||
if ctx.InstallBypassMake() && ctx.Config().EmbeddedInMake() {
|
||||
return pathForInstallInMakeDir(ctx, outPaths...)
|
||||
}
|
||||
return PathForOutput(ctx, outPaths...)
|
||||
|
||||
path, err := validatePath(outPaths...)
|
||||
if err != nil {
|
||||
reportPathError(ctx, err)
|
||||
}
|
||||
return InstallPath{basePath{path, ctx.Config(), ""}}
|
||||
}
|
||||
|
||||
func InstallPathToOnDevicePath(ctx PathContext, path OutputPath) string {
|
||||
func PathForNdkInstall(ctx PathContext, paths ...string) InstallPath {
|
||||
paths = append([]string{"ndk"}, paths...)
|
||||
path, err := validatePath(paths...)
|
||||
if err != nil {
|
||||
reportPathError(ctx, err)
|
||||
}
|
||||
return InstallPath{basePath{path, ctx.Config(), ""}}
|
||||
}
|
||||
|
||||
func InstallPathToOnDevicePath(ctx PathContext, path InstallPath) string {
|
||||
rel := Rel(ctx, PathForOutput(ctx, "target", "product", ctx.Config().DeviceName()).String(), path.String())
|
||||
|
||||
return "/" + rel
|
||||
|
|
|
@ -65,7 +65,7 @@ type PrebuiltEtc struct {
|
|||
installDirBase string
|
||||
// The base install location when soc_specific property is set to true, e.g. "firmware" for prebuilt_firmware.
|
||||
socInstallDirBase string
|
||||
installDirPath OutputPath
|
||||
installDirPath InstallPath
|
||||
additionalDependencies *Paths
|
||||
}
|
||||
|
||||
|
@ -91,7 +91,7 @@ func (p *PrebuiltEtc) SourceFilePath(ctx ModuleContext) Path {
|
|||
return PathForModuleSrc(ctx, String(p.properties.Src))
|
||||
}
|
||||
|
||||
func (p *PrebuiltEtc) InstallDirPath() OutputPath {
|
||||
func (p *PrebuiltEtc) InstallDirPath() InstallPath {
|
||||
return p.installDirPath
|
||||
}
|
||||
|
||||
|
|
|
@ -561,8 +561,8 @@ type apexBundle struct {
|
|||
|
||||
bundleModuleFile android.WritablePath
|
||||
outputFiles map[apexPackaging]android.WritablePath
|
||||
flattenedOutput android.OutputPath
|
||||
installDir android.OutputPath
|
||||
flattenedOutput android.InstallPath
|
||||
installDir android.InstallPath
|
||||
|
||||
prebuiltFileToDelete string
|
||||
|
||||
|
@ -1840,7 +1840,7 @@ type Prebuilt struct {
|
|||
properties PrebuiltProperties
|
||||
|
||||
inputApex android.Path
|
||||
installDir android.OutputPath
|
||||
installDir android.InstallPath
|
||||
installFilename string
|
||||
outputApex android.WritablePath
|
||||
}
|
||||
|
|
|
@ -52,7 +52,7 @@ type baseInstaller struct {
|
|||
relative string
|
||||
location installLocation
|
||||
|
||||
path android.OutputPath
|
||||
path android.InstallPath
|
||||
}
|
||||
|
||||
var _ installer = (*baseInstaller)(nil)
|
||||
|
@ -61,7 +61,7 @@ func (installer *baseInstaller) installerProps() []interface{} {
|
|||
return []interface{}{&installer.Properties}
|
||||
}
|
||||
|
||||
func (installer *baseInstaller) installDir(ctx ModuleContext) android.OutputPath {
|
||||
func (installer *baseInstaller) installDir(ctx ModuleContext) android.InstallPath {
|
||||
dir := installer.dir
|
||||
if ctx.toolchain().Is64Bit() && installer.dir64 != "" {
|
||||
dir = installer.dir64
|
||||
|
|
|
@ -791,9 +791,7 @@ func (library *libraryDecorator) linkShared(ctx ModuleContext,
|
|||
|
||||
// Optimize out relinking against shared libraries whose interface hasn't changed by
|
||||
// depending on a table of contents file instead of the library itself.
|
||||
tocPath := outputFile.RelPathString()
|
||||
tocPath = pathtools.ReplaceExtension(tocPath, flags.Toolchain.ShlibSuffix()[1:]+".toc")
|
||||
tocFile := android.PathForOutput(ctx, tocPath)
|
||||
tocFile := outputFile.ReplaceExtension(ctx, flags.Toolchain.ShlibSuffix()[1:]+".toc")
|
||||
library.tocFile = android.OptionalPathForPath(tocFile)
|
||||
TransformSharedObjectToToc(ctx, outputFile, tocFile, builderFlags)
|
||||
|
||||
|
|
|
@ -48,7 +48,7 @@ func init() {
|
|||
}
|
||||
|
||||
// Returns the NDK base include path for use with sdk_version current. Usable with -I.
|
||||
func getCurrentIncludePath(ctx android.ModuleContext) android.OutputPath {
|
||||
func getCurrentIncludePath(ctx android.ModuleContext) android.InstallPath {
|
||||
return getNdkSysrootBase(ctx).Join(ctx, "usr/include")
|
||||
}
|
||||
|
||||
|
@ -94,7 +94,7 @@ type headerModule struct {
|
|||
}
|
||||
|
||||
func getHeaderInstallDir(ctx android.ModuleContext, header android.Path, from string,
|
||||
to string) android.OutputPath {
|
||||
to string) android.InstallPath {
|
||||
// Output path is the sysroot base + "usr/include" + to directory + directory component
|
||||
// of the file without the leading from directory stripped.
|
||||
//
|
||||
|
|
|
@ -66,12 +66,12 @@ func init() {
|
|||
pctx.Import("android/soong/android")
|
||||
}
|
||||
|
||||
func getNdkInstallBase(ctx android.PathContext) android.OutputPath {
|
||||
return android.PathForOutput(ctx, "ndk")
|
||||
func getNdkInstallBase(ctx android.PathContext) android.InstallPath {
|
||||
return android.PathForNdkInstall(ctx)
|
||||
}
|
||||
|
||||
// Returns the main install directory for the NDK sysroot. Usable with --sysroot.
|
||||
func getNdkSysrootBase(ctx android.PathContext) android.OutputPath {
|
||||
func getNdkSysrootBase(ctx android.PathContext) android.InstallPath {
|
||||
return getNdkInstallBase(ctx).Join(ctx, "sysroot")
|
||||
}
|
||||
|
||||
|
|
|
@ -126,7 +126,7 @@ type AndroidApp struct {
|
|||
// the install APK name is normally the same as the module name, but can be overridden with PRODUCT_PACKAGE_NAME_OVERRIDES.
|
||||
installApkName string
|
||||
|
||||
installDir android.OutputPath
|
||||
installDir android.InstallPath
|
||||
|
||||
onDeviceDir string
|
||||
|
||||
|
@ -773,7 +773,7 @@ type AndroidAppImport struct {
|
|||
|
||||
usesLibrary usesLibrary
|
||||
|
||||
installPath android.OutputPath
|
||||
installPath android.InstallPath
|
||||
}
|
||||
|
||||
type AndroidAppImportProperties struct {
|
||||
|
|
|
@ -22,7 +22,7 @@ import (
|
|||
type dexpreopter struct {
|
||||
dexpreoptProperties DexpreoptProperties
|
||||
|
||||
installPath android.OutputPath
|
||||
installPath android.InstallPath
|
||||
uncompressedDex bool
|
||||
isSDKLibrary bool
|
||||
isTest bool
|
||||
|
@ -94,7 +94,7 @@ func (d *dexpreopter) dexpreoptDisabled(ctx android.ModuleContext) bool {
|
|||
return false
|
||||
}
|
||||
|
||||
func odexOnSystemOther(ctx android.ModuleContext, installPath android.OutputPath) bool {
|
||||
func odexOnSystemOther(ctx android.ModuleContext, installPath android.InstallPath) bool {
|
||||
return dexpreopt.OdexOnSystemOtherByName(ctx.ModuleName(), android.InstallPathToOnDevicePath(ctx, installPath), dexpreoptGlobalConfig(ctx))
|
||||
}
|
||||
|
||||
|
|
|
@ -1795,7 +1795,7 @@ type Binary struct {
|
|||
isWrapperVariant bool
|
||||
|
||||
wrapperFile android.Path
|
||||
binaryFile android.OutputPath
|
||||
binaryFile android.InstallPath
|
||||
}
|
||||
|
||||
func (j *Binary) HostToolPath() android.OptionalPath {
|
||||
|
|
|
@ -30,7 +30,7 @@ type platformCompatConfig struct {
|
|||
android.ModuleBase
|
||||
|
||||
properties platformCompatConfigProperties
|
||||
installDirPath android.OutputPath
|
||||
installDirPath android.InstallPath
|
||||
configFile android.OutputPath
|
||||
}
|
||||
|
||||
|
|
|
@ -33,7 +33,7 @@ type pythonInstaller struct {
|
|||
dir64 string
|
||||
relative string
|
||||
|
||||
path android.OutputPath
|
||||
path android.InstallPath
|
||||
|
||||
androidMkSharedLibs []string
|
||||
}
|
||||
|
@ -47,7 +47,7 @@ func NewPythonInstaller(dir, dir64 string) *pythonInstaller {
|
|||
|
||||
var _ installer = (*pythonInstaller)(nil)
|
||||
|
||||
func (installer *pythonInstaller) installDir(ctx android.ModuleContext) android.OutputPath {
|
||||
func (installer *pythonInstaller) installDir(ctx android.ModuleContext) android.InstallPath {
|
||||
dir := installer.dir
|
||||
if ctx.Arch().ArchType.Multilib == "lib64" && installer.dir64 != "" {
|
||||
dir = installer.dir64
|
||||
|
|
|
@ -94,7 +94,7 @@ type baseCompiler struct {
|
|||
dir64 string
|
||||
subDir string
|
||||
relative string
|
||||
path android.OutputPath
|
||||
path android.InstallPath
|
||||
}
|
||||
|
||||
var _ compiler = (*baseCompiler)(nil)
|
||||
|
@ -173,7 +173,7 @@ func (compiler *baseCompiler) crateName() string {
|
|||
return compiler.Properties.Crate_name
|
||||
}
|
||||
|
||||
func (compiler *baseCompiler) installDir(ctx ModuleContext) android.OutputPath {
|
||||
func (compiler *baseCompiler) installDir(ctx ModuleContext) android.InstallPath {
|
||||
dir := compiler.dir
|
||||
if ctx.toolchain().Is64Bit() && compiler.dir64 != "" {
|
||||
dir = compiler.dir64
|
||||
|
|
Loading…
Reference in a new issue