blob: 1f0ada28ee951d2d9a6522c0932053380b56b6df [file] [log] [blame]
package bp2build
import (
"android/soong/android"
"android/soong/bazel"
)
type nestedProps struct {
Nested_prop string
}
type customProps struct {
Bool_prop bool
Bool_ptr_prop *bool
// Ensure that properties tagged `blueprint:mutated` are omitted
Int_prop int `blueprint:"mutated"`
Int64_ptr_prop *int64
String_prop string
String_ptr_prop *string
String_list_prop []string
Nested_props nestedProps
Nested_props_ptr *nestedProps
}
type customModule struct {
android.ModuleBase
props customProps
bazelProps bazel.Properties
}
// OutputFiles is needed because some instances of this module use dist with a
// tag property which requires the module implements OutputFileProducer.
func (m *customModule) OutputFiles(tag string) (android.Paths, error) {
return android.PathsForTesting("path" + tag), nil
}
func (m *customModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
// nothing for now.
}
func customModuleFactoryBase() android.Module {
module := &customModule{}
module.AddProperties(&module.props)
module.AddProperties(&module.bazelProps)
return module
}
func customModuleFactory() android.Module {
m := customModuleFactoryBase()
android.InitAndroidModule(m)
return m
}
type testProps struct {
Test_prop struct {
Test_string_prop string
}
}
type customTestModule struct {
android.ModuleBase
props customProps
test_props testProps
}
func (m *customTestModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
// nothing for now.
}
func customTestModuleFactoryBase() android.Module {
m := &customTestModule{}
m.AddProperties(&m.props)
m.AddProperties(&m.test_props)
return m
}
func customTestModuleFactory() android.Module {
m := customTestModuleFactoryBase()
android.InitAndroidModule(m)
return m
}
type customDefaultsModule struct {
android.ModuleBase
android.DefaultsModuleBase
}
func customDefaultsModuleFactoryBase() android.DefaultsModule {
module := &customDefaultsModule{}
module.AddProperties(&customProps{})
return module
}
func customDefaultsModuleFactoryBasic() android.Module {
return customDefaultsModuleFactoryBase()
}
func customDefaultsModuleFactory() android.Module {
m := customDefaultsModuleFactoryBase()
android.InitDefaultsModule(m)
return m
}
type customBazelModuleAttributes struct {
String_prop string
String_list_prop []string
}
type customBazelModule struct {
android.BazelTargetModuleBase
customBazelModuleAttributes
}
func customBazelModuleFactory() android.Module {
module := &customBazelModule{}
module.AddProperties(&module.customBazelModuleAttributes)
android.InitBazelTargetModule(module)
return module
}
func (m *customBazelModule) Name() string { return m.BaseModuleName() }
func (m *customBazelModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {}
func customBp2BuildMutator(ctx android.TopDownMutatorContext) {
if m, ok := ctx.Module().(*customModule); ok {
if !m.bazelProps.Bazel_module.Bp2build_available {
return
}
attrs := &customBazelModuleAttributes{
String_prop: m.props.String_prop,
String_list_prop: m.props.String_list_prop,
}
name := "__bp2build__" + m.Name()
props := bazel.BazelTargetModuleProperties{
Name: &name,
Rule_class: "custom",
}
ctx.CreateBazelTargetModule(customBazelModuleFactory, props, attrs)
}
}
// A bp2build mutator that uses load statements and creates a 1:M mapping from
// module to target.
func customBp2BuildMutatorFromStarlark(ctx android.TopDownMutatorContext) {
if m, ok := ctx.Module().(*customModule); ok {
if !m.bazelProps.Bazel_module.Bp2build_available {
return
}
baseName := m.Name()
attrs := &customBazelModuleAttributes{}
myLibraryName := "__bp2build__" + baseName
myLibraryProps := bazel.BazelTargetModuleProperties{
Name: &myLibraryName,
Rule_class: "my_library",
Bzl_load_location: "//build/bazel/rules:rules.bzl",
}
ctx.CreateBazelTargetModule(customBazelModuleFactory, myLibraryProps, attrs)
protoLibraryName := "__bp2build__" + baseName + "_proto_library_deps"
protoLibraryProps := bazel.BazelTargetModuleProperties{
Name: &protoLibraryName,
Rule_class: "proto_library",
Bzl_load_location: "//build/bazel/rules:proto.bzl",
}
ctx.CreateBazelTargetModule(customBazelModuleFactory, protoLibraryProps, attrs)
myProtoLibraryName := "__bp2build__" + baseName + "_my_proto_library_deps"
myProtoLibraryProps := bazel.BazelTargetModuleProperties{
Name: &myProtoLibraryName,
Rule_class: "my_proto_library",
Bzl_load_location: "//build/bazel/rules:proto.bzl",
}
ctx.CreateBazelTargetModule(customBazelModuleFactory, myProtoLibraryProps, attrs)
}
}