aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Blueprints2
-rw-r--r--androidmk/cmd/androidmk/android.go1
-rw-r--r--build.ninja.in16
-rw-r--r--cc/util.go33
-rw-r--r--common/util.go40
-rw-r--r--java/builder.go1
-rw-r--r--java/gen.go79
-rw-r--r--java/java.go87
-rw-r--r--root.bp1
9 files changed, 217 insertions, 43 deletions
diff --git a/Blueprints b/Blueprints
index 84c99131..2acc065e 100644
--- a/Blueprints
+++ b/Blueprints
@@ -86,6 +86,7 @@ bootstrap_go_package {
"common/glob.go",
"common/module.go",
"common/paths.go",
+ "common/util.go",
],
}
@@ -143,6 +144,7 @@ bootstrap_go_package {
],
srcs: [
"java/builder.go",
+ "java/gen.go",
"java/java.go",
"java/resources.go",
],
diff --git a/androidmk/cmd/androidmk/android.go b/androidmk/cmd/androidmk/android.go
index 028396af..404aed80 100644
--- a/androidmk/cmd/androidmk/android.go
+++ b/androidmk/cmd/androidmk/android.go
@@ -49,6 +49,7 @@ var listProperties = map[string]string{
"LOCAL_DX_FLAGS": "dxflags",
"LOCAL_JAVA_LIBRARIES": "java_libs",
"LOCAL_STATIC_JAVA_LIBRARIES": "java_static_libs",
+ "LOCAL_AIDL_INCLUDES": "aidl_includes",
}
var boolProperties = map[string]string{
diff --git a/build.ninja.in b/build.ninja.in
index 2f8fe50f..420a7750 100644
--- a/build.ninja.in
+++ b/build.ninja.in
@@ -53,7 +53,7 @@ rule g.bootstrap.link
# Variant:
# Type: bootstrap_go_binary
# Factory: github.com/google/blueprint/bootstrap.newGoBinaryModule
-# Defined: build/soong/Blueprints:155:1
+# Defined: build/soong/Blueprints:157:1
build .bootstrap/androidmk/obj/androidmk.a: g.bootstrap.gc $
${g.bootstrap.srcDir}/build/soong/androidmk/cmd/androidmk/android.go $
@@ -79,7 +79,7 @@ default .bootstrap/bin/androidmk
# Variant:
# Type: bootstrap_go_package
# Factory: github.com/google/blueprint/bootstrap.newGoPackageModule
-# Defined: build/soong/Blueprints:168:1
+# Defined: build/soong/Blueprints:170:1
build .bootstrap/androidmk-parser/pkg/android/soong/androidmk/parser.a: $
g.bootstrap.gc $
@@ -309,7 +309,7 @@ default .bootstrap/soong-art/pkg/android/soong/art.a
# Variant:
# Type: bootstrap_go_package
# Factory: github.com/google/blueprint/bootstrap.newGoPackageModule
-# Defined: build/soong/Blueprints:92:1
+# Defined: build/soong/Blueprints:93:1
build .bootstrap/soong-cc/pkg/android/soong/cc.a: g.bootstrap.gc $
${g.bootstrap.srcDir}/build/soong/cc/builder.go $
@@ -351,7 +351,8 @@ build .bootstrap/soong-common/pkg/android/soong/common.a: g.bootstrap.gc $
${g.bootstrap.srcDir}/build/soong/common/env.go $
${g.bootstrap.srcDir}/build/soong/common/glob.go $
${g.bootstrap.srcDir}/build/soong/common/module.go $
- ${g.bootstrap.srcDir}/build/soong/common/paths.go | $
+ ${g.bootstrap.srcDir}/build/soong/common/paths.go $
+ ${g.bootstrap.srcDir}/build/soong/common/util.go | $
${g.bootstrap.gcCmd} $
.bootstrap/blueprint-parser/pkg/github.com/google/blueprint/parser.a $
.bootstrap/blueprint-proptools/pkg/github.com/google/blueprint/proptools.a $
@@ -382,7 +383,7 @@ default .bootstrap/soong-env/pkg/android/soong/env.a
# Variant:
# Type: bootstrap_go_package
# Factory: github.com/google/blueprint/bootstrap.newGoPackageModule
-# Defined: build/soong/Blueprints:116:1
+# Defined: build/soong/Blueprints:117:1
build .bootstrap/soong-genrule/pkg/android/soong/genrule.a: g.bootstrap.gc $
${g.bootstrap.srcDir}/build/soong/genrule/genrule.go | $
@@ -419,10 +420,11 @@ default .bootstrap/soong-glob/pkg/android/soong/glob.a
# Variant:
# Type: bootstrap_go_package
# Factory: github.com/google/blueprint/bootstrap.newGoPackageModule
-# Defined: build/soong/Blueprints:136:1
+# Defined: build/soong/Blueprints:137:1
build .bootstrap/soong-java/pkg/android/soong/java.a: g.bootstrap.gc $
${g.bootstrap.srcDir}/build/soong/java/builder.go $
+ ${g.bootstrap.srcDir}/build/soong/java/gen.go $
${g.bootstrap.srcDir}/build/soong/java/java.go $
${g.bootstrap.srcDir}/build/soong/java/resources.go | $
${g.bootstrap.gcCmd} $
@@ -527,7 +529,7 @@ default .bootstrap/bin/soong_glob
# Variant:
# Type: bootstrap_go_binary
# Factory: github.com/google/blueprint/bootstrap.newGoBinaryModule
-# Defined: build/soong/Blueprints:129:1
+# Defined: build/soong/Blueprints:130:1
build .bootstrap/soong_jar/obj/soong_jar.a: g.bootstrap.gc $
${g.bootstrap.srcDir}/build/soong/cmd/soong_jar/soong_jar.go | $
diff --git a/cc/util.go b/cc/util.go
index 7440c256..f1134a1a 100644
--- a/cc/util.go
+++ b/cc/util.go
@@ -18,45 +18,22 @@ import (
"fmt"
"regexp"
"strings"
+
+ "android/soong/common"
)
// Efficiently converts a list of include directories to a single string
// of cflags with -I prepended to each directory.
func includeDirsToFlags(dirs []string) string {
- return joinWithPrefix(dirs, "-I")
+ return common.JoinWithPrefix(dirs, "-I")
}
func ldDirsToFlags(dirs []string) string {
- return joinWithPrefix(dirs, "-L")
+ return common.JoinWithPrefix(dirs, "-L")
}
func libNamesToFlags(names []string) string {
- return joinWithPrefix(names, "-l")
-}
-
-func joinWithPrefix(strs []string, prefix string) string {
- if len(strs) == 0 {
- return ""
- }
-
- if len(strs) == 1 {
- return prefix + strs[0]
- }
-
- n := len(" ") * (len(strs) - 1)
- for _, s := range strs {
- n += len(prefix) + len(s)
- }
-
- ret := make([]byte, 0, n)
- for i, s := range strs {
- if i != 0 {
- ret = append(ret, ' ')
- }
- ret = append(ret, prefix...)
- ret = append(ret, s...)
- }
- return string(ret)
+ return common.JoinWithPrefix(names, "-l")
}
func inList(s string, list []string) bool {
diff --git a/common/util.go b/common/util.go
new file mode 100644
index 00000000..190e0925
--- /dev/null
+++ b/common/util.go
@@ -0,0 +1,40 @@
+// Copyright 2015 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 common
+
+func JoinWithPrefix(strs []string, prefix string) string {
+ if len(strs) == 0 {
+ return ""
+ }
+
+ if len(strs) == 1 {
+ return prefix + strs[0]
+ }
+
+ n := len(" ") * (len(strs) - 1)
+ for _, s := range strs {
+ n += len(prefix) + len(s)
+ }
+
+ ret := make([]byte, 0, n)
+ for i, s := range strs {
+ if i != 0 {
+ ret = append(ret, ' ')
+ }
+ ret = append(ret, prefix...)
+ ret = append(ret, s...)
+ }
+ return string(ret)
+}
diff --git a/java/builder.go b/java/builder.go
index 4eb03c25..02d65aa2 100644
--- a/java/builder.go
+++ b/java/builder.go
@@ -97,6 +97,7 @@ type javaBuilderFlags struct {
dxFlags string
bootClasspath string
classpath string
+ aidlFlags string
}
type jarSpec struct {
diff --git a/java/gen.go b/java/gen.go
new file mode 100644
index 00000000..0b84d44b
--- /dev/null
+++ b/java/gen.go
@@ -0,0 +1,79 @@
+// Copyright 2015 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 java
+
+// This file generates the final rules for compiling all C/C++. All properties related to
+// compiling should have been translated into builderFlags or another argument to the Transform*
+// functions.
+
+import (
+ "path/filepath"
+ "strings"
+
+ "github.com/google/blueprint"
+ "github.com/google/blueprint/pathtools"
+
+ "android/soong/common"
+)
+
+func init() {
+ pctx.VariableFunc("aidlCmd", func(c interface{}) (string, error) {
+ return c.(common.Config).HostBinTool("aidl")
+ })
+ pctx.VariableConfigMethod("srcDir", common.Config.SrcDir)
+}
+
+var (
+ aidl = pctx.StaticRule("aidl",
+ blueprint.RuleParams{
+ Command: "$aidlCmd -d$depFile $aidlFlags $in $out",
+ Description: "aidl $out",
+ },
+ "depFile", "aidlFlags")
+)
+
+func genAidl(ctx common.AndroidModuleContext, aidlFile, aidlFlags string) string {
+ javaFile := strings.TrimPrefix(aidlFile, common.ModuleSrcDir(ctx))
+ javaFile = filepath.Join(common.ModuleGenDir(ctx), javaFile)
+ javaFile = pathtools.ReplaceExtension(javaFile, "java")
+ depFile := javaFile + ".d"
+
+ ctx.Build(pctx, blueprint.BuildParams{
+ Rule: aidl,
+ Outputs: []string{javaFile},
+ Inputs: []string{aidlFile},
+ Implicits: []string{"$aidlCmd"},
+ Args: map[string]string{
+ "depFile": depFile,
+ "aidlFlags": aidlFlags,
+ },
+ })
+
+ return javaFile
+}
+
+func genSources(ctx common.AndroidModuleContext, srcFiles []string,
+ flags javaBuilderFlags) []string {
+
+ for i, srcFile := range srcFiles {
+ switch filepath.Ext(srcFile) {
+ case ".aidl":
+ javaFile := genAidl(ctx, srcFile, flags.aidlFlags)
+ srcFiles[i] = javaFile
+ }
+ }
+
+ return srcFiles
+}
diff --git a/java/java.go b/java/java.go
index 448580ec..ca3a4c75 100644
--- a/java/java.go
+++ b/java/java.go
@@ -24,6 +24,7 @@ import (
"strings"
"github.com/google/blueprint"
+ "github.com/google/blueprint/pathtools"
"android/soong/common"
)
@@ -85,6 +86,13 @@ type javaBase struct {
// jarjar_rules: if not blank, run jarjar using the specified rules file
Jarjar_rules string
+
+ // aidl_includes: directories to pass to aidl tool
+ Aidl_includes []string
+
+ // aidl_export_include_dirs: directories that should be added as include directories
+ // for any aidl sources of modules that depend on this module
+ Export_aidl_include_dirs []string
}
// output file suitable for inserting into the classpath of another compile
@@ -96,6 +104,8 @@ type javaBase struct {
// jarSpecs suitable for inserting resources from a static library into another jar
resourceJarSpecs []jarSpec
+ exportAidlIncludeDirs []string
+
// installed file for binary dependency
installFile string
}
@@ -108,6 +118,8 @@ type JavaDependency interface {
ClasspathFile() string
ClassJarSpecs() []jarSpec
ResourceJarSpecs() []jarSpec
+ AidlIncludeDirs() []string
+ AidlPreprocessed() string
}
func NewJavaBase(base *javaBase, module JavaModuleType, hod common.HostOrDeviceSupported,
@@ -126,6 +138,7 @@ func (j *javaBase) BootClasspath(ctx common.AndroidBaseContext) string {
return "core-libart"
} else if j.properties.Sdk_version == "current" {
// TODO: !TARGET_BUILD_APPS
+ // TODO: export preprocessed framework.aidl from android_stubs_current
return "android_stubs_current"
} else if j.properties.Sdk_version == "system_current" {
return "android_system_stubs_current"
@@ -156,8 +169,29 @@ func (j *javaBase) AndroidDynamicDependencies(ctx common.AndroidDynamicDependerM
return deps
}
+func (j *javaBase) aidlFlags(ctx common.AndroidModuleContext, aidlPreprocess string,
+ aidlIncludeDirs []string) string {
+
+ localAidlIncludes := pathtools.PrefixPaths(j.properties.Aidl_includes, common.ModuleSrcDir(ctx))
+
+ var flags []string
+ if aidlPreprocess != "" {
+ flags = append(flags, "-p"+aidlPreprocess)
+ } else {
+ flags = append(flags, common.JoinWithPrefix(aidlIncludeDirs, "-I"))
+ }
+
+ flags = append(flags, common.JoinWithPrefix(j.exportAidlIncludeDirs, "-I"))
+ flags = append(flags, common.JoinWithPrefix(localAidlIncludes, "-I"))
+ flags = append(flags, "-I"+common.ModuleSrcDir(ctx))
+ flags = append(flags, "-I"+filepath.Join(common.ModuleSrcDir(ctx), "src"))
+
+ return strings.Join(flags, " ")
+}
+
func (j *javaBase) collectDeps(ctx common.AndroidModuleContext) (classpath []string,
- bootClasspath string, classJarSpecs, resourceJarSpecs []jarSpec) {
+ bootClasspath string, classJarSpecs, resourceJarSpecs []jarSpec, aidlPreprocess string,
+ aidlIncludeDirs []string) {
ctx.VisitDirectDeps(func(module blueprint.Module) {
otherName := ctx.OtherModuleName(module)
@@ -173,12 +207,21 @@ func (j *javaBase) collectDeps(ctx common.AndroidModuleContext) (classpath []str
} else {
panic(fmt.Errorf("unknown dependency %q for %q", otherName, ctx.ModuleName()))
}
+ aidlIncludeDirs = append(aidlIncludeDirs, j.AidlIncludeDirs()...)
+ if j.AidlPreprocessed() != "" {
+ if aidlPreprocess != "" {
+ ctx.ModuleErrorf("multiple dependencies with preprocessed aidls:\n %q\n %q",
+ aidlPreprocess, j.AidlPreprocessed())
+ } else {
+ aidlPreprocess = j.AidlPreprocessed()
+ }
+ }
} else {
ctx.ModuleErrorf("unknown dependency module type for %q", otherName)
}
})
- return classpath, bootClasspath, classJarSpecs, resourceJarSpecs
+ return classpath, bootClasspath, classJarSpecs, resourceJarSpecs, aidlPreprocess, aidlIncludeDirs
}
func (j *javaBase) GenerateAndroidBuildActions(ctx common.AndroidModuleContext) {
@@ -186,16 +229,20 @@ func (j *javaBase) GenerateAndroidBuildActions(ctx common.AndroidModuleContext)
}
func (j *javaBase) GenerateJavaBuildActions(ctx common.AndroidModuleContext) {
+
+ j.exportAidlIncludeDirs = pathtools.PrefixPaths(j.properties.Export_aidl_include_dirs,
+ common.ModuleSrcDir(ctx))
+
+ classpath, bootClasspath, classJarSpecs, resourceJarSpecs, aidlPreprocess,
+ aidlIncludeDirs := j.collectDeps(ctx)
+
flags := javaBuilderFlags{
javacFlags: strings.Join(j.properties.Javacflags, " "),
+ aidlFlags: j.aidlFlags(ctx, aidlPreprocess, aidlIncludeDirs),
}
var javacDeps []string
- srcFiles := common.ExpandSources(ctx, j.properties.Srcs)
-
- classpath, bootClasspath, classJarSpecs, resourceJarSpecs := j.collectDeps(ctx)
-
if bootClasspath != "" {
flags.bootClasspath = "-bootclasspath " + bootClasspath
javacDeps = append(javacDeps, bootClasspath)
@@ -206,6 +253,10 @@ func (j *javaBase) GenerateJavaBuildActions(ctx common.AndroidModuleContext) {
javacDeps = append(javacDeps, classpath...)
}
+ srcFiles := common.ExpandSources(ctx, j.properties.Srcs)
+
+ srcFiles = genSources(ctx, srcFiles, flags)
+
// Compile java sources into .class files
classes := TransformJavaToClasses(ctx, srcFiles, flags, javacDeps)
if ctx.Failed() {
@@ -296,6 +347,14 @@ func (j *javaBase) ResourceJarSpecs() []jarSpec {
return j.resourceJarSpecs
}
+func (j *javaBase) AidlIncludeDirs() []string {
+ return j.exportAidlIncludeDirs
+}
+
+func (j *javaBase) AidlPreprocessed() string {
+ return ""
+}
+
//
// Java libraries (.jar file)
//
@@ -362,9 +421,11 @@ type JavaPrebuilt struct {
common.AndroidModuleBase
properties struct {
- Srcs []string
+ Srcs []string
+ Aidl_preprocessed string
}
+ aidlPreprocessed string
classpathFile string
classJarSpecs, resourceJarSpecs []jarSpec
}
@@ -381,7 +442,9 @@ func (j *JavaPrebuilt) GenerateAndroidBuildActions(ctx common.AndroidModuleConte
j.classpathFile = prebuilt
j.classJarSpecs = []jarSpec{classJarSpec}
j.resourceJarSpecs = []jarSpec{resourceJarSpec}
-
+ if j.properties.Aidl_preprocessed != "" {
+ j.aidlPreprocessed = filepath.Join(common.ModuleSrcDir(ctx), j.properties.Aidl_preprocessed)
+ }
ctx.InstallFileName("framework", ctx.ModuleName()+".jar", j.classpathFile)
}
@@ -399,6 +462,14 @@ func (j *JavaPrebuilt) ResourceJarSpecs() []jarSpec {
return j.resourceJarSpecs
}
+func (j *JavaPrebuilt) AidlIncludeDirs() []string {
+ return nil
+}
+
+func (j *JavaPrebuilt) AidlPreprocessed() string {
+ return j.aidlPreprocessed
+}
+
func JavaPrebuiltFactory() (blueprint.Module, []interface{}) {
module := &JavaPrebuilt{}
diff --git a/root.bp b/root.bp
index 18e734f2..fbd0be2a 100644
--- a/root.bp
+++ b/root.bp
@@ -10,4 +10,5 @@ subdirs = [
"prebuilts/ndk",
"prebuilts/sdk",
"system/core/*",
+ "frameworks/base/tools/aidl",
]