Add symlink_outputs support to Soong.

This CL adds symlink_outputs to various locations in Soong that creates
actions that creates symlink outputs, and explicitly mark them as such.

Test: m
Bug: 160568334
Change-Id: I322751bada52a9f49011c74731d84761586e03e7
This commit is contained in:
Jingwen Chen
2020-09-23 04:30:02 +00:00
parent 509a9d35ac
commit ce679d29ec
7 changed files with 206 additions and 14 deletions

View File

@@ -43,6 +43,8 @@ type BuildParams struct {
Description string
Output WritablePath
Outputs WritablePaths
SymlinkOutput WritablePath
SymlinkOutputs WritablePaths
ImplicitOutput WritablePath
ImplicitOutputs WritablePaths
Input Path
@@ -1763,6 +1765,27 @@ func (m *moduleContext) ModuleBuild(pctx PackageContext, params ModuleBuildParam
m.Build(pctx, BuildParams(params))
}
func validateBuildParams(params blueprint.BuildParams) error {
// Validate that the symlink outputs are declared outputs or implicit outputs
allOutputs := map[string]bool{}
for _, output := range params.Outputs {
allOutputs[output] = true
}
for _, output := range params.ImplicitOutputs {
allOutputs[output] = true
}
for _, symlinkOutput := range params.SymlinkOutputs {
if !allOutputs[symlinkOutput] {
return fmt.Errorf(
"Symlink output %s is not a declared output or implicit output",
symlinkOutput)
}
}
return nil
}
// Convert build parameters from their concrete Android types into their string representations,
// and combine the singular and plural fields of the same type (e.g. Output and Outputs).
func convertBuildParams(params BuildParams) blueprint.BuildParams {
bparams := blueprint.BuildParams{
Rule: params.Rule,
@@ -1770,6 +1793,7 @@ func convertBuildParams(params BuildParams) blueprint.BuildParams {
Deps: params.Deps,
Outputs: params.Outputs.Strings(),
ImplicitOutputs: params.ImplicitOutputs.Strings(),
SymlinkOutputs: params.SymlinkOutputs.Strings(),
Inputs: params.Inputs.Strings(),
Implicits: params.Implicits.Strings(),
OrderOnly: params.OrderOnly.Strings(),
@@ -1784,6 +1808,9 @@ func convertBuildParams(params BuildParams) blueprint.BuildParams {
if params.Output != nil {
bparams.Outputs = append(bparams.Outputs, params.Output.String())
}
if params.SymlinkOutput != nil {
bparams.SymlinkOutputs = append(bparams.SymlinkOutputs, params.SymlinkOutput.String())
}
if params.ImplicitOutput != nil {
bparams.ImplicitOutputs = append(bparams.ImplicitOutputs, params.ImplicitOutput.String())
}
@@ -1799,6 +1826,7 @@ func convertBuildParams(params BuildParams) blueprint.BuildParams {
bparams.Outputs = proptools.NinjaEscapeList(bparams.Outputs)
bparams.ImplicitOutputs = proptools.NinjaEscapeList(bparams.ImplicitOutputs)
bparams.SymlinkOutputs = proptools.NinjaEscapeList(bparams.SymlinkOutputs)
bparams.Inputs = proptools.NinjaEscapeList(bparams.Inputs)
bparams.Implicits = proptools.NinjaEscapeList(bparams.Implicits)
bparams.OrderOnly = proptools.NinjaEscapeList(bparams.OrderOnly)
@@ -1855,7 +1883,15 @@ func (m *moduleContext) Build(pctx PackageContext, params BuildParams) {
m.buildParams = append(m.buildParams, params)
}
m.bp.Build(pctx.PackageContext, convertBuildParams(params))
bparams := convertBuildParams(params)
err := validateBuildParams(bparams)
if err != nil {
m.ModuleErrorf(
"%s: build parameter validation failed: %s",
m.ModuleName(),
err.Error())
}
m.bp.Build(pctx.PackageContext, bparams)
}
func (m *moduleContext) Phony(name string, deps ...Path) {