diff options
Diffstat (limited to 'meta/recipes-devtools/python/python')
4 files changed, 1422 insertions, 8 deletions
diff --git a/meta/recipes-devtools/python/python/create_manifest2.py b/meta/recipes-devtools/python/python/create_manifest2.py new file mode 100644 index 0000000000..4c55bd7d7a --- /dev/null +++ b/meta/recipes-devtools/python/python/create_manifest2.py @@ -0,0 +1,277 @@ +# This script is used as a bitbake task to create a new python manifest +# $ bitbake python -c create_manifest +# +# Our goal is to keep python-core as small as posible and add other python +# packages only when the user needs them, hence why we split upstream python +# into several packages. +# +# In a very simplistic way what this does is: +# Launch python and see specifically what is required for it to run at a minimum +# +# Go through the python-manifest file and launch a separate task for every single +# one of the files on each package, this task will check what was required for that +# specific module to run, these modules will be called dependencies. +# The output of such task will be a list of the modules or dependencies that were +# found for that file. +# +# Such output will be parsed by this script, we will look for each dependency on the +# manifest and if we find that another package already includes it, then we will add +# that package as an RDEPENDS to the package we are currently checking; in case we dont +# find the current dependency on any other package we will add it to the current package +# as part of FILES. +# +# +# This way we will create a new manifest from the data structure that was built during +# this process, ont this new manifest each package will contain specifically only +# what it needs to run. +# +# There are some caveats which we try to deal with, such as repeated files on different +# packages, packages that include folders, wildcards, and special packages. +# Its also important to note that this method only works for python files, and shared +# libraries. Static libraries, header files and binaries need to be dealt with manually. +# +# Author: Alejandro Enedino Hernandez Samaniego "aehs29" <alejandro.hernandez@intel.com> + + +import sys +import subprocess +import json +import os + +# Hack to get native python search path (for folders), not fond of it but it works for now +pivot='recipe-sysroot-native' +for p in sys.path: + if pivot in p: + nativelibfolder=p[:p.find(pivot)+len(pivot)] + +# Empty dict to hold the whole manifest +new_manifest = {} + +# Check for repeated files, folders and wildcards +allfiles=[] +repeated=[] +wildcards=[] + +hasfolders=[] +allfolders=[] + +def isFolder(value): + if os.path.isdir(value.replace('${libdir}',nativelibfolder+'/usr/lib')) or os.path.isdir(value.replace('${libdir}',nativelibfolder+'/usr/lib64')) or os.path.isdir(value.replace('${libdir}',nativelibfolder+'/usr/lib32')): + return True + else: + return False + +# Read existing JSON manifest +with open('python2-manifest.json') as manifest: + old_manifest=json.load(manifest) + + +# First pass to get core-package functionality, because we base everything on the fact that core is actually working +# Not exactly the same so it should not be a function +print ("Getting dependencies for core package:") + +# Special call to check for core package +output = subprocess.check_output([sys.executable, 'get_module_deps2.py', 'python-core-package']) +for item in output.split(): + # We append it so it doesnt hurt what we currently have: + if item not in old_manifest['core']['files']: + # We use the same data structure since its the one which will be used to check + # dependencies for other packages + old_manifest['core']['files'].append(item) + +for value in old_manifest['core']['files']: + # Ignore folders, since we don't import those, difficult to handle multilib + if isFolder(value): + # Pass it directly + if value not in old_manifest['core']['files']: + old_manifest['core']['files'].append(value) + # Ignore binaries, since we don't import those, assume it was added correctly (manually) + if '${bindir}' in value: + # Pass it directly + if value not in old_manifest['core']['files']: + old_manifest['core']['files'].append(value) + continue + # Ignore empty values + if value == '': + continue + if '${includedir}' in value: + if value not in old_manifest['core']['files']: + old_manifest['core']['files'].append(value) + continue + # Get module name , shouldnt be affected by libdir/bindir + value = os.path.splitext(os.path.basename(os.path.normpath(value)))[0] + + + # Launch separate task for each module for deterministic behavior + # Each module will only import what is necessary for it to work in specific + print ('Getting dependencies for module: %s' % value) + output = subprocess.check_output([sys.executable, 'get_module_deps2.py', '%s' % value]) + for item in output.split(): + # We append it so it doesnt hurt what we currently have: + if item not in old_manifest['core']['files']: + old_manifest['core']['files'].append(item) + +# We check which packages include folders +for key in old_manifest: + for value in old_manifest[key]['files']: + # Ignore folders, since we don't import those, difficult to handle multilib + if isFolder(value): + print ('%s is a folder' % value) + if key not in hasfolders: + hasfolders.append(key) + if value not in allfolders: + allfolders.append(value) + +for key in old_manifest: + # Use an empty dict as data structure to hold data for each package and fill it up + new_manifest[key]={} + new_manifest[key]['files']=[] + new_manifest[key]['rdepends']=[] + # All packages should depend on core + if key != 'core': + new_manifest[key]['rdepends'].append('core') + new_manifest[key]['summary']=old_manifest[key]['summary'] + + # Handle special cases, we assume that when they were manually added + # to the manifest we knew what we were doing. + print ('Handling package %s' % key) + special_packages=['misc', 'modules', 'dev'] + if key in special_packages or 'staticdev' in key: + print('Passing %s package directly' % key) + new_manifest[key]=old_manifest[key] + continue + + for value in old_manifest[key]['files']: + # We already handled core on the first pass + if key == 'core': + new_manifest[key]['files'].append(value) + continue + # Ignore folders, since we don't import those, difficult to handle multilib + if isFolder(value): + # Pass folders directly + new_manifest[key]['files'].append(value) + # Ignore binaries, since we don't import those + if '${bindir}' in value: + # Pass it directly to the new manifest data structure + if value not in new_manifest[key]['files']: + new_manifest[key]['files'].append(value) + continue + # Ignore empty values + if value == '': + continue + if '${includedir}' in value: + if value not in new_manifest[key]['files']: + new_manifest[key]['files'].append(value) + continue + # Get module name , shouldnt be affected by libdir/bindir + value = os.path.splitext(os.path.basename(os.path.normpath(value)))[0] + + # Launch separate task for each module for deterministic behavior + # Each module will only import what is necessary for it to work in specific + print ('Getting dependencies for module: %s' % value) + output = subprocess.check_output([sys.executable, 'get_module_deps2.py', '%s' % value]) + + # We can print dependencies for debugging purposes + #print (output) + # Output will have all dependencies + for item in output.split(): + + # Warning: This first part is ugly + # One of the dependencies that was found, could be inside of one of the folders included by another package + # We need to check if this happens so we can add the package containing the folder as an RDEPENDS + # e.g. Folder encodings contained in codecs + # This would be solved if no packages included any folders + + # This can be done in two ways: + # 1 - We assume that if we take out the filename from the path we would get + # the folder string, then we would check if folder string is in the list of folders + # This would not work if a package contains a folder which contains another folder + # e.g. path/folder1/folder2/filename folder_string= path/folder1/folder2 + # folder_string would not match any value contained in the list of folders + # + # 2 - We do it the other way around, checking if the folder is contained in the path + # e.g. path/folder1/folder2/filename folder_string= path/folder1/folder2 + # is folder_string inside path/folder1/folder2/filename?, + # Yes, it works, but we waste a couple of milliseconds. + + inFolders=False + for folder in allfolders: + if folder in item: + inFolders = True # Did we find a folder? + folderFound = False # Second flag to break inner for + # Loop only through packages which contain folders + for keyfolder in hasfolders: + if (folderFound == False): + #print("Checking folder %s on package %s" % (item,keyfolder)) + for file_folder in old_manifest[keyfolder]['files']: + if file_folder==folder: + print ('%s found in %s' % (folder, keyfolder)) + folderFound = True + if keyfolder not in new_manifest[key]['rdepends'] and keyfolder != key: + new_manifest[key]['rdepends'].append(keyfolder) + else: + break + + # A folder was found so we're done with this item, we can go on + if inFolders: + continue + + # We might already have it on the dictionary since it could depend on a (previously checked) module + if item not in new_manifest[key]['files']: + # Handle core as a special package, we already did it so we pass it to NEW data structure directly + if key=='core': + print('Adding %s to %s FILES' % (item, key)) + if item.endswith('*'): + wildcards.append(item) + new_manifest[key]['files'].append(item) + + # Check for repeated files + if item not in allfiles: + allfiles.append(item) + else: + repeated.append(item) + + else: + + # Check if this dependency is already contained on another package, so we add it + # as an RDEPENDS, or if its not, it means it should be contained on the current + # package, so we should add it to FILES + for newkey in old_manifest: + # Debug + #print("Checking %s " % item + " in %s" % newkey) + if item in old_manifest[newkey]['files']: + # Since were nesting, we need to check its not the same key + if(newkey!=key): + if newkey not in new_manifest[key]['rdepends']: + # Add it to the new manifest data struct + # Debug + print('Adding %s to %s RDEPENDS, because it contains %s' % (newkey, key, item)) + new_manifest[key]['rdepends'].append(newkey) + break + else: + # Debug + print('Adding %s to %s FILES' % (item, key)) + # Since it wasnt found on another package, its not an RDEP, so add it to FILES for this package + new_manifest[key]['files'].append(item) + if item.endswith('*'): + wildcards.append(item) + if item not in allfiles: + allfiles.append(item) + else: + repeated.append(item) + +print ('The following files are repeated (contained in more than one package), please check which package should get it:') +print (repeated) +print('The following files contain wildcards, please check they are necessary') +print(wildcards) +print('The following files contain folders, please check they are necessary') +print(hasfolders) + +# Sort it just so it looks nice +for key in new_manifest: + new_manifest[key]['files'].sort() + new_manifest[key]['rdepends'].sort() + +# Create the manifest from the data structure that was built +with open('python2-manifest.json.new','w') as outfile: + json.dump(new_manifest,outfile,sort_keys=True, indent=4) diff --git a/meta/recipes-devtools/python/python/get_module_deps2.py b/meta/recipes-devtools/python/python/get_module_deps2.py new file mode 100644 index 0000000000..4719d81e82 --- /dev/null +++ b/meta/recipes-devtools/python/python/get_module_deps2.py @@ -0,0 +1,112 @@ +# This script is launched on separate task for each python module +# It checks for dependencies for that specific module and prints +# them out, the output of this execution will have all dependencies +# for a specific module, which will be parsed an dealt on create_manifest.py +# +# Author: Alejandro Enedino Hernandez Samaniego "aehs29" <alejandro.hernandez@intel.com> + + +# We can get a log per module, for all the dependencies that were found, but its messy. +debug=False + +import sys + +# We can get a list of the modules which are currently required to run python +# so we run python-core and get its modules, we then import what we need +# and check what modules are currently running, if we substract them from the +# modules we had initially, we get the dependencies for the module we imported. + +# We use importlib to achieve this, so we also need to know what modules importlib needs +import importlib + +core_deps=set(sys.modules) + +def fix_path(dep_path): + import os + # We DONT want the path on our HOST system + pivot='recipe-sysroot-native' + dep_path=dep_path[dep_path.find(pivot)+len(pivot):] + + if '/usr/bin' in dep_path: + dep_path = dep_path.replace('/usr/bin''${bindir}') + + # Handle multilib, is there a better way? + if '/usr/lib32' in dep_path: + dep_path = dep_path.replace('/usr/lib32','${libdir}') + if '/usr/lib64' in dep_path: + dep_path = dep_path.replace('/usr/lib64','${libdir}') + if '/usr/lib' in dep_path: + dep_path = dep_path.replace('/usr/lib','${libdir}') + if '/usr/include' in dep_path: + dep_path = dep_path.replace('/usr/include','${includedir}') + if '__init__.' in dep_path: + dep_path = os.path.split(dep_path)[0] + + # If a *.pyc file was imported, we replace it with *.py (since we deal with PYCs on create_manifest) + if '.pyc' in dep_path: + dep_path = dep_path.replace('.pyc','.py') + + return dep_path + +# Module to import was passed as an argument +current_module = str(sys.argv[1]).rstrip() +if(debug==True): + log = open('log_%s' % current_module,'w') + log.write('Module %s generated the following dependencies:\n' % current_module) +try: + importlib.import_module('%s' % current_module) +except ImportError as e: + if (debug==True): + log.write('Module was not found') + pass + + +# Get current module dependencies, dif will contain a list of specific deps for this module +module_deps=set(sys.modules) + +# We handle the core package (1st pass on create_manifest.py) as a special case +if current_module == 'python-core-package': + dif = core_deps +else: + dif = module_deps-core_deps + + +# Check where each dependency came from +for item in dif: + dep_path='' + try: + if (debug==True): + log.write('Calling: sys.modules[' + '%s' % item + '].__file__\n') + dep_path = sys.modules['%s' % item].__file__ + except AttributeError as e: + # Deals with thread (builtin module) not having __file__ attribute + if debug==True: + log.write(item + ' ') + log.write(str(e)) + log.write('\n') + pass + except NameError as e: + # Deals with NameError: name 'dep_path' is not defined + # because module is not found (wasn't compiled?), e.g. bddsm + if (debug==True): + log.write(item+' ') + log.write(str(e)) + pass + + # Site-customize is a special case since we (OpenEmbedded) put it there manually + if 'sitecustomize' in dep_path: + dep_path = '${libdir}/python2.7/sitecustomize.py' + # Prints out result, which is what will be used by create_manifest + print (dep_path) + continue + + dep_path = fix_path(dep_path) + + if (debug==True): + log.write(dep_path+'\n') + + # Prints out result, which is what will be used by create_manifest + print (dep_path) + +if debug==True: + log.close() diff --git a/meta/recipes-devtools/python/python/python2-manifest.json b/meta/recipes-devtools/python/python/python2-manifest.json new file mode 100644 index 0000000000..2e32597155 --- /dev/null +++ b/meta/recipes-devtools/python/python/python2-manifest.json @@ -0,0 +1,1033 @@ +{ + "2to3": { + "files": [ + "${bindir}/2to3", + "${libdir}/python2.7/lib2to3" + ], + "rdepends": [ + "core" + ], + "summary": "Python automated Python 2 to 3 code translator" + }, + "argparse": { + "files": [ + "${libdir}/python2.7/argparse.py" + ], + "rdepends": [ + "codecs", + "core", + "lang", + "textutils" + ], + "summary": "Python command line argument parser" + }, + "audio": { + "files": [ + "${libdir}/python2.7/audiodev.py", + "${libdir}/python2.7/chunk.py", + "${libdir}/python2.7/lib-dynload/audioop.so", + "${libdir}/python2.7/lib-dynload/ossaudiodev.so", + "${libdir}/python2.7/sndhdr.py", + "${libdir}/python2.7/sunau.py", + "${libdir}/python2.7/sunaudio.py", + "${libdir}/python2.7/toaiff.py", + "${libdir}/python2.7/wave.py" + ], + "rdepends": [ + "core", + "crypt", + "fcntl", + "io", + "math" + ], + "summary": "Python Audio Handling" + }, + "bsddb": { + "files": [ + "${libdir}/python2.7/bsddb", + "${libdir}/python2.7/lib-dynload/_bsddb.so" + ], + "rdepends": [ + "core" + ], + "summary": "Python bindings for the Berkeley Database" + }, + "codecs": { + "files": [ + "${libdir}/python2.7/gettext.py", + "${libdir}/python2.7/lib-dynload/_codecs_cn.so", + "${libdir}/python2.7/lib-dynload/_codecs_hk.so", + "${libdir}/python2.7/lib-dynload/_codecs_iso2022.so", + "${libdir}/python2.7/lib-dynload/_codecs_jp.so", + "${libdir}/python2.7/lib-dynload/_codecs_kr.so", + "${libdir}/python2.7/lib-dynload/_codecs_tw.so", + "${libdir}/python2.7/lib-dynload/_multibytecodec.so", + "${libdir}/python2.7/lib-dynload/unicodedata.so", + "${libdir}/python2.7/locale.py", + "${libdir}/python2.7/stringprep.py", + "${libdir}/python2.7/xdrlib.py" + ], + "rdepends": [ + "core", + "io", + "lang" + ], + "summary": "Python codec" + }, + "compile": { + "files": [ + "${libdir}/python2.7/compileall.py", + "${libdir}/python2.7/py_compile.py" + ], + "rdepends": [ + "core" + ], + "summary": "Python bytecode compilation support" + }, + "compiler": { + "files": [ + "${libdir}/python2.7/compiler" + ], + "rdepends": [ + "core", + "io", + "lang" + ], + "summary": "Python compiler support" + }, + "compression": { + "files": [ + "${libdir}/python2.7/gzip.py", + "${libdir}/python2.7/lib-dynload/bz2.so", + "${libdir}/python2.7/tarfile.py", + "${libdir}/python2.7/zipfile.py" + ], + "rdepends": [ + "core", + "io", + "shell", + "unixadmin", + "zlib" + ], + "summary": "Python high-level compression support" + }, + "contextlib": { + "files": [ + "${libdir}/python2.7/contextlib.py" + ], + "rdepends": [ + "core", + "lang" + ], + "summary": "Python utilities for with-statementcontexts." + }, + "core": { + "files": [ + "${bindir}/python*", + "${includedir}/python2.7/pyconfig*.h", + "${libdir}/python2.7/ConfigParser.py", + "${libdir}/python2.7/UserDict.py", + "${libdir}/python2.7/UserList.py", + "${libdir}/python2.7/UserString.py", + "${libdir}/python2.7/__future__.py", + "${libdir}/python2.7/_abcoll.py", + "${libdir}/python2.7/_sysconfigdata.py", + "${libdir}/python2.7/_weakrefset.py", + "${libdir}/python2.7/abc.py", + "${libdir}/python2.7/ast.py", + "${libdir}/python2.7/atexit.py", + "${libdir}/python2.7/codecs.py", + "${libdir}/python2.7/collections.py", + "${libdir}/python2.7/copy.py", + "${libdir}/python2.7/copy_reg.py", + "${libdir}/python2.7/encodings", + "${libdir}/python2.7/encodings/aliases.py", + "${libdir}/python2.7/encodings/utf_8.py", + "${libdir}/python2.7/genericpath.py", + "${libdir}/python2.7/getopt.py", + "${libdir}/python2.7/heapq.py", + "${libdir}/python2.7/importlib", + "${libdir}/python2.7/keyword.py", + "${libdir}/python2.7/lib-dynload/_collections.so", + "${libdir}/python2.7/lib-dynload/_heapq.so", + "${libdir}/python2.7/lib-dynload/_locale.so", + "${libdir}/python2.7/lib-dynload/_struct.so", + "${libdir}/python2.7/lib-dynload/binascii.so", + "${libdir}/python2.7/lib-dynload/itertools.so", + "${libdir}/python2.7/lib-dynload/operator.so", + "${libdir}/python2.7/lib-dynload/readline.so", + "${libdir}/python2.7/lib-dynload/strop.so", + "${libdir}/python2.7/lib-dynload/time.so", + "${libdir}/python2.7/lib-dynload/xreadlines.so", + "${libdir}/python2.7/linecache.py", + "${libdir}/python2.7/new.py", + "${libdir}/python2.7/os.py", + "${libdir}/python2.7/platform.py", + "${libdir}/python2.7/posixpath.py", + "${libdir}/python2.7/re.py", + "${libdir}/python2.7/rlcompleter.py", + "${libdir}/python2.7/site.py", + "${libdir}/python2.7/sitecustomize.py", + "${libdir}/python2.7/sre_compile.py", + "${libdir}/python2.7/sre_constants.py", + "${libdir}/python2.7/sre_parse.py", + "${libdir}/python2.7/stat.py", + "${libdir}/python2.7/string.py", + "${libdir}/python2.7/struct.py", + "${libdir}/python2.7/sysconfig.py", + "${libdir}/python2.7/traceback.py", + "${libdir}/python2.7/types.py", + "${libdir}/python2.7/warnings.py", + "${libdir}/python2.7/weakref.py" + ], + "rdepends": [], + "summary": "Python interpreter and core modules" + }, + "crypt": { + "files": [ + "${libdir}/python2.7/hashlib.py", + "${libdir}/python2.7/lib-dynload/_hashlib.so", + "${libdir}/python2.7/lib-dynload/crypt.so", + "${libdir}/python2.7/md5.py", + "${libdir}/python2.7/sha.py" + ], + "rdepends": [ + "core" + ], + "summary": "Python basic cryptographic and hashing support" + }, + "ctypes": { + "files": [ + "${libdir}/python2.7/ctypes", + "${libdir}/python2.7/lib-dynload/_ctypes.so", + "${libdir}/python2.7/lib-dynload/_ctypes_test.so" + ], + "rdepends": [ + "core" + ], + "summary": "Python C types support" + }, + "curses": { + "files": [ + "${libdir}/python2.7/curses", + "${libdir}/python2.7/lib-dynload/_curses.so", + "${libdir}/python2.7/lib-dynload/_curses_panel.so" + ], + "rdepends": [ + "core" + ], + "summary": "Python curses support" + }, + "datetime": { + "files": [ + "${libdir}/python2.7/_strptime.py", + "${libdir}/python2.7/calendar.py", + "${libdir}/python2.7/lib-dynload/datetime.so" + ], + "rdepends": [ + "codecs", + "core", + "lang" + ], + "summary": "Python calendar and time support" + }, + "db": { + "files": [ + "${libdir}/python2.7/anydbm.py", + "${libdir}/python2.7/dbhash.py", + "${libdir}/python2.7/dumbdbm.py", + "${libdir}/python2.7/lib-dynload/dbm.so", + "${libdir}/python2.7/whichdb.py" + ], + "rdepends": [ + "bsddb", + "core", + "gdbm" + ], + "summary": "Python file-based database support" + }, + "debugger": { + "files": [ + "${libdir}/python2.7/bdb.py", + "${libdir}/python2.7/pdb.py" + ], + "rdepends": [ + "core", + "io", + "lang", + "pprint", + "shell" + ], + "summary": "Python debugger" + }, + "dev": { + "files": [ + "${base_libdir}/*.a", + "${base_libdir}/*.o", + "${datadir}/aclocal", + "${datadir}/pkgconfig", + "${includedir}", + "${libdir}/*.a", + "${libdir}/*.la", + "${libdir}/*.o", + "${libdir}/lib*${SOLIBSDEV}", + "${libdir}/pkgconfig", + "${libdir}/python2.7/config/Makefile" + ], + "rdepends": [ + "core" + ], + "summary": "Python development package" + }, + "difflib": { + "files": [ + "${libdir}/python2.7/difflib.py" + ], + "rdepends": [ + "core", + "lang" + ], + "summary": "Python helpers for computing deltas between objects" + }, + "distutils": { + "files": [ + "${libdir}/python2.7/config", + "${libdir}/python2.7/distutils" + ], + "rdepends": [ + "core" + ], + "summary": "Python Distribution Utilities" + }, + "distutils-staticdev": { + "files": [ + "${libdir}/python2.7/config/lib*.a" + ], + "rdepends": [ + "distutils" + ], + "summary": "Python distribution utilities (static libraries)" + }, + "doctest": { + "files": [ + "${libdir}/python2.7/doctest.py" + ], + "rdepends": [ + "core", + "crypt", + "debugger", + "difflib", + "fcntl", + "io", + "lang", + "math", + "pprint", + "shell", + "unittest" + ], + "summary": "Python framework for running examples in docstrings" + }, + "email": { + "files": [ + "${libdir}/python2.7/email", + "${libdir}/python2.7/imaplib.py" + ], + "rdepends": [ + "contextlib", + "core", + "crypt", + "fcntl", + "io", + "lang", + "math", + "netclient", + "pickle", + "subprocess", + "textutils" + ], + "summary": "Python email support" + }, + "fcntl": { + "files": [ + "${libdir}/python2.7/lib-dynload/fcntl.so" + ], + "rdepends": [ + "core" + ], + "summary": "Python's fcntl interface" + }, + "gdbm": { + "files": [ + "${libdir}/python2.7/lib-dynload/gdbm.so" + ], + "rdepends": [ + "core" + ], + "summary": "Python GNU database support" + }, + "hotshot": { + "files": [ + "${libdir}/python2.7/hotshot", + "${libdir}/python2.7/lib-dynload/_hotshot.so" + ], + "rdepends": [ + "core" + ], + "summary": "Python hotshot performance profiler" + }, + "html": { + "files": [ + "${libdir}/python2.7/HTMLParser.py", + "${libdir}/python2.7/formatter.py", + "${libdir}/python2.7/htmlentitydefs.py", + "${libdir}/python2.7/htmllib.py", + "${libdir}/python2.7/markupbase.py", + "${libdir}/python2.7/sgmllib.py" + ], + "rdepends": [ + "core" + ], + "summary": "Python HTML processing support" + }, + "idle": { + "files": [ + "${bindir}/idle", + "${libdir}/python2.7/idlelib" + ], + "rdepends": [ + "core" + ], + "summary": "Python Integrated Development Environment" + }, + "image": { + "files": [ + "${libdir}/python2.7/colorsys.py", + "${libdir}/python2.7/imghdr.py" + ], + "rdepends": [ + "core" + ], + "summary": "Python graphical image handling" + }, + "io": { + "files": [ + "${libdir}/python2.7/StringIO.py", + "${libdir}/python2.7/_pyio.py", + "${libdir}/python2.7/io.py", + "${libdir}/python2.7/lib-dynload/_io.so", + "${libdir}/python2.7/lib-dynload/_socket.so", + "${libdir}/python2.7/lib-dynload/_ssl.so", + "${libdir}/python2.7/lib-dynload/cStringIO.so", + "${libdir}/python2.7/lib-dynload/select.so", + "${libdir}/python2.7/lib-dynload/termios.so", + "${libdir}/python2.7/pipes.py", + "${libdir}/python2.7/socket.py", + "${libdir}/python2.7/ssl.py", + "${libdir}/python2.7/tempfile.py" + ], + "rdepends": [ + "contextlib", + "core", + "crypt", + "fcntl", + "lang", + "math", + "netclient", + "textutils" + ], + "summary": "Python low-level I/O" + }, + "json": { + "files": [ + "${libdir}/python2.7/json", + "${libdir}/python2.7/lib-dynload/_json.so" + ], + "rdepends": [ + "core" + ], + "summary": "Python JSON support" + }, + "lang": { + "files": [ + "${libdir}/python2.7/bisect.py", + "${libdir}/python2.7/code.py", + "${libdir}/python2.7/codeop.py", + "${libdir}/python2.7/dis.py", + "${libdir}/python2.7/functools.py", + "${libdir}/python2.7/inspect.py", + "${libdir}/python2.7/lib-dynload/_bisect.so", + "${libdir}/python2.7/lib-dynload/_functools.so", + "${libdir}/python2.7/lib-dynload/array.so", + "${libdir}/python2.7/lib-dynload/parser.so", + "${libdir}/python2.7/opcode.py", + "${libdir}/python2.7/repr.py", + "${libdir}/python2.7/symbol.py", + "${libdir}/python2.7/token.py", + "${libdir}/python2.7/tokenize.py" + ], + "rdepends": [ + "core" + ], + "summary": "Python low-level language support" + }, + "logging": { + "files": [ + "${libdir}/python2.7/logging" + ], + "rdepends": [ + "core", + "io", + "threading" + ], + "summary": "Python logging support" + }, + "mailbox": { + "files": [ + "${libdir}/python2.7/mailbox.py" + ], + "rdepends": [ + "codecs", + "contextlib", + "core", + "crypt", + "datetime", + "email", + "fcntl", + "io", + "lang", + "math", + "mime", + "netclient", + "textutils" + ], + "summary": "Python mailbox format support" + }, + "math": { + "files": [ + "${libdir}/python2.7/lib-dynload/_random.so", + "${libdir}/python2.7/lib-dynload/cmath.so", + "${libdir}/python2.7/lib-dynload/math.so", + "${libdir}/python2.7/random.py", + "${libdir}/python2.7/sets.py" + ], + "rdepends": [ + "core", + "crypt" + ], + "summary": "Python math support" + }, + "mime": { + "files": [ + "${libdir}/python2.7/MimeWriter.py", + "${libdir}/python2.7/mimetools.py", + "${libdir}/python2.7/mimetypes.py", + "${libdir}/python2.7/quopri.py", + "${libdir}/python2.7/rfc822.py", + "${libdir}/python2.7/uu.py" + ], + "rdepends": [ + "contextlib", + "core", + "crypt", + "fcntl", + "io", + "lang", + "math", + "netclient", + "textutils" + ], + "summary": "Python MIME handling APIs" + }, + "mmap": { + "files": [ + "${libdir}/python2.7/lib-dynload/mmap.so" + ], + "rdepends": [ + "core" + ], + "summary": "Python memory-mapped file support" + }, + "modules": { + "files": [], + "rdepends": [ + "2to3", + "argparse", + "audio", + "bsddb", + "codecs", + "compile", + "compiler", + "compression", + "contextlib", + "core", + "crypt", + "ctypes", + "curses", + "datetime", + "db", + "debugger", + "difflib", + "distutils", + "doctest", + "email", + "fcntl", + "gdbm", + "hotshot", + "html", + "idle", + "image", + "io", + "json", + "lang", + "logging", + "mailbox", + "math", + "mime", + "mmap", + "multiprocessing", + "netclient", + "netserver", + "numbers", + "pickle", + "pkgutil", + "plistlib", + "pprint", + "profile", + "pydoc", + "re", + "resource", + "robotparser", + "shell", + "smtpd", + "sqlite3", + "sqlite3", + "stringold", + "subprocess", + "syslog", + "terminal", + "tests", + "textutils", + "threading", + "tkinter", + "unittest", + "unixadmin", + "xml", + "xmlrpc", + "zlib" + ], + "summary": "All Python modules" + }, + "multiprocessing": { + "files": [ + "${libdir}/python2.7/lib-dynload/_multiprocessing.so", + "${libdir}/python2.7/multiprocessing" + ], + "rdepends": [ + "core", + "fcntl", + "io", + "pickle", + "subprocess", + "threading" + ], + "summary": "Python multiprocessing support" + }, + "netclient": { + "files": [ + "${libdir}/python2.7/Cookie.py", + "${libdir}/python2.7/_LWPCookieJar.py", + "${libdir}/python2.7/_MozillaCookieJar.py", + "${libdir}/python2.7/base64.py", + "${libdir}/python2.7/cookielib.py", + "${libdir}/python2.7/ftplib.py", + "${libdir}/python2.7/hmac.py", + "${libdir}/python2.7/httplib.py", + "${libdir}/python2.7/nntplib.py", + "${libdir}/python2.7/poplib.py", + "${libdir}/python2.7/smtplib.py", + "${libdir}/python2.7/telnetlib.py", + "${libdir}/python2.7/urllib.py", + "${libdir}/python2.7/urllib2.py", + "${libdir}/python2.7/urlparse.py", + "${libdir}/python2.7/uuid.py" + ], + "rdepends": [ + "codecs", + "contextlib", + "core", + "crypt", + "ctypes", + "datetime", + "email", + "fcntl", + "io", + "lang", + "math", + "mime", + "pickle", + "subprocess", + "textutils", + "threading" + ], + "summary": "Python Internet Protocol clients" + }, + "netserver": { + "files": [ + "${libdir}/python2.7/BaseHTTPServer.py", + "${libdir}/python2.7/CGIHTTPServer.py", + "${libdir}/python2.7/SimpleHTTPServer.py", + "${libdir}/python2.7/SocketServer.py", + "${libdir}/python2.7/cgi.py" + ], + "rdepends": [ + "contextlib", + "core", + "crypt", + "fcntl", + "io", + "lang", + "math", + "mime", + "netclient", + "shell", + "textutils", + "threading", + "unixadmin" + ], + "summary": "Python Internet Protocol servers" + }, + "numbers": { + "files": [ + "${libdir}/python2.7/decimal.py", + "${libdir}/python2.7/fractions.py", + "${libdir}/python2.7/numbers.py" + ], + "rdepends": [ + "codecs", + "core", + "lang", + "math", + "threading" + ], + "summary": "Python number APIs" + }, + "pickle": { + "files": [ + "${libdir}/python2.7/lib-dynload/cPickle.so", + "${libdir}/python2.7/pickle.py", + "${libdir}/python2.7/pickletools.py", + "${libdir}/python2.7/shelve.py" + ], + "rdepends": [ + "core", + "io" + ], + "summary": "Python serialisation/persistence support" + }, + "pkgutil": { + "files": [ + "${libdir}/python2.7/pkgutil.py" + ], + "rdepends": [ + "core" + ], + "summary": "Python package extension utility support" + }, + "plistlib": { + "files": [ + "${libdir}/python2.7/plistlib.py" + ], + "rdepends": [ + "core", + "datetime", + "io" + ], + "summary": "Generate and parse Mac OS X .plist files" + }, + "pprint": { + "files": [ + "${libdir}/python2.7/pprint.py" + ], + "rdepends": [ + "core", + "io" + ], + "summary": "Python pretty-print support" + }, + "profile": { + "files": [ + "${libdir}/python2.7/cProfile.py", + "${libdir}/python2.7/lib-dynload/_lsprof.so", + "${libdir}/python2.7/profile.py", + "${libdir}/python2.7/pstats.py" + ], + "rdepends": [ + "codecs", + "core", + "lang", + "resource", + "textutils" + ], + "summary": "Python basic performance profiling support" + }, + "pydoc": { + "files": [ + "${bindir}/pydoc", + "${libdir}/python2.7/pydoc.py", + "${libdir}/python2.7/pydoc_data" + ], + "rdepends": [ + "codecs", + "core", + "lang", + "pkgutil" + ], + "summary": "Python interactive help support" + }, + "re": { + "files": [ + "${libdir}/python2.7/sre.py" + ], + "rdepends": [ + "core" + ], + "summary": "Python Regular Expression APIs" + }, + "resource": { + "files": [ + "${libdir}/python2.7/lib-dynload/resource.so" + ], + "rdepends": [ + "core" + ], + "summary": "Python resource control interface" + }, + "robotparser": { + "files": [ + "${libdir}/python2.7/robotparser.py" + ], + "rdepends": [ + "contextlib", + "core", + "io", + "lang", + "netclient", + "textutils" + ], + "summary": "Python robots.txt parser" + }, + "shell": { + "files": [ + "${libdir}/python2.7/cmd.py", + "${libdir}/python2.7/commands.py", + "${libdir}/python2.7/dircache.py", + "${libdir}/python2.7/fnmatch.py", + "${libdir}/python2.7/glob.py", + "${libdir}/python2.7/popen2.py", + "${libdir}/python2.7/shlex.py", + "${libdir}/python2.7/shutil.py" + ], + "rdepends": [ + "core", + "io", + "unixadmin" + ], + "summary": "Python shell-like functionality" + }, + "smtpd": { + "files": [ + "${bindir}/smtpd.py", + "${libdir}/python2.7/asynchat.py", + "${libdir}/python2.7/asyncore.py", + "${libdir}/python2.7/smtpd.py" + ], + "rdepends": [ + "core", + "fcntl", + "io", + "lang" + ], + "summary": "Python Simple Mail Transport Daemon" + }, + "sqlite3": { + "files": [ + "${libdir}/python2.7/lib-dynload/_sqlite3.so" + ], + "rdepends": [ + "core" + ], + "summary": "Python Sqlite3 database support" + }, + "sqlite3-tests": { + "files": [ + "${libdir}/python2.7/sqlite3/test" + ], + "rdepends": [ + "core", + "tests" + ], + "summary": "Python Sqlite3 database support tests" + }, + "stringold": { + "files": [ + "${libdir}/python2.7/stringold.py" + ], + "rdepends": [ + "core" + ], + "summary": "Python string APIs [deprecated]" + }, + "subprocess": { + "files": [ + "${libdir}/python2.7/subprocess.py" + ], + "rdepends": [ + "core", + "fcntl", + "io", + "pickle" + ], + "summary": "Python subprocess support" + }, + "syslog": { + "files": [ + "${libdir}/python2.7/lib-dynload/syslog.so" + ], + "rdepends": [ + "core" + ], + "summary": "Python syslog interface" + }, + "terminal": { + "files": [ + "${libdir}/python2.7/pty.py", + "${libdir}/python2.7/tty.py" + ], + "rdepends": [ + "core", + "io" + ], + "summary": "Python terminal controlling support" + }, + "tests": { + "files": [ + "${libdir}/python2.7/test" + ], + "rdepends": [ + "core" + ], + "summary": "Python tests" + }, + "textutils": { + "files": [ + "${libdir}/python2.7/csv.py", + "${libdir}/python2.7/lib-dynload/_csv.so", + "${libdir}/python2.7/optparse.py", + "${libdir}/python2.7/textwrap.py" + ], + "rdepends": [ + "codecs", + "core", + "io", + "lang" + ], + "summary": "Python option parsin" + }, + "threading": { + "files": [ + "${libdir}/python2.7/Queue.py", + "${libdir}/python2.7/_threading_local.py", + "${libdir}/python2.7/dummy_thread.py", + "${libdir}/python2.7/dummy_threading.py", + "${libdir}/python2.7/mutex.py", + "${libdir}/python2.7/threading.py" + ], + "rdepends": [ + "core" + ], + "summary": "Python threading & synchronization support" + }, + "tkinter": { + "files": [ + "${libdir}/python2.7/lib-tk" + ], + "rdepends": [ + "core" + ], + "summary": "Python Tcl/Tk bindings" + }, + "unittest": { + "files": [ + "${libdir}/python2.7/unittest" + ], + "rdepends": [ + "core", + "difflib", + "io", + "lang", + "pprint", + "shell" + ], + "summary": "Python unit testing framework" + }, + "unixadmin": { + "files": [ + "${libdir}/python2.7/getpass.py", + "${libdir}/python2.7/lib-dynload/grp.so", + "${libdir}/python2.7/lib-dynload/nis.so" + ], + "rdepends": [ + "core", + "io" + ], + "summary": "Python Unix administration support" + }, + "xml": { + "files": [ + "${libdir}/python2.7/lib-dynload/_elementtree.so", + "${libdir}/python2.7/lib-dynload/pyexpat.so", + "${libdir}/python2.7/xml" + ], + "rdepends": [ + "core" + ], + "summary": "Python basic XML support" + }, + "xmlrpc": { + "files": [ + "${libdir}/python2.7/DocXMLRPCServer.py", + "${libdir}/python2.7/SimpleXMLRPCServer.py" + ], + "rdepends": [ + "codecs", + "compression", + "contextlib", + "core", + "crypt", + "datetime", + "fcntl", + "io", + "lang", + "math", + "mime", + "netclient", + "netserver", + "pkgutil", + "pydoc", + "textutils", + "threading", + "xml", + "zlib" + ], + "summary": "Python XML-RPC support" + }, + "zlib": { + "files": [ + "${libdir}/python2.7/lib-dynload/zlib.so" + ], + "rdepends": [ + "core" + ], + "summary": "Python zlib compression support" + } +}
\ No newline at end of file diff --git a/meta/recipes-devtools/python/python/sitecustomize.py b/meta/recipes-devtools/python/python/sitecustomize.py index 273901898a..4c8b5e2ba3 100644 --- a/meta/recipes-devtools/python/python/sitecustomize.py +++ b/meta/recipes-devtools/python/python/sitecustomize.py @@ -27,19 +27,11 @@ def __enableReadlineSupport(): except IOError: pass -def __enableDefaultEncoding(): - import sys - try: - sys.setdefaultencoding( "utf8" ) - except LookupError: - pass - import sys try: import rlcompleter, readline except ImportError: pass else: - __enableDefaultEncoding() __registerExitHandler() __enableReadlineSupport() |