| def runstrip(arg): |
| # Function to strip a single file, called from split_and_strip_files below |
| # A working 'file' (one which works on the target architecture) |
| # |
| # The elftype is a bit pattern (explained in split_and_strip_files) to tell |
| # us what type of file we're processing... |
| # 4 - executable |
| # 8 - shared library |
| # 16 - kernel module |
| |
| import commands, stat, subprocess |
| |
| (file, elftype, strip) = arg |
| |
| newmode = None |
| if not os.access(file, os.W_OK) or os.access(file, os.R_OK): |
| origmode = os.stat(file)[stat.ST_MODE] |
| newmode = origmode | stat.S_IWRITE | stat.S_IREAD |
| os.chmod(file, newmode) |
| |
| extraflags = "" |
| |
| # kernel module |
| if elftype & 16: |
| extraflags = "--strip-debug --remove-section=.comment --remove-section=.note --preserve-dates" |
| # .so and shared library |
| elif ".so" in file and elftype & 8: |
| extraflags = "--remove-section=.comment --remove-section=.note --strip-unneeded" |
| # shared or executable: |
| elif elftype & 8 or elftype & 4: |
| extraflags = "--remove-section=.comment --remove-section=.note" |
| |
| stripcmd = "'%s' %s '%s'" % (strip, extraflags, file) |
| bb.debug(1, "runstrip: %s" % stripcmd) |
| |
| try: |
| output = subprocess.check_output(stripcmd, stderr=subprocess.STDOUT, shell=True) |
| except subprocess.CalledProcessError as e: |
| bb.error("runstrip: '%s' strip command failed with %s (%s)" % (stripcmd, e.returncode, e.output)) |
| |
| if newmode: |
| os.chmod(file, origmode) |
| |
| return |
| |
| |
| def file_translate(file): |
| ft = file.replace("@", "@at@") |
| ft = ft.replace(" ", "@space@") |
| ft = ft.replace("\t", "@tab@") |
| ft = ft.replace("[", "@openbrace@") |
| ft = ft.replace("]", "@closebrace@") |
| ft = ft.replace("_", "@underscore@") |
| return ft |
| |
| def filedeprunner(arg): |
| import re, subprocess, shlex |
| |
| (pkg, pkgfiles, rpmdeps, pkgdest) = arg |
| provides = {} |
| requires = {} |
| |
| r = re.compile(r'[<>=]+ +[^ ]*') |
| |
| def process_deps(pipe, pkg, pkgdest, provides, requires): |
| for line in pipe: |
| f = line.split(" ", 1)[0].strip() |
| line = line.split(" ", 1)[1].strip() |
| |
| if line.startswith("Requires:"): |
| i = requires |
| elif line.startswith("Provides:"): |
| i = provides |
| else: |
| continue |
| |
| file = f.replace(pkgdest + "/" + pkg, "") |
| file = file_translate(file) |
| value = line.split(":", 1)[1].strip() |
| value = r.sub(r'(\g<0>)', value) |
| |
| if value.startswith("rpmlib("): |
| continue |
| if value == "python": |
| continue |
| if file not in i: |
| i[file] = [] |
| i[file].append(value) |
| |
| return provides, requires |
| |
| try: |
| dep_popen = subprocess.Popen(shlex.split(rpmdeps) + pkgfiles, stdout=subprocess.PIPE) |
| provides, requires = process_deps(dep_popen.stdout, pkg, pkgdest, provides, requires) |
| except OSError as e: |
| bb.error("rpmdeps: '%s' command failed, '%s'" % (shlex.split(rpmdeps) + pkgfiles, e)) |
| raise e |
| |
| return (pkg, provides, requires) |
| |
| |
| def read_shlib_providers(d): |
| import re |
| |
| shlib_provider = {} |
| shlibs_dirs = d.getVar('SHLIBSDIRS', True).split() |
| list_re = re.compile('^(.*)\.list$') |
| # Go from least to most specific since the last one found wins |
| for dir in reversed(shlibs_dirs): |
| bb.debug(2, "Reading shlib providers in %s" % (dir)) |
| if not os.path.exists(dir): |
| continue |
| for file in os.listdir(dir): |
| m = list_re.match(file) |
| if m: |
| dep_pkg = m.group(1) |
| fd = open(os.path.join(dir, file)) |
| lines = fd.readlines() |
| fd.close() |
| for l in lines: |
| s = l.strip().split(":") |
| if s[0] not in shlib_provider: |
| shlib_provider[s[0]] = {} |
| shlib_provider[s[0]][s[1]] = (dep_pkg, s[2]) |
| return shlib_provider |
| |
| |
| def npm_split_package_dirs(pkgdir): |
| """ |
| Work out the packages fetched and unpacked by BitBake's npm fetcher |
| Returns a dict of packagename -> (relpath, package.json) ordered |
| such that it is suitable for use in PACKAGES and FILES |
| """ |
| from collections import OrderedDict |
| import json |
| packages = {} |
| for root, dirs, files in os.walk(pkgdir): |
| if os.path.basename(root) == 'node_modules': |
| for dn in dirs: |
| relpth = os.path.relpath(os.path.join(root, dn), pkgdir) |
| pkgitems = ['${PN}'] |
| for pathitem in relpth.split('/'): |
| if pathitem == 'node_modules': |
| continue |
| pkgitems.append(pathitem) |
| pkgname = '-'.join(pkgitems).replace('_', '-') |
| pkgfile = os.path.join(root, dn, 'package.json') |
| data = None |
| if os.path.exists(pkgfile): |
| with open(pkgfile, 'r') as f: |
| data = json.loads(f.read()) |
| packages[pkgname] = (relpth, data) |
| # We want the main package for a module sorted *after* its subpackages |
| # (so that it doesn't otherwise steal the files for the subpackage), so |
| # this is a cheap way to do that whilst still having an otherwise |
| # alphabetical sort |
| return OrderedDict((key, packages[key]) for key in sorted(packages, key=lambda pkg: pkg + '~')) |