diff options
-rw-r--r-- | Android.bp | 2 | ||||
-rw-r--r-- | cc/androidmk.go | 2 | ||||
-rw-r--r-- | cc/cc.go | 51 | ||||
-rw-r--r-- | cc/genrule.go | 38 | ||||
-rw-r--r-- | genrule/genrule.go | 46 |
5 files changed, 109 insertions, 30 deletions
@@ -150,6 +150,8 @@ bootstrap_go_package { "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 fc45b7ad..2db9d86b 100644 --- a/cc/androidmk.go +++ b/cc/androidmk.go @@ -89,7 +89,7 @@ func (c *Module) AndroidMk() android.AndroidMkData { } 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 @@ -154,6 +154,14 @@ type BaseProperties struct { // 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 @@ type BaseProperties struct { // // 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 @@ type Module struct { 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 @@ type Module struct { } 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 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { 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 @@ func (c *Module) IntermPathForModuleOut() android.OptionalPath { 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 @@ func DefaultsFactory(props ...interface{}) android.Module { module.AddProperties(props...) module.AddProperties( &BaseProperties{}, + &VendorProperties{}, &BaseCompilerProperties{}, &BaseLinkerProperties{}, &LibraryProperties{}, @@ -1241,19 +1252,33 @@ func vendorMutator(mctx android.BottomUpMutatorContext) { 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 @@ func vendorMutator(mctx android.BottomUpMutatorContext) { // 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 00000000..51c0d162 --- /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 f390f813..479e67a6 100644 --- a/genrule/genrule.go +++ b/genrule/genrule.go @@ -28,8 +28,8 @@ import ( ) func init() { - android.RegisterModuleType("gensrcs", GenSrcsFactory) - android.RegisterModuleType("genrule", GenRuleFactory) + android.RegisterModuleType("gensrcs", genSrcsFactory) + android.RegisterModuleType("genrule", genRuleFactory) } var ( @@ -90,9 +90,13 @@ type generatorProperties struct { 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 @@ type generateTask struct { 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) DepsMutator(ctx android.BottomUpMutatorContext) { } } -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) GenerateAndroidBuildActions(ctx android.ModuleContext) { } } -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 (g *generator) generateSourceFile(ctx android.ModuleContext, task generateT } } -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 @@ func GenSrcsFactory() android.Module { 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 @@ func GenRuleFactory() android.Module { 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 |