diff --git a/android/defs.go b/android/defs.go index ec8dcf9c0..cd8b4e318 100644 --- a/android/defs.go +++ b/android/defs.go @@ -52,6 +52,13 @@ var ( }, "cpFlags") + CpExecutable = pctx.AndroidStaticRule("CpExecutable", + blueprint.RuleParams{ + Command: "rm -f $out && cp $cpPreserveSymlinks $cpFlags $in $out && chmod +x $out", + Description: "cp $out", + }, + "cpFlags") + // A timestamp touch rule. Touch = pctx.AndroidStaticRule("Touch", blueprint.RuleParams{ diff --git a/android/module.go b/android/module.go index 3a3d1735a..fb2e70305 100644 --- a/android/module.go +++ b/android/module.go @@ -83,8 +83,8 @@ type ModuleContext interface { ExpandSourcesSubDir(srcFiles, excludes []string, subDir string) Paths Glob(globPattern string, excludes []string) Paths - InstallFile(installPath OutputPath, srcPath Path, deps ...Path) OutputPath - InstallFileName(installPath OutputPath, name string, srcPath Path, deps ...Path) OutputPath + 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 CheckbuildFile(srcPath Path) @@ -717,8 +717,18 @@ func (a *androidModuleContext) skipInstall(fullInstallPath OutputPath) bool { return false } -func (a *androidModuleContext) InstallFileName(installPath OutputPath, name string, srcPath Path, +func (a *androidModuleContext) InstallFile(installPath OutputPath, name string, srcPath Path, deps ...Path) OutputPath { + return a.installFile(installPath, name, srcPath, Cp, deps) +} + +func (a *androidModuleContext) InstallExecutable(installPath OutputPath, name string, srcPath Path, + deps ...Path) OutputPath { + return a.installFile(installPath, name, srcPath, CpExecutable, deps) +} + +func (a *androidModuleContext) installFile(installPath OutputPath, name string, srcPath Path, + rule blueprint.Rule, deps []Path) OutputPath { fullInstallPath := installPath.Join(a, name) a.module.base().hooks.runInstallHooks(a, fullInstallPath, false) @@ -738,7 +748,7 @@ func (a *androidModuleContext) InstallFileName(installPath OutputPath, name stri } a.ModuleBuild(pctx, ModuleBuildParams{ - Rule: Cp, + Rule: rule, Description: "install " + fullInstallPath.Base(), Output: fullInstallPath, Input: srcPath, @@ -753,10 +763,6 @@ func (a *androidModuleContext) InstallFileName(installPath OutputPath, name stri return fullInstallPath } -func (a *androidModuleContext) InstallFile(installPath OutputPath, srcPath Path, deps ...Path) OutputPath { - return a.InstallFileName(installPath, filepath.Base(srcPath.String()), srcPath, deps...) -} - func (a *androidModuleContext) InstallSymlink(installPath OutputPath, name string, srcPath OutputPath) OutputPath { fullInstallPath := installPath.Join(a, name) a.module.base().hooks.runInstallHooks(a, fullInstallPath, true) diff --git a/cc/installer.go b/cc/installer.go index 7bedc5648..027d191bc 100644 --- a/cc/installer.go +++ b/cc/installer.go @@ -76,7 +76,7 @@ func (installer *baseInstaller) installDir(ctx ModuleContext) android.OutputPath } func (installer *baseInstaller) install(ctx ModuleContext, file android.Path) { - installer.path = ctx.InstallFile(installer.installDir(ctx), file) + installer.path = ctx.InstallFile(installer.installDir(ctx), file.Base(), file) } func (installer *baseInstaller) inData() bool { diff --git a/cc/ndk_headers.go b/cc/ndk_headers.go index 5fa323263..140cc2f64 100644 --- a/cc/ndk_headers.go +++ b/cc/ndk_headers.go @@ -122,7 +122,7 @@ func (m *headerModule) GenerateAndroidBuildActions(ctx android.ModuleContext) { srcFiles := ctx.ExpandSources(m.properties.Srcs, nil) for _, header := range srcFiles { installDir := getHeaderInstallDir(ctx, header, m.properties.From, m.properties.To) - installedPath := ctx.InstallFile(installDir, header) + installedPath := ctx.InstallFile(installDir, header.Base(), header) installPath := installDir.Join(ctx, header.Base()) if installPath != installedPath { panic(fmt.Sprintf( diff --git a/cc/ndk_library.go b/cc/ndk_library.go index fc7cd9184..a408fc541 100644 --- a/cc/ndk_library.go +++ b/cc/ndk_library.go @@ -341,7 +341,7 @@ func (stub *stubDecorator) install(ctx ModuleContext, path android.Path) { installDir := getNdkInstallBase(ctx).Join(ctx, fmt.Sprintf( "platforms/android-%s/arch-%s/usr/%s", apiLevel, arch, libDir)) - stub.installPath = ctx.InstallFile(installDir, path).String() + stub.installPath = ctx.InstallFile(installDir, path.Base(), path).String() } func newStubLibrary() *Module { diff --git a/cc/prebuilt.go b/cc/prebuilt.go index 089ce2890..9fca05375 100644 --- a/cc/prebuilt.go +++ b/cc/prebuilt.go @@ -125,7 +125,7 @@ func (p *prebuiltBinaryLinker) link(ctx ModuleContext, outputFile := android.PathForModuleOut(ctx, fileName) ctx.ModuleBuild(pctx, android.ModuleBuildParams{ - Rule: android.Cp, + Rule: android.CpExecutable, Description: "prebuilt", Output: outputFile, Input: p.Prebuilt.SingleSourcePath(ctx), diff --git a/java/app.go b/java/app.go index ceb7791fa..a0c4912f4 100644 --- a/java/app.go +++ b/java/app.go @@ -150,7 +150,7 @@ func (a *AndroidApp) GenerateAndroidBuildActions(ctx android.ModuleContext) { } a.outputFile = CreateAppPackage(ctx, aaptPackageFlags, a.outputFile, certificates) - ctx.InstallFileName(android.PathForModuleInstall(ctx, "app"), ctx.ModuleName()+".apk", a.outputFile) + ctx.InstallFile(android.PathForModuleInstall(ctx, "app"), ctx.ModuleName()+".apk", a.outputFile) } var aaptIgnoreFilenames = []string{ diff --git a/java/java.go b/java/java.go index e2e15d463..89c201635 100644 --- a/java/java.go +++ b/java/java.go @@ -457,7 +457,7 @@ type Library struct { func (j *Library) GenerateAndroidBuildActions(ctx android.ModuleContext) { j.compile(ctx) - j.installFile = ctx.InstallFileName(android.PathForModuleInstall(ctx, "framework"), ctx.ModuleName()+".jar", j.outputFile) + j.installFile = ctx.InstallFile(android.PathForModuleInstall(ctx, "framework"), ctx.ModuleName()+".jar", j.outputFile) } func (j *Library) DepsMutator(ctx android.BottomUpMutatorContext) { @@ -510,8 +510,8 @@ func (j *Binary) GenerateAndroidBuildActions(ctx android.ModuleContext) { // Depend on the installed jar (j.installFile) so that the wrapper doesn't get executed by // another build rule before the jar has been installed. j.wrapperFile = android.PathForModuleSrc(ctx, j.binaryProperties.Wrapper) - j.binaryFile = ctx.InstallFile(android.PathForModuleInstall(ctx, "bin"), - j.wrapperFile, j.installFile) + j.binaryFile = ctx.InstallExecutable(android.PathForModuleInstall(ctx, "bin"), + ctx.ModuleName(), j.wrapperFile, j.installFile) } func (j *Binary) DepsMutator(ctx android.BottomUpMutatorContext) { @@ -590,7 +590,7 @@ func (j *Import) GenerateAndroidBuildActions(ctx android.ModuleContext) { j.combinedClasspathFile = TransformClassesToJar(ctx, j.classJarSpecs, android.OptionalPath{}, nil) - ctx.InstallFileName(android.PathForModuleInstall(ctx, "framework"), + ctx.InstallFile(android.PathForModuleInstall(ctx, "framework"), ctx.ModuleName()+".jar", j.combinedClasspathFile) } diff --git a/python/installer.go b/python/installer.go index 9c12f5f78..04698c55f 100644 --- a/python/installer.go +++ b/python/installer.go @@ -35,5 +35,6 @@ func NewPythonInstaller(dir string) *pythonInstaller { var _ installer = (*pythonInstaller)(nil) func (installer *pythonInstaller) install(ctx android.ModuleContext, file android.Path) { - installer.path = ctx.InstallFile(android.PathForModuleInstall(ctx, installer.dir), file) + installer.path = ctx.InstallFile(android.PathForModuleInstall(ctx, installer.dir), + file.Base(), file) }