diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/androidmk.go | 8 | ||||
| -rw-r--r-- | python/binary.go | 59 | ||||
| -rw-r--r-- | python/library.go | 49 | ||||
| -rw-r--r-- | python/python.go | 92 | ||||
| -rw-r--r-- | python/test.go | 5 |
5 files changed, 146 insertions, 67 deletions
diff --git a/python/androidmk.go b/python/androidmk.go index 13b41723e..233d8679f 100644 --- a/python/androidmk.go +++ b/python/androidmk.go @@ -75,16 +75,10 @@ func (p *testDecorator) AndroidMk(base *Module, entries *android.AndroidMkEntrie } func (installer *pythonInstaller) AndroidMk(base *Module, entries *android.AndroidMkEntries) { - // Soong installation is only supported for host modules. Have Make - // installation trigger Soong installation. - if base.Target().Os.Class == android.Host { - entries.OutputFile = android.OptionalPathForPath(installer.path) - } - entries.Required = append(entries.Required, "libc++") entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) { - path, file := filepath.Split(installer.path.ToMakePath().String()) + path, file := filepath.Split(installer.path.String()) stem := strings.TrimSuffix(file, filepath.Ext(file)) entries.SetString("LOCAL_MODULE_SUFFIX", filepath.Ext(file)) diff --git a/python/binary.go b/python/binary.go index e955492a6..99c625916 100644 --- a/python/binary.go +++ b/python/binary.go @@ -27,7 +27,6 @@ import ( func init() { registerPythonBinaryComponents(android.InitRegistrationContext) - android.RegisterBp2BuildMutator("python_binary_host", PythonBinaryBp2Build) } func registerPythonBinaryComponents(ctx android.RegistrationContext) { @@ -35,75 +34,46 @@ func registerPythonBinaryComponents(ctx android.RegistrationContext) { } type bazelPythonBinaryAttributes struct { - Main string + Main *string Srcs bazel.LabelListAttribute - Data bazel.LabelListAttribute - Python_version string + Deps bazel.LabelListAttribute + Python_version *string } -type bazelPythonBinary struct { - android.BazelTargetModuleBase - bazelPythonBinaryAttributes -} - -func BazelPythonBinaryFactory() android.Module { - module := &bazelPythonBinary{} - module.AddProperties(&module.bazelPythonBinaryAttributes) - android.InitBazelTargetModule(module) - return module -} - -func (m *bazelPythonBinary) Name() string { - return m.BaseModuleName() -} - -func (m *bazelPythonBinary) GenerateAndroidBuildActions(ctx android.ModuleContext) {} - -func PythonBinaryBp2Build(ctx android.TopDownMutatorContext) { - m, ok := ctx.Module().(*Module) - if !ok || !m.ConvertWithBp2build(ctx) { - return - } - - // a Module can be something other than a python_binary_host - if ctx.ModuleType() != "python_binary_host" { - return - } - - var main string +func pythonBinaryBp2Build(ctx android.TopDownMutatorContext, m *Module) { + var main *string for _, propIntf := range m.GetProperties() { if props, ok := propIntf.(*BinaryProperties); ok { // main is optional. if props.Main != nil { - main = *props.Main + main = props.Main break } } } + // TODO(b/182306917): this doesn't fully handle all nested props versioned // by the python version, which would have been handled by the version split // mutator. This is sufficient for very simple python_binary_host modules // under Bionic. py3Enabled := proptools.BoolDefault(m.properties.Version.Py3.Enabled, false) py2Enabled := proptools.BoolDefault(m.properties.Version.Py2.Enabled, false) - var python_version string + var python_version *string if py3Enabled && py2Enabled { panic(fmt.Errorf( "error for '%s' module: bp2build's python_binary_host converter does not support "+ "converting a module that is enabled for both Python 2 and 3 at the same time.", m.Name())) } else if py2Enabled { - python_version = "PY2" + python_version = &pyVersion2 } else { // do nothing, since python_version defaults to PY3. } - srcs := android.BazelLabelForModuleSrcExcludes(ctx, m.properties.Srcs, m.properties.Exclude_srcs) - data := android.BazelLabelForModuleSrc(ctx, m.properties.Data) - + baseAttrs := m.makeArchVariantBaseAttributes(ctx) attrs := &bazelPythonBinaryAttributes{ Main: main, - Srcs: bazel.MakeLabelListAttribute(srcs), - Data: bazel.MakeLabelListAttribute(data), + Srcs: baseAttrs.Srcs, + Deps: baseAttrs.Deps, Python_version: python_version, } @@ -112,7 +82,10 @@ func PythonBinaryBp2Build(ctx android.TopDownMutatorContext) { Rule_class: "py_binary", } - ctx.CreateBazelTargetModule(BazelPythonBinaryFactory, m.Name(), props, attrs) + ctx.CreateBazelTargetModule(props, android.CommonAttributes{ + Name: m.Name(), + Data: baseAttrs.Data, + }, attrs) } type BinaryProperties struct { diff --git a/python/library.go b/python/library.go index 9663b3c75..d026c1323 100644 --- a/python/library.go +++ b/python/library.go @@ -18,6 +18,9 @@ package python import ( "android/soong/android" + "android/soong/bazel" + + "github.com/google/blueprint/proptools" ) func init() { @@ -32,11 +35,57 @@ func registerPythonLibraryComponents(ctx android.RegistrationContext) { func PythonLibraryHostFactory() android.Module { module := newModule(android.HostSupported, android.MultilibFirst) + android.InitBazelModule(module) + return module.init() } +type bazelPythonLibraryAttributes struct { + Srcs bazel.LabelListAttribute + Deps bazel.LabelListAttribute + Srcs_version *string +} + +func pythonLibBp2Build(ctx android.TopDownMutatorContext, m *Module) { + // TODO(b/182306917): this doesn't fully handle all nested props versioned + // by the python version, which would have been handled by the version split + // mutator. This is sufficient for very simple python_library modules under + // Bionic. + py3Enabled := proptools.BoolDefault(m.properties.Version.Py3.Enabled, true) + py2Enabled := proptools.BoolDefault(m.properties.Version.Py2.Enabled, false) + var python_version *string + if py2Enabled && !py3Enabled { + python_version = &pyVersion2 + } else if !py2Enabled && py3Enabled { + python_version = &pyVersion3 + } else if !py2Enabled && !py3Enabled { + ctx.ModuleErrorf("bp2build converter doesn't understand having neither py2 nor py3 enabled") + } else { + // do nothing, since python_version defaults to PY2ANDPY3 + } + + baseAttrs := m.makeArchVariantBaseAttributes(ctx) + attrs := &bazelPythonLibraryAttributes{ + Srcs: baseAttrs.Srcs, + Deps: baseAttrs.Deps, + Srcs_version: python_version, + } + + props := bazel.BazelTargetModuleProperties{ + Rule_class: "py_library", + Bzl_load_location: "//build/bazel/rules/python:library.bzl", + } + + ctx.CreateBazelTargetModule(props, android.CommonAttributes{ + Name: m.Name(), + Data: baseAttrs.Data, + }, attrs) +} + func PythonLibraryFactory() android.Module { module := newModule(android.HostAndDeviceSupported, android.MultilibBoth) + android.InitBazelModule(module) + return module.init() } diff --git a/python/python.go b/python/python.go index 0f5b7880e..b100cc318 100644 --- a/python/python.go +++ b/python/python.go @@ -22,6 +22,8 @@ import ( "regexp" "strings" + "android/soong/bazel" + "github.com/google/blueprint" "github.com/google/blueprint/proptools" @@ -45,7 +47,7 @@ func RegisterPythonPreDepsMutators(ctx android.RegisterMutatorsContext) { type VersionProperties struct { // whether the module is required to be built with this version. // Defaults to true for Python 3, and false otherwise. - Enabled *bool `android:"arch_variant"` + Enabled *bool // list of source files specific to this Python version. // Using the syntax ":module", srcs may reference the outputs of other modules that produce source files, @@ -60,7 +62,7 @@ type VersionProperties struct { Libs []string `android:"arch_variant"` // whether the binary is required to be built with embedded launcher for this version, defaults to false. - Embedded_launcher *bool `android:"arch_variant"` // TODO(b/174041232): Remove this property + Embedded_launcher *bool // TODO(b/174041232): Remove this property } // properties that apply to all python modules @@ -70,10 +72,10 @@ type BaseProperties struct { // eg. Pkg_path = "a/b/c"; Other packages can reference this module by using // (from a.b.c import ...) statement. // if left unspecified, all the source/data files path is unchanged within zip file. - Pkg_path *string `android:"arch_variant"` + Pkg_path *string // true, if the Python module is used internally, eg, Python std libs. - Is_internal *bool `android:"arch_variant"` + Is_internal *bool // list of source (.py) files compatible both with Python2 and Python3 used to compile the // Python module. @@ -120,6 +122,18 @@ type BaseProperties struct { Embedded_launcher *bool `blueprint:"mutated"` } +type baseAttributes struct { + // TODO(b/200311466): Probably not translate b/c Bazel has no good equiv + //Pkg_path bazel.StringAttribute + // TODO: Related to Pkg_bath and similarLy gated + //Is_internal bazel.BoolAttribute + // Combines Srcs and Exclude_srcs + Srcs bazel.LabelListAttribute + Deps bazel.LabelListAttribute + // Combines Data and Java_data (invariant) + Data bazel.LabelListAttribute +} + // Used to store files of current module after expanding dependencies type pathMapping struct { dest string @@ -177,6 +191,25 @@ func newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Mo } } +func (m *Module) makeArchVariantBaseAttributes(ctx android.TopDownMutatorContext) baseAttributes { + var attrs baseAttributes + archVariantBaseProps := m.GetArchVariantProperties(ctx, &BaseProperties{}) + for axis, configToProps := range archVariantBaseProps { + for config, props := range configToProps { + if baseProps, ok := props.(*BaseProperties); ok { + attrs.Srcs.SetSelectValue(axis, config, + android.BazelLabelForModuleSrcExcludes(ctx, baseProps.Srcs, baseProps.Exclude_srcs)) + attrs.Deps.SetSelectValue(axis, config, + android.BazelLabelForModuleDeps(ctx, baseProps.Libs)) + data := android.BazelLabelForModuleSrc(ctx, baseProps.Data) + data.Append(android.BazelLabelForModuleSrc(ctx, baseProps.Java_data)) + attrs.Data.SetSelectValue(axis, config, data) + } + } + } + return attrs +} + // bootstrapper interface should be implemented for runnable modules, e.g. binary and test type bootstrapper interface { bootstrapperProps() []interface{} @@ -310,13 +343,16 @@ func versionSplitMutator() func(android.BottomUpMutatorContext) { // HostToolPath returns a path if appropriate such that this module can be used as a host tool, // fulfilling HostToolProvider interface. func (p *Module) HostToolPath() android.OptionalPath { - if p.installer == nil { - // python_library is just meta module, and doesn't have any installer. - return android.OptionalPath{} + if p.installer != nil { + if bin, ok := p.installer.(*binaryDecorator); ok { + // TODO: This should only be set when building host binaries -- tests built for device would be + // setting this incorrectly. + return android.OptionalPathForPath(bin.path) + } } - // TODO: This should only be set when building host binaries -- tests built for device would be - // setting this incorrectly. - return android.OptionalPathForPath(p.installer.(*binaryDecorator).path) + + return android.OptionalPath{} + } // OutputFiles returns output files based on given tag, returns an error if tag is unsupported. @@ -387,6 +423,9 @@ func (p *Module) DepsMutator(ctx android.BottomUpMutatorContext) { if ctx.Target().Os.Bionic() { launcherSharedLibDeps = append(launcherSharedLibDeps, "libc", "libdl", "libm") } + if ctx.Target().Os == android.LinuxMusl && !ctx.Config().HostStaticBinaries() { + launcherSharedLibDeps = append(launcherSharedLibDeps, "libc_musl") + } switch p.properties.Actual_version { case pyVersion2: @@ -396,6 +435,7 @@ func (p *Module) DepsMutator(ctx android.BottomUpMutatorContext) { if p.bootstrapper.autorun() { launcherModule = "py2-launcher-autorun" } + launcherSharedLibDeps = append(launcherSharedLibDeps, "libc++") case pyVersion3: @@ -405,6 +445,9 @@ func (p *Module) DepsMutator(ctx android.BottomUpMutatorContext) { if p.bootstrapper.autorun() { launcherModule = "py3-launcher-autorun" } + if ctx.Config().HostStaticBinaries() && ctx.Target().Os == android.LinuxMusl { + launcherModule += "-static" + } if ctx.Device() { launcherSharedLibDeps = append(launcherSharedLibDeps, "liblog") @@ -632,18 +675,25 @@ func (p *Module) createSrcsZip(ctx android.ModuleContext, pkgPath string) androi } // isPythonLibModule returns whether the given module is a Python library Module or not -// This is distinguished by the fact that Python libraries are not installable, while other Python -// modules are. func isPythonLibModule(module blueprint.Module) bool { if m, ok := module.(*Module); ok { - // Python library has no bootstrapper or installer - if m.bootstrapper == nil && m.installer == nil { - return true - } + return m.isLibrary() } return false } +// This is distinguished by the fact that Python libraries are not installable, while other Python +// modules are. +func (p *Module) isLibrary() bool { + // Python library has no bootstrapper or installer + return p.bootstrapper == nil && p.installer == nil +} + +func (p *Module) isBinary() bool { + _, ok := p.bootstrapper.(*binaryDecorator) + return ok +} + // collectPathsFromTransitiveDeps checks for source/data files for duplicate paths // for module and its transitive dependencies and collects list of data/source file // zips for transitive dependencies. @@ -675,7 +725,7 @@ func (p *Module) collectPathsFromTransitiveDeps(ctx android.ModuleContext) { if !isPythonLibModule(child) { ctx.PropertyErrorf("libs", "the dependency %q of module %q is not Python library!", - ctx.ModuleName(), ctx.OtherModuleName(child)) + ctx.OtherModuleName(child), ctx.ModuleName()) } // collect source and data paths, checking that there are no duplicate output file conflicts if dep, ok := child.(pythonDependency); ok { @@ -717,6 +767,14 @@ func (p *Module) InstallInData() bool { return true } +func (p *Module) ConvertWithBp2build(ctx android.TopDownMutatorContext) { + if p.isLibrary() { + pythonLibBp2Build(ctx, p) + } else if p.isBinary() { + pythonBinaryBp2Build(ctx, p) + } +} + var Bool = proptools.Bool var BoolDefault = proptools.BoolDefault var String = proptools.String diff --git a/python/test.go b/python/test.go index 6713189fd..7413782cb 100644 --- a/python/test.go +++ b/python/test.go @@ -15,6 +15,8 @@ package python import ( + "github.com/google/blueprint/proptools" + "android/soong/android" "android/soong/tradefed" ) @@ -102,6 +104,9 @@ func NewTest(hod android.HostOrDeviceSupported) *Module { binary.pythonInstaller = NewPythonInstaller("nativetest", "nativetest64") test := &testDecorator{binaryDecorator: binary} + if hod == android.HostSupportedNoCross && test.testProperties.Test_options.Unit_test == nil { + test.testProperties.Test_options.Unit_test = proptools.BoolPtr(true) + } module.bootstrapper = test module.installer = test |