aboutsummaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
authorColin Cross <ccross@android.com>2015-12-17 16:39:19 -0800
committerColin Cross <ccross@android.com>2015-12-18 13:13:15 -0800
commit6ff513835507ac628bae455fc6765bff059c574c (patch)
treeb4d967d344fb635af870a165ef36de9ae1847945 /common
parent66fe5656b4abd53249b1e1ea3952fba8bacde10c (diff)
downloadbuild_soong-6ff513835507ac628bae455fc6765bff059c574c.tar.gz
build_soong-6ff513835507ac628bae455fc6765bff059c574c.tar.bz2
build_soong-6ff513835507ac628bae455fc6765bff059c574c.zip
Delay dependency errors to ninja time for unbundled builds
Unbundled builds may use a subset of the tree, which can bring in unused modules but not their dependencies. Delay handling of dependency errors for unbundled builds to ninja time, which will prevent errors if only modules with satisified dependencies are built. Change-Id: Ib93bae93fcfa0b55df500a30d8e35231ffb0987c
Diffstat (limited to 'common')
-rw-r--r--common/config.go8
-rw-r--r--common/defs.go7
-rw-r--r--common/module.go32
3 files changed, 47 insertions, 0 deletions
diff --git a/common/config.go b/common/config.go
index 971c4c11..74e06603 100644
--- a/common/config.go
+++ b/common/config.go
@@ -22,8 +22,12 @@ import (
"runtime"
"strings"
"sync"
+
+ "github.com/google/blueprint/proptools"
)
+var Bool = proptools.Bool
+
// The configuration file name
const configFileName = "soong.config"
const productVariablesFileName = "soong.variables"
@@ -287,3 +291,7 @@ func (c *config) DefaultAppCertificateDir(ctx PathContext) SourcePath {
func (c *config) DefaultAppCertificate(ctx PathContext) SourcePath {
return c.DefaultAppCertificateDir(ctx).Join(ctx, "testkey")
}
+
+func (c *config) AllowMissingDependencies() bool {
+ return Bool(c.ProductVariables.Unbundled_build)
+}
diff --git a/common/defs.go b/common/defs.go
index 9e185e44..12500689 100644
--- a/common/defs.go
+++ b/common/defs.go
@@ -59,6 +59,13 @@ var (
Description: "symlink $out",
},
"fromPath")
+
+ ErrorRule = pctx.StaticRule("Error",
+ blueprint.RuleParams{
+ Command: `echo "$error" && false`,
+ Description: "error building $out",
+ },
+ "error")
)
func init() {
diff --git a/common/module.go b/common/module.go
index e03b006e..a3de5f6b 100644
--- a/common/module.go
+++ b/common/module.go
@@ -15,7 +15,9 @@
package common
import (
+ "fmt"
"path/filepath"
+ "strings"
"android/soong"
"android/soong/glob"
@@ -363,6 +365,7 @@ func (a *AndroidModuleBase) GenerateBuildActions(ctx blueprint.ModuleContext) {
androidBaseContextImpl: a.androidBaseContextFactory(ctx),
installDeps: a.computeInstallDeps(ctx),
installFiles: a.installFiles,
+ missingDeps: ctx.GetMissingDependencies(),
}
if !a.Enabled() {
@@ -397,9 +400,28 @@ type androidModuleContext struct {
installDeps Paths
installFiles Paths
checkbuildFiles Paths
+ missingDeps []string
+}
+
+func (a *androidModuleContext) ninjaError(outputs []string, err error) {
+ a.ModuleContext.Build(pctx, blueprint.BuildParams{
+ Rule: ErrorRule,
+ Outputs: outputs,
+ Optional: true,
+ Args: map[string]string{
+ "error": err.Error(),
+ },
+ })
+ return
}
func (a *androidModuleContext) Build(pctx blueprint.PackageContext, params blueprint.BuildParams) {
+ if a.missingDeps != nil {
+ a.ninjaError(params.Outputs, fmt.Errorf("module %s missing dependencies: %s\n",
+ a.ModuleName(), strings.Join(a.missingDeps, ", ")))
+ return
+ }
+
params.Optional = true
a.ModuleContext.Build(pctx, params)
}
@@ -425,9 +447,19 @@ func (a *androidModuleContext) ModuleBuild(pctx blueprint.PackageContext, params
bparams.Implicits = append(bparams.Implicits, params.Implicit.String())
}
+ if a.missingDeps != nil {
+ a.ninjaError(bparams.Outputs, fmt.Errorf("module %s missing dependencies: %s\n",
+ a.ModuleName(), strings.Join(a.missingDeps, ", ")))
+ return
+ }
+
a.ModuleContext.Build(pctx, bparams)
}
+func (a *androidModuleContext) GetMissingDependencies() []string {
+ return a.missingDeps
+}
+
func (a *androidBaseContextImpl) Arch() Arch {
return a.arch
}