Add cc_genrule
cc_genrule is the same as a normal genrule, but can depend on other cc
modules (like cc_object).
Test: mmma external/minijail
Change-Id: I8df87665c7bdc76ce89c92755c054f967a818e57
diff --git a/Android.bp b/Android.bp
index 0875a2b..1f45e7a 100644
--- a/Android.bp
+++ b/Android.bp
@@ -150,6 +150,8 @@
"cc/llndk_library.go",
"cc/kernel_headers.go",
+
+ "cc/genrule.go",
],
testSrcs: [
"cc/cc_test.go",
diff --git a/cc/androidmk.go b/cc/androidmk.go
index fc45b7a..2db9d86 100644
--- a/cc/androidmk.go
+++ b/cc/androidmk.go
@@ -89,7 +89,7 @@
}
c.subAndroidMk(&ret, c.installer)
- if c.vndk() && Bool(c.Properties.Vendor_available) {
+ if c.vndk() && Bool(c.VendorProperties.Vendor_available) {
// .vendor suffix is added only when we will have two variants: core and vendor.
// The suffix is not added for vendor-only module.
ret.SubName += vendorSuffix
diff --git a/cc/cc.go b/cc/cc.go
index f0ba1c6..ea523ca 100644
--- a/cc/cc.go
+++ b/cc/cc.go
@@ -154,6 +154,14 @@
// cppflags, conlyflags, ldflags, or include_dirs
No_default_compiler_flags *bool
+ AndroidMkSharedLibs []string `blueprint:"mutated"`
+ HideFromMake bool `blueprint:"mutated"`
+ PreventInstall bool `blueprint:"mutated"`
+
+ UseVndk bool `blueprint:"mutated"`
+}
+
+type VendorProperties struct {
// whether this module should be allowed to install onto /vendor as
// well as /system. The two variants will be built separately, one
// like normal, and the other limited to the set of libraries and
@@ -166,12 +174,6 @@
//
// Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
Vendor_available *bool
-
- AndroidMkSharedLibs []string `blueprint:"mutated"`
- HideFromMake bool `blueprint:"mutated"`
- PreventInstall bool `blueprint:"mutated"`
-
- UseVndk bool `blueprint:"mutated"`
}
type UnusedProperties struct {
@@ -281,8 +283,9 @@
android.ModuleBase
android.DefaultableModuleBase
- Properties BaseProperties
- unused UnusedProperties
+ Properties BaseProperties
+ VendorProperties VendorProperties
+ unused UnusedProperties
// initialize before calling Init
hod android.HostOrDeviceSupported
@@ -313,7 +316,7 @@
}
func (c *Module) Init() android.Module {
- c.AddProperties(&c.Properties, &c.unused)
+ c.AddProperties(&c.Properties, &c.VendorProperties, &c.unused)
if c.compiler != nil {
c.AddProperties(c.compiler.compilerProps()...)
}
@@ -1127,7 +1130,7 @@
libName := strings.TrimSuffix(name, llndkLibrarySuffix)
libName = strings.TrimPrefix(libName, "prebuilt_")
isLLndk := inList(libName, llndkLibraries)
- if c.vndk() && (Bool(cc.Properties.Vendor_available) || isLLndk) {
+ if c.vndk() && (Bool(cc.VendorProperties.Vendor_available) || isLLndk) {
libName += vendorSuffix
}
// Note: the order of libs in this list is not important because
@@ -1178,6 +1181,13 @@
return c.outputFile
}
+func (c *Module) Srcs() android.Paths {
+ if c.outputFile.Valid() {
+ return android.Paths{c.outputFile.Path()}
+ }
+ return android.Paths{}
+}
+
//
// Defaults
//
@@ -1202,6 +1212,7 @@
module.AddProperties(props...)
module.AddProperties(
&BaseProperties{},
+ &VendorProperties{},
&BaseCompilerProperties{},
&BaseLinkerProperties{},
&LibraryProperties{},
@@ -1241,19 +1252,33 @@
return
}
+ if genrule, ok := mctx.Module().(*genrule.Module); ok {
+ if props, ok := genrule.Extra.(*VendorProperties); ok {
+ if !mctx.DeviceConfig().CompileVndk() {
+ mctx.CreateVariations(coreMode)
+ } else if Bool(props.Vendor_available) {
+ mctx.CreateVariations(coreMode, vendorMode)
+ } else if mctx.Vendor() {
+ mctx.CreateVariations(vendorMode)
+ } else {
+ mctx.CreateVariations(coreMode)
+ }
+ }
+ }
+
m, ok := mctx.Module().(*Module)
if !ok {
return
}
// Sanity check
- if Bool(m.Properties.Vendor_available) && mctx.Vendor() {
+ if Bool(m.VendorProperties.Vendor_available) && mctx.Vendor() {
mctx.PropertyErrorf("vendor_available",
"doesn't make sense at the same time as `vendor: true` or `proprietary: true`")
return
}
if vndk := m.vndkdep; vndk != nil {
- if vndk.isVndk() && !Bool(m.Properties.Vendor_available) {
+ if vndk.isVndk() && !Bool(m.VendorProperties.Vendor_available) {
mctx.PropertyErrorf("vndk",
"has to define `vendor_available: true` to enable vndk")
return
@@ -1273,7 +1298,7 @@
// LL-NDK stubs only exist in the vendor variant, since the
// real libraries will be used in the core variant.
mctx.CreateVariations(vendorMode)
- } else if Bool(m.Properties.Vendor_available) {
+ } else if Bool(m.VendorProperties.Vendor_available) {
// This will be available in both /system and /vendor
// or a /system directory that is available to vendor.
mod := mctx.CreateVariations(coreMode, vendorMode)
diff --git a/cc/genrule.go b/cc/genrule.go
new file mode 100644
index 0000000..51c0d16
--- /dev/null
+++ b/cc/genrule.go
@@ -0,0 +1,38 @@
+// Copyright 2017 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 cc
+
+import (
+ "android/soong/android"
+ "android/soong/genrule"
+)
+
+func init() {
+ android.RegisterModuleType("cc_genrule", genRuleFactory)
+}
+
+// cc_genrule is a genrule that can depend on other cc_* objects.
+// The cmd may be run multiple times, once for each of the different arch/etc
+// variations.
+func genRuleFactory() android.Module {
+ module := genrule.NewGenRule()
+
+ module.Extra = &VendorProperties{}
+ module.AddProperties(module.Extra)
+
+ android.InitAndroidArchModule(module, android.HostAndDeviceSupported, android.MultilibBoth)
+
+ return module
+}
diff --git a/genrule/genrule.go b/genrule/genrule.go
index f390f81..479e67a 100644
--- a/genrule/genrule.go
+++ b/genrule/genrule.go
@@ -28,8 +28,8 @@
)
func init() {
- android.RegisterModuleType("gensrcs", GenSrcsFactory)
- android.RegisterModuleType("genrule", GenRuleFactory)
+ android.RegisterModuleType("gensrcs", genSrcsFactory)
+ android.RegisterModuleType("genrule", genRuleFactory)
}
var (
@@ -90,9 +90,13 @@
Srcs []string
}
-type generator struct {
+type Module struct {
android.ModuleBase
+ // For other packages to make their own genrules with extra
+ // properties
+ Extra interface{}
+
properties generatorProperties
tasks taskFunc
@@ -112,21 +116,21 @@
out android.WritablePaths
}
-func (g *generator) GeneratedSourceFiles() android.Paths {
+func (g *Module) GeneratedSourceFiles() android.Paths {
return g.outputFiles
}
-func (g *generator) Srcs() android.Paths {
+func (g *Module) Srcs() android.Paths {
return g.outputFiles
}
-func (g *generator) GeneratedHeaderDirs() android.Paths {
+func (g *Module) GeneratedHeaderDirs() android.Paths {
return g.exportedIncludeDirs
}
-func (g *generator) DepsMutator(ctx android.BottomUpMutatorContext) {
+func (g *Module) DepsMutator(ctx android.BottomUpMutatorContext) {
android.ExtractSourcesDeps(ctx, g.properties.Srcs)
- if g, ok := ctx.Module().(*generator); ok {
+ if g, ok := ctx.Module().(*Module); ok {
if len(g.properties.Tools) > 0 {
ctx.AddFarVariationDependencies([]blueprint.Variation{
{"arch", ctx.AConfig().BuildOsVariant},
@@ -135,7 +139,7 @@
}
}
-func (g *generator) GenerateAndroidBuildActions(ctx android.ModuleContext) {
+func (g *Module) GenerateAndroidBuildActions(ctx android.ModuleContext) {
if len(g.properties.Tools) == 0 && len(g.properties.Tool_files) == 0 {
ctx.ModuleErrorf("at least one `tools` or `tool_files` is required")
return
@@ -275,7 +279,7 @@
}
}
-func (g *generator) generateSourceFile(ctx android.ModuleContext, task generateTask) {
+func (g *Module) generateSourceFile(ctx android.ModuleContext, task generateTask) {
desc := "generate"
if len(task.out) == 1 {
desc += " " + task.out[0].Base()
@@ -299,20 +303,18 @@
}
}
-func generatorFactory(tasks taskFunc, props ...interface{}) android.Module {
- module := &generator{
+func generatorFactory(tasks taskFunc, props ...interface{}) *Module {
+ module := &Module{
tasks: tasks,
}
module.AddProperties(props...)
module.AddProperties(&module.properties)
- android.InitAndroidModule(module)
-
return module
}
-func GenSrcsFactory() android.Module {
+func NewGenSrcs() *Module {
properties := &genSrcsProperties{}
tasks := func(ctx android.ModuleContext, srcFiles android.Paths) []generateTask {
@@ -329,12 +331,18 @@
return generatorFactory(tasks, properties)
}
+func genSrcsFactory() android.Module {
+ m := NewGenSrcs()
+ android.InitAndroidModule(m)
+ return m
+}
+
type genSrcsProperties struct {
// extension that will be substituted for each output file
Output_extension string
}
-func GenRuleFactory() android.Module {
+func NewGenRule() *Module {
properties := &genRuleProperties{}
tasks := func(ctx android.ModuleContext, srcFiles android.Paths) []generateTask {
@@ -353,6 +361,12 @@
return generatorFactory(tasks, properties)
}
+func genRuleFactory() android.Module {
+ m := NewGenRule()
+ android.InitAndroidModule(m)
+ return m
+}
+
type genRuleProperties struct {
// names of the output files that will be generated
Out []string