diff options
Diffstat (limited to 'python/python.go')
-rw-r--r-- | python/python.go | 97 |
1 files changed, 53 insertions, 44 deletions
diff --git a/python/python.go b/python/python.go index 8726f02ef..09af62ea5 100644 --- a/python/python.go +++ b/python/python.go @@ -22,12 +22,23 @@ import ( "regexp" "strings" + "android/soong/cc" "github.com/google/blueprint" "github.com/google/blueprint/proptools" "android/soong/android" ) +type PythonLibraryInfo struct { + SrcsPathMappings []pathMapping + DataPathMappings []pathMapping + SrcsZip android.Path + PrecompiledSrcsZip android.Path + PkgPath string +} + +var PythonLibraryInfoProvider = blueprint.NewProvider[PythonLibraryInfo]() + func init() { registerPythonMutators(android.InitRegistrationContext) } @@ -90,6 +101,16 @@ type BaseProperties struct { // the test. the file extension can be arbitrary except for (.py). Data []string `android:"path,arch_variant"` + // Same as data, but will add dependencies on modules using the device's os variation and + // the common arch variation. Useful for a host test that wants to embed a module built for + // device. + Device_common_data []string `android:"path_device_common"` + + // Same as data, but will add dependencies on modules via a device os variation and the + // device's first supported arch's variation. Useful for a host test that wants to embed a + // module built for device. + Device_first_data []string `android:"path_device_first"` + // list of java modules that provide data that should be installed alongside the test. Java_data []string @@ -163,16 +184,6 @@ func newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Py } } -// interface implemented by Python modules to provide source and data mappings and zip to python -// modules that depend on it -type pythonDependency interface { - getSrcsPathMappings() []pathMapping - getDataPathMappings() []pathMapping - getSrcsZip() android.Path - getPrecompiledSrcsZip() android.Path - getPkgPath() string -} - // getSrcsPathMappings gets this module's path mapping of src source path : runfiles destination func (p *PythonLibraryModule) getSrcsPathMappings() []pathMapping { return p.srcsPathMappings @@ -202,8 +213,6 @@ func (p *PythonLibraryModule) getBaseProperties() *BaseProperties { return &p.properties } -var _ pythonDependency = (*PythonLibraryModule)(nil) - func (p *PythonLibraryModule) init() android.Module { p.AddProperties(&p.properties, &p.protoProperties, &p.sourceProperties) android.InitAndroidArchModule(p, p.hod, p.multilib) @@ -264,10 +273,9 @@ func (versionSplitTransitionMutator) Split(ctx android.BaseModuleContext) []stri variants = append(variants, pyVersion3) } if proptools.BoolDefault(props.Version.Py2.Enabled, false) { - if !ctx.DeviceConfig().BuildBrokenUsesSoongPython2Modules() && - ctx.ModuleName() != "py2-cmd" && + if ctx.ModuleName() != "py2-cmd" && ctx.ModuleName() != "py2-stdlib" { - ctx.PropertyErrorf("version.py2.enabled", "Python 2 is no longer supported, please convert to python 3. This error can be temporarily overridden by setting BUILD_BROKEN_USES_SOONG_PYTHON2_MODULES := true in the product configuration") + ctx.PropertyErrorf("version.py2.enabled", "Python 2 is no longer supported, please convert to python 3.") } variants = append(variants, pyVersion2) } @@ -443,7 +451,6 @@ func (p *PythonLibraryModule) AddDepsOnPythonLauncherAndStdlib(ctx android.Botto // GenerateAndroidBuildActions performs build actions common to all Python modules func (p *PythonLibraryModule) GenerateAndroidBuildActions(ctx android.ModuleContext) { expandedSrcs := android.PathsForModuleSrcExcludes(ctx, p.properties.Srcs, p.properties.Exclude_srcs) - android.SetProvider(ctx, blueprint.SrcsFileProviderKey, blueprint.SrcsFileProviderData{SrcPaths: expandedSrcs.Strings()}) // Keep before any early returns. android.SetProvider(ctx, android.TestOnlyProviderKey, android.TestModuleInformation{ TestOnly: Bool(p.sourceProperties.Test_only), @@ -452,9 +459,11 @@ func (p *PythonLibraryModule) GenerateAndroidBuildActions(ctx android.ModuleCont // expand data files from "data" property. expandedData := android.PathsForModuleSrc(ctx, p.properties.Data) + expandedData = append(expandedData, android.PathsForModuleSrc(ctx, p.properties.Device_common_data)...) + expandedData = append(expandedData, android.PathsForModuleSrc(ctx, p.properties.Device_first_data)...) // Emulate the data property for java_data dependencies. - for _, javaData := range ctx.GetDirectDepsWithTag(javaDataTag) { + for _, javaData := range ctx.GetDirectDepsProxyWithTag(javaDataTag) { expandedData = append(expandedData, android.OutputFilesForModule(ctx, javaData, "")...) } @@ -482,6 +491,14 @@ func (p *PythonLibraryModule) GenerateAndroidBuildActions(ctx android.ModuleCont // generate the zipfile of all source and data files p.srcsZip = p.createSrcsZip(ctx, pkgPath) p.precompiledSrcsZip = p.precompileSrcs(ctx) + + android.SetProvider(ctx, PythonLibraryInfoProvider, PythonLibraryInfo{ + SrcsPathMappings: p.getSrcsPathMappings(), + DataPathMappings: p.getDataPathMappings(), + SrcsZip: p.getSrcsZip(), + PkgPath: p.getPkgPath(), + PrecompiledSrcsZip: p.getPrecompiledSrcsZip(), + }) } func isValidPythonPath(path string) error { @@ -647,16 +664,16 @@ func (p *PythonLibraryModule) precompileSrcs(ctx android.ModuleContext) android. stdLib = p.srcsZip stdLibPkg = p.getPkgPath() } else { - ctx.VisitDirectDepsWithTag(hostStdLibTag, func(module android.Module) { - if dep, ok := module.(pythonDependency); ok { - stdLib = dep.getPrecompiledSrcsZip() - stdLibPkg = dep.getPkgPath() + ctx.VisitDirectDepsProxyWithTag(hostStdLibTag, func(module android.ModuleProxy) { + if dep, ok := android.OtherModuleProvider(ctx, module, PythonLibraryInfoProvider); ok { + stdLib = dep.PrecompiledSrcsZip + stdLibPkg = dep.PkgPath } }) } - ctx.VisitDirectDepsWithTag(hostLauncherTag, func(module android.Module) { - if dep, ok := module.(IntermPathProvider); ok { - optionalLauncher := dep.IntermPathForModuleOut() + ctx.VisitDirectDepsProxyWithTag(hostLauncherTag, func(module android.ModuleProxy) { + if dep, ok := android.OtherModuleProvider(ctx, module, cc.LinkableInfoProvider); ok { + optionalLauncher := dep.OutputFile if optionalLauncher.Valid() { launcher = optionalLauncher.Path() } @@ -664,9 +681,9 @@ func (p *PythonLibraryModule) precompileSrcs(ctx android.ModuleContext) android. }) var launcherSharedLibs android.Paths var ldLibraryPath []string - ctx.VisitDirectDepsWithTag(hostlauncherSharedLibTag, func(module android.Module) { - if dep, ok := module.(IntermPathProvider); ok { - optionalPath := dep.IntermPathForModuleOut() + ctx.VisitDirectDepsProxyWithTag(hostlauncherSharedLibTag, func(module android.ModuleProxy) { + if dep, ok := android.OtherModuleProvider(ctx, module, cc.LinkableInfoProvider); ok { + optionalPath := dep.OutputFile if optionalPath.Valid() { launcherSharedLibs = append(launcherSharedLibs, optionalPath.Path()) ldLibraryPath = append(ldLibraryPath, filepath.Dir(optionalPath.Path().String())) @@ -697,16 +714,6 @@ func (p *PythonLibraryModule) precompileSrcs(ctx android.ModuleContext) android. return out } -// isPythonLibModule returns whether the given module is a Python library PythonLibraryModule or not -func isPythonLibModule(module blueprint.Module) bool { - if _, ok := module.(*PythonLibraryModule); ok { - if _, ok := module.(*PythonBinaryModule); !ok { - return true - } - } - return false -} - // 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. @@ -727,7 +734,7 @@ func (p *PythonLibraryModule) collectPathsFromTransitiveDeps(ctx android.ModuleC var result android.Paths // visit all its dependencies in depth first. - ctx.WalkDeps(func(child, parent android.Module) bool { + ctx.WalkDepsProxy(func(child, _ android.ModuleProxy) bool { // we only collect dependencies tagged as python library deps if ctx.OtherModuleDependencyTag(child) != pythonLibTag { return false @@ -737,27 +744,29 @@ func (p *PythonLibraryModule) collectPathsFromTransitiveDeps(ctx android.ModuleC } seen[child] = true // Python modules only can depend on Python libraries. - if !isPythonLibModule(child) { + dep, isLibrary := android.OtherModuleProvider(ctx, child, PythonLibraryInfoProvider) + _, isBinary := android.OtherModuleProvider(ctx, child, PythonBinaryInfoProvider) + if !isLibrary || isBinary { ctx.PropertyErrorf("libs", "the dependency %q of module %q is not Python library!", 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 { - srcs := dep.getSrcsPathMappings() + if isLibrary { + srcs := dep.SrcsPathMappings for _, path := range srcs { checkForDuplicateOutputPath(ctx, destToPySrcs, path.dest, path.src.String(), ctx.ModuleName(), ctx.OtherModuleName(child)) } - data := dep.getDataPathMappings() + data := dep.DataPathMappings for _, path := range data { checkForDuplicateOutputPath(ctx, destToPyData, path.dest, path.src.String(), ctx.ModuleName(), ctx.OtherModuleName(child)) } if precompiled { - result = append(result, dep.getPrecompiledSrcsZip()) + result = append(result, dep.PrecompiledSrcsZip) } else { - result = append(result, dep.getSrcsZip()) + result = append(result, dep.SrcsZip) } } return true |