diff --git a/android/Android.bp b/android/Android.bp index ff14a70e1..a1b515940 100644 --- a/android/Android.bp +++ b/android/Android.bp @@ -41,6 +41,7 @@ bootstrap_go_package { "paths.go", "phony.go", "prebuilt.go", + "prebuilt_build_tool.go", "proto.go", "register.go", "rule_builder.go", diff --git a/android/defs.go b/android/defs.go index 45522246f..83daa0368 100644 --- a/android/defs.go +++ b/android/defs.go @@ -69,7 +69,7 @@ var ( // A symlink rule. Symlink = pctx.AndroidStaticRule("Symlink", blueprint.RuleParams{ - Command: "ln -f -s $fromPath $out", + Command: "rm -f $out && ln -f -s $fromPath $out", Description: "symlink $out", }, "fromPath") diff --git a/android/prebuilt_build_tool.go b/android/prebuilt_build_tool.go new file mode 100644 index 000000000..1dcf1996b --- /dev/null +++ b/android/prebuilt_build_tool.go @@ -0,0 +1,94 @@ +// Copyright 2020 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package android + +func init() { + RegisterModuleType("prebuilt_build_tool", prebuiltBuildToolFactory) +} + +type prebuiltBuildToolProperties struct { + // Source file to be executed for this build tool + Src *string `android:"path,arch_variant"` + + // Extra files that should trigger rules using this tool to rebuild + Deps []string `android:"path,arch_variant"` + + // Create a make variable with the specified name that contains the path to + // this prebuilt built tool, relative to the root of the source tree. + Export_to_make_var *string +} + +type prebuiltBuildTool struct { + ModuleBase + prebuilt Prebuilt + + properties prebuiltBuildToolProperties + + toolPath OptionalPath +} + +func (t *prebuiltBuildTool) Name() string { + return t.prebuilt.Name(t.ModuleBase.Name()) +} + +func (t *prebuiltBuildTool) Prebuilt() *Prebuilt { + return &t.prebuilt +} + +func (t *prebuiltBuildTool) DepsMutator(ctx BottomUpMutatorContext) { + if t.properties.Src == nil { + ctx.PropertyErrorf("src", "missing prebuilt source file") + } +} + +func (t *prebuiltBuildTool) GenerateAndroidBuildActions(ctx ModuleContext) { + sourcePath := t.prebuilt.SingleSourcePath(ctx) + installedPath := PathForModuleOut(ctx, t.ModuleBase.Name()) + deps := PathsForModuleSrc(ctx, t.properties.Deps) + + ctx.Build(pctx, BuildParams{ + Rule: Symlink, + Output: installedPath, + Input: sourcePath, + Implicits: deps, + Args: map[string]string{ + "fromPath": "$$PWD/" + sourcePath.String(), + }, + }) + + t.toolPath = OptionalPathForPath(installedPath) +} + +func (t *prebuiltBuildTool) MakeVars(ctx MakeVarsModuleContext) { + if makeVar := String(t.properties.Export_to_make_var); makeVar != "" { + ctx.StrictRaw(makeVar, t.toolPath.String()) + } +} + +func (t *prebuiltBuildTool) HostToolPath() OptionalPath { + return t.toolPath +} + +var _ HostToolProvider = &prebuiltBuildTool{} + +// prebuilt_build_tool is to declare prebuilts to be used during the build, particularly for use +// in genrules with the "tools" property. +func prebuiltBuildToolFactory() Module { + module := &prebuiltBuildTool{} + module.AddProperties(&module.properties) + InitSingleSourcePrebuiltModule(module, &module.properties, "Src") + InitAndroidArchModule(module, HostSupportedNoCross, MultilibFirst) + return module +}