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
This commit is contained in:
@@ -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
|
||||
|
51
cc/cc.go
51
cc/cc.go
@@ -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)
|
||||
|
38
cc/genrule.go
Normal file
38
cc/genrule.go
Normal file
@@ -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
|
||||
}
|
Reference in New Issue
Block a user