diff options
author | Paul Eggleton <paul.eggleton@linux.intel.com> | 2015-02-05 15:08:22 +0000 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2015-02-14 08:41:01 +0000 |
commit | 9f03969994797220663280ef13fcb187446335ee (patch) | |
tree | d1baa9a8e0c30c86de653f70ec566c253e7af63f | |
parent | 675aa5f57a83f1e5712139e90d57d4946d78b6db (diff) | |
download | poky-9f03969994797220663280ef13fcb187446335ee.tar.gz |
oe-pkgdata-util: improve command-line usage
* Use argparse instead of optparse for standardised help output, options
and a much cleaner code structure
* Look up pkgdata directory automatically so the user doesn't have to
specify it
* Use standard logging
NOTE: this does mean a slight change in syntax - if you do want to
specify the pkgdata directory (usually only necessary if you're calling
it from within the build process) you need to use the parameter -p (or
--pkgdata-dir) and specify this before the command, not after it.
Examples:
oe-pkgdata-util find-path /sbin/mke2fs
oe-pkgdata-util lookup-recipe libelf1
oe-pkgdata-util read-value PKGSIZE libc6
oe-pkgdata-util -p /home/user/oe/build/tmp/sysroots/qemux86-64/pkgdata read-value PKGSIZE libc6
(From OE-Core rev: 04dc571ac7c26f0dcf1a1fcd466482e22519998d)
Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r-- | meta/classes/buildhistory.bbclass | 2 | ||||
-rw-r--r-- | meta/classes/license.bbclass | 2 | ||||
-rw-r--r-- | meta/lib/oe/package_manager.py | 2 | ||||
-rw-r--r-- | meta/lib/oeqa/runtime/_ptest.py | 2 | ||||
-rwxr-xr-x | scripts/oe-pkgdata-util | 264 |
5 files changed, 132 insertions, 140 deletions
diff --git a/meta/classes/buildhistory.bbclass b/meta/classes/buildhistory.bbclass index 90cfe4f954..211dcf18b5 100644 --- a/meta/classes/buildhistory.bbclass +++ b/meta/classes/buildhistory.bbclass | |||
@@ -374,7 +374,7 @@ buildhistory_get_installed() { | |||
374 | printf "" > $1/installed-package-sizes.tmp | 374 | printf "" > $1/installed-package-sizes.tmp |
375 | cat $pkgcache | while read pkg pkgfile pkgarch | 375 | cat $pkgcache | while read pkg pkgfile pkgarch |
376 | do | 376 | do |
377 | size=`oe-pkgdata-util read-value ${PKGDATA_DIR} "PKGSIZE" ${pkg}_${pkgarch}` | 377 | size=`oe-pkgdata-util -p ${PKGDATA_DIR} read-value "PKGSIZE" ${pkg}_${pkgarch}` |
378 | if [ "$size" != "" ] ; then | 378 | if [ "$size" != "" ] ; then |
379 | echo "$size $pkg" >> $1/installed-package-sizes.tmp | 379 | echo "$size $pkg" >> $1/installed-package-sizes.tmp |
380 | fi | 380 | fi |
diff --git a/meta/classes/license.bbclass b/meta/classes/license.bbclass index 21465d8d00..13c1a0fddf 100644 --- a/meta/classes/license.bbclass +++ b/meta/classes/license.bbclass | |||
@@ -80,7 +80,7 @@ license_create_manifest() { | |||
80 | if [ "${COPY_LIC_DIRS}" = "1" ]; then | 80 | if [ "${COPY_LIC_DIRS}" = "1" ]; then |
81 | for pkg in ${INSTALLED_PKGS}; do | 81 | for pkg in ${INSTALLED_PKGS}; do |
82 | mkdir -p ${IMAGE_ROOTFS}/usr/share/common-licenses/${pkg} | 82 | mkdir -p ${IMAGE_ROOTFS}/usr/share/common-licenses/${pkg} |
83 | pkged_pn="$(oe-pkgdata-util lookup-recipe ${PKGDATA_DIR} ${pkg})" | 83 | pkged_pn="$(oe-pkgdata-util -p ${PKGDATA_DIR} lookup-recipe ${pkg})" |
84 | for lic in `ls ${LICENSE_DIRECTORY}/${pkged_pn}`; do | 84 | for lic in `ls ${LICENSE_DIRECTORY}/${pkged_pn}`; do |
85 | # Really don't need to copy the generics as they're | 85 | # Really don't need to copy the generics as they're |
86 | # represented in the manifest and in the actual pkg licenses | 86 | # represented in the manifest and in the actual pkg licenses |
diff --git a/meta/lib/oe/package_manager.py b/meta/lib/oe/package_manager.py index 6f49c69110..fcf05dc282 100644 --- a/meta/lib/oe/package_manager.py +++ b/meta/lib/oe/package_manager.py | |||
@@ -529,7 +529,7 @@ class PackageManager(object): | |||
529 | return | 529 | return |
530 | 530 | ||
531 | cmd = [bb.utils.which(os.getenv('PATH'), "oe-pkgdata-util"), | 531 | cmd = [bb.utils.which(os.getenv('PATH'), "oe-pkgdata-util"), |
532 | "glob", self.d.getVar('PKGDATA_DIR', True), installed_pkgs_file, | 532 | "-p", self.d.getVar('PKGDATA_DIR', True), "glob", installed_pkgs_file, |
533 | globs] | 533 | globs] |
534 | try: | 534 | try: |
535 | bb.note("Installing complementary packages ...") | 535 | bb.note("Installing complementary packages ...") |
diff --git a/meta/lib/oeqa/runtime/_ptest.py b/meta/lib/oeqa/runtime/_ptest.py index 4c58dc1d7f..53b0807c4a 100644 --- a/meta/lib/oeqa/runtime/_ptest.py +++ b/meta/lib/oeqa/runtime/_ptest.py | |||
@@ -86,7 +86,7 @@ class PtestRunnerTest(oeRuntimeTest): | |||
86 | installed_pkgs.write(self.pkgs_list.list("arch")) | 86 | installed_pkgs.write(self.pkgs_list.list("arch")) |
87 | 87 | ||
88 | cmd = [bb.utils.which(os.getenv('PATH'), "oe-pkgdata-util"), | 88 | cmd = [bb.utils.which(os.getenv('PATH'), "oe-pkgdata-util"), |
89 | "glob", oeRuntimeTest.tc.d.getVar('PKGDATA_DIR', True), installed_pkgs_file, | 89 | "-p", oeRuntimeTest.tc.d.getVar('PKGDATA_DIR', True), "glob", installed_pkgs_file, |
90 | globs] | 90 | globs] |
91 | try: | 91 | try: |
92 | bb.note("Installing complementary packages ...") | 92 | bb.note("Installing complementary packages ...") |
diff --git a/scripts/oe-pkgdata-util b/scripts/oe-pkgdata-util index bf8754749e..f70f85e147 100755 --- a/scripts/oe-pkgdata-util +++ b/scripts/oe-pkgdata-util | |||
@@ -4,7 +4,7 @@ | |||
4 | # | 4 | # |
5 | # Written by: Paul Eggleton <paul.eggleton@linux.intel.com> | 5 | # Written by: Paul Eggleton <paul.eggleton@linux.intel.com> |
6 | # | 6 | # |
7 | # Copyright 2012-2013 Intel Corporation | 7 | # Copyright 2012-2015 Intel Corporation |
8 | # | 8 | # |
9 | # This program is free software; you can redistribute it and/or modify | 9 | # This program is free software; you can redistribute it and/or modify |
10 | # it under the terms of the GNU General Public License version 2 as | 10 | # it under the terms of the GNU General Public License version 2 as |
@@ -25,30 +25,40 @@ import os | |||
25 | import os.path | 25 | import os.path |
26 | import fnmatch | 26 | import fnmatch |
27 | import re | 27 | import re |
28 | import optparse | 28 | import argparse |
29 | import logging | ||
29 | from collections import defaultdict | 30 | from collections import defaultdict |
30 | 31 | ||
31 | def glob(args, usage, debug=False): | 32 | scripts_path = os.path.dirname(os.path.realpath(__file__)) |
32 | if len(args) < 3: | 33 | lib_path = scripts_path + '/lib' |
33 | usage() | 34 | sys.path = sys.path + [lib_path] |
34 | sys.exit(1) | 35 | import scriptutils |
36 | logger = scriptutils.logger_create('pkgdatautil') | ||
35 | 37 | ||
36 | pkgdata_dir = args[0] | 38 | def tinfoil_init(): |
37 | pkglist_file = args[1] | 39 | import bb.tinfoil |
38 | globs = args[2].split() | 40 | import logging |
41 | tinfoil = bb.tinfoil.Tinfoil() | ||
42 | tinfoil.prepare(True) | ||
43 | |||
44 | tinfoil.logger.setLevel(logging.WARNING) | ||
45 | return tinfoil | ||
39 | 46 | ||
40 | if not os.path.exists(pkgdata_dir): | ||
41 | print('ERROR: Unable to find pkgdata directory %s' % pkgdata_dir) | ||
42 | sys.exit(1) | ||
43 | 47 | ||
44 | if not os.path.exists(pkglist_file): | 48 | def glob(args): |
45 | print('ERROR: Unable to find package list file %s' % pkglist_file) | 49 | # Handle both multiple arguments and multiple values within an arg (old syntax) |
50 | globs = [] | ||
51 | for globitem in args.glob: | ||
52 | globs.extend(globitem.split()) | ||
53 | |||
54 | if not os.path.exists(args.pkglistfile): | ||
55 | logger.error('Unable to find package list file %s' % args.pkglistfile) | ||
46 | sys.exit(1) | 56 | sys.exit(1) |
47 | 57 | ||
48 | skipregex = re.compile("-locale-|^locale-base-|-dev$|-doc$|-dbg$|-staticdev$|^kernel-module-") | 58 | skipregex = re.compile("-locale-|^locale-base-|-dev$|-doc$|-dbg$|-staticdev$|^kernel-module-") |
49 | 59 | ||
50 | mappedpkgs = set() | 60 | mappedpkgs = set() |
51 | with open(pkglist_file, 'r') as f: | 61 | with open(args.pkglistfile, 'r') as f: |
52 | for line in f: | 62 | for line in f: |
53 | fields = line.rstrip().split() | 63 | fields = line.rstrip().split() |
54 | if not fields: | 64 | if not fields: |
@@ -59,8 +69,7 @@ def glob(args, usage, debug=False): | |||
59 | 69 | ||
60 | # Skip packages for which there is no point applying globs | 70 | # Skip packages for which there is no point applying globs |
61 | if skipregex.search(pkg): | 71 | if skipregex.search(pkg): |
62 | if debug: | 72 | logger.debug("%s -> !!" % pkg) |
63 | print("%s -> !!" % pkg) | ||
64 | continue | 73 | continue |
65 | 74 | ||
66 | # Skip packages that already match the globs, so if e.g. a dev package | 75 | # Skip packages that already match the globs, so if e.g. a dev package |
@@ -72,15 +81,14 @@ def glob(args, usage, debug=False): | |||
72 | already = True | 81 | already = True |
73 | break | 82 | break |
74 | if already: | 83 | if already: |
75 | if debug: | 84 | logger.debug("%s -> !" % pkg) |
76 | print("%s -> !" % pkg) | ||
77 | continue | 85 | continue |
78 | 86 | ||
79 | # Define some functions | 87 | # Define some functions |
80 | def revpkgdata(pkgn): | 88 | def revpkgdata(pkgn): |
81 | return os.path.join(pkgdata_dir, "runtime-reverse", pkgn) | 89 | return os.path.join(args.pkgdata_dir, "runtime-reverse", pkgn) |
82 | def fwdpkgdata(pkgn): | 90 | def fwdpkgdata(pkgn): |
83 | return os.path.join(pkgdata_dir, "runtime", pkgn) | 91 | return os.path.join(args.pkgdata_dir, "runtime", pkgn) |
84 | def readpn(pkgdata_file): | 92 | def readpn(pkgdata_file): |
85 | pn = "" | 93 | pn = "" |
86 | with open(pkgdata_file, 'r') as f: | 94 | with open(pkgdata_file, 'r') as f: |
@@ -130,81 +138,61 @@ def glob(args, usage, debug=False): | |||
130 | mappedpkg = "" | 138 | mappedpkg = "" |
131 | else: | 139 | else: |
132 | # Package doesn't even exist... | 140 | # Package doesn't even exist... |
133 | if debug: | 141 | logger.debug("%s is not a valid package!" % (pkg)) |
134 | print "%s is not a valid package!" % (pkg) | ||
135 | break | 142 | break |
136 | 143 | ||
137 | if mappedpkg: | 144 | if mappedpkg: |
138 | if debug: | 145 | logger.debug("%s (%s) -> %s" % (pkg, g, mappedpkg)) |
139 | print "%s (%s) -> %s" % (pkg, g, mappedpkg) | ||
140 | mappedpkgs.add(mappedpkg) | 146 | mappedpkgs.add(mappedpkg) |
141 | else: | 147 | else: |
142 | if debug: | 148 | logger.debug("%s (%s) -> ?" % (pkg, g)) |
143 | print "%s (%s) -> ?" % (pkg, g) | ||
144 | 149 | ||
145 | if debug: | 150 | logger.debug("------") |
146 | print "------" | ||
147 | 151 | ||
148 | print("\n".join(mappedpkgs)) | 152 | print("\n".join(mappedpkgs)) |
149 | 153 | ||
150 | def read_value(args, usage, debug=False): | 154 | def read_value(args): |
151 | if len(args) < 3: | 155 | # Handle both multiple arguments and multiple values within an arg (old syntax) |
152 | usage() | 156 | packages = [] |
153 | sys.exit(1) | 157 | for pkgitem in args.pkg: |
154 | 158 | packages.extend(pkgitem.split()) | |
155 | pkgdata_dir = args[0] | ||
156 | var = args[1] | ||
157 | packages = args[2].split() | ||
158 | 159 | ||
159 | if not os.path.exists(pkgdata_dir): | 160 | def readvar(pkgdata_file, valuename): |
160 | print('ERROR: Unable to find pkgdata directory %s' % pkgdata_dir) | ||
161 | sys.exit(1) | ||
162 | |||
163 | def readvar(pkgdata_file, var): | ||
164 | val = "" | 161 | val = "" |
165 | with open(pkgdata_file, 'r') as f: | 162 | with open(pkgdata_file, 'r') as f: |
166 | for line in f: | 163 | for line in f: |
167 | if line.startswith(var + ":"): | 164 | if line.startswith(valuename + ":"): |
168 | val = line.split(': ')[1].rstrip() | 165 | val = line.split(': ')[1].rstrip() |
169 | return val | 166 | return val |
170 | 167 | ||
171 | if debug: | 168 | logger.debug("read-value('%s', '%s' '%s'" % (args.pkgdata_dir, args.valuename, packages)) |
172 | print "read-value('%s', '%s' '%s'" % (pkgdata_dir, var, packages) | ||
173 | for package in packages: | 169 | for package in packages: |
174 | pkg_split = package.split('_') | 170 | pkg_split = package.split('_') |
175 | pkg_name = pkg_split[0] | 171 | pkg_name = pkg_split[0] |
176 | if debug: | 172 | logger.debug("package: '%s'" % pkg_name) |
177 | print "package: '%s'" % pkg_name | 173 | revlink = os.path.join(args.pkgdata_dir, "runtime-reverse", pkg_name) |
178 | revlink = os.path.join(pkgdata_dir, "runtime-reverse", pkg_name) | 174 | logger.debug(revlink) |
179 | if debug: | ||
180 | print(revlink) | ||
181 | if os.path.exists(revlink): | 175 | if os.path.exists(revlink): |
182 | mappedpkg = os.path.basename(os.readlink(revlink)) | 176 | mappedpkg = os.path.basename(os.readlink(revlink)) |
183 | qvar = var | 177 | qvar = args.valuename |
184 | if qvar == "PKGSIZE": | 178 | if qvar == "PKGSIZE": |
185 | # append packagename | 179 | # append packagename |
186 | qvar = "%s_%s" % (var, mappedpkg) | 180 | qvar = "%s_%s" % (args.valuename, mappedpkg) |
187 | # PKGSIZE is now in bytes, but we we want it in KB | 181 | # PKGSIZE is now in bytes, but we we want it in KB |
188 | pkgsize = (int(readvar(revlink, qvar)) + 1024 // 2) // 1024 | 182 | pkgsize = (int(readvar(revlink, qvar)) + 1024 // 2) // 1024 |
189 | print("%d" % pkgsize) | 183 | print("%d" % pkgsize) |
190 | else: | 184 | else: |
191 | print(readvar(revlink, qvar)) | 185 | print(readvar(revlink, qvar)) |
192 | 186 | ||
193 | def lookup_pkg(args, usage, debug=False): | 187 | def lookup_pkg(args): |
194 | if len(args) < 2: | 188 | # Handle both multiple arguments and multiple values within an arg (old syntax) |
195 | usage() | 189 | pkgs = [] |
196 | sys.exit(1) | 190 | for pkgitem in args.recipepkg: |
197 | 191 | pkgs.extend(pkgitem.split()) | |
198 | pkgdata_dir = args[0] | ||
199 | pkgs = args[1].split() | ||
200 | |||
201 | if not os.path.exists(pkgdata_dir): | ||
202 | print('ERROR: Unable to find pkgdata directory %s' % pkgdata_dir) | ||
203 | sys.exit(1) | ||
204 | 192 | ||
205 | mappings = defaultdict(list) | 193 | mappings = defaultdict(list) |
206 | for pkg in pkgs: | 194 | for pkg in pkgs: |
207 | pkgfile = os.path.join(pkgdata_dir, 'runtime', pkg) | 195 | pkgfile = os.path.join(args.pkgdata_dir, 'runtime', pkg) |
208 | if os.path.exists(pkgfile): | 196 | if os.path.exists(pkgfile): |
209 | with open(pkgfile, 'r') as f: | 197 | with open(pkgfile, 'r') as f: |
210 | for line in f: | 198 | for line in f: |
@@ -214,29 +202,23 @@ def lookup_pkg(args, usage, debug=False): | |||
214 | break | 202 | break |
215 | if len(mappings) < len(pkgs): | 203 | if len(mappings) < len(pkgs): |
216 | missing = list(set(pkgs) - set(mappings.keys())) | 204 | missing = list(set(pkgs) - set(mappings.keys())) |
217 | sys.stderr.write("ERROR: the following packages could not be found: %s\n" % ', '.join(missing)) | 205 | logger.error("The following packages could not be found: %s" % ', '.join(missing)) |
218 | sys.exit(1) | 206 | sys.exit(1) |
219 | 207 | ||
220 | items = [] | 208 | items = [] |
221 | for pkg in pkgs: | 209 | for pkg in pkgs: |
222 | items.extend(mappings.get(pkg, [])) | 210 | items.extend(mappings.get(pkg, [])) |
223 | print '\n'.join(items) | 211 | print('\n'.join(items)) |
224 | 212 | ||
225 | def lookup_recipe(args, usage, debug=False): | 213 | def lookup_recipe(args): |
226 | if len(args) < 2: | 214 | # Handle both multiple arguments and multiple values within an arg (old syntax) |
227 | usage() | 215 | pkgs = [] |
228 | sys.exit(1) | 216 | for pkgitem in args.pkg: |
229 | 217 | pkgs.extend(pkgitem.split()) | |
230 | pkgdata_dir = args[0] | ||
231 | pkgs = args[1].split() | ||
232 | |||
233 | if not os.path.exists(pkgdata_dir): | ||
234 | print('ERROR: Unable to find pkgdata directory %s' % pkgdata_dir) | ||
235 | sys.exit(1) | ||
236 | 218 | ||
237 | mappings = defaultdict(list) | 219 | mappings = defaultdict(list) |
238 | for pkg in pkgs: | 220 | for pkg in pkgs: |
239 | pkgfile = os.path.join(pkgdata_dir, 'runtime-reverse', pkg) | 221 | pkgfile = os.path.join(args.pkgdata_dir, 'runtime-reverse', pkg) |
240 | if os.path.exists(pkgfile): | 222 | if os.path.exists(pkgfile): |
241 | with open(pkgfile, 'r') as f: | 223 | with open(pkgfile, 'r') as f: |
242 | for line in f: | 224 | for line in f: |
@@ -246,30 +228,18 @@ def lookup_recipe(args, usage, debug=False): | |||
246 | break | 228 | break |
247 | if len(mappings) < len(pkgs): | 229 | if len(mappings) < len(pkgs): |
248 | missing = list(set(pkgs) - set(mappings.keys())) | 230 | missing = list(set(pkgs) - set(mappings.keys())) |
249 | sys.stderr.write("ERROR: the following packages could not be found: %s\n" % ', '.join(missing)) | 231 | logger.error("The following packages could not be found: %s" % ', '.join(missing)) |
250 | sys.exit(1) | 232 | sys.exit(1) |
251 | 233 | ||
252 | items = [] | 234 | items = [] |
253 | for pkg in pkgs: | 235 | for pkg in pkgs: |
254 | items.extend(mappings.get(pkg, [])) | 236 | items.extend(mappings.get(pkg, [])) |
255 | print '\n'.join(items) | 237 | print('\n'.join(items)) |
256 | |||
257 | def find_path(args, usage, debug=False): | ||
258 | if len(args) < 2: | ||
259 | usage() | ||
260 | sys.exit(1) | ||
261 | |||
262 | pkgdata_dir = args[0] | ||
263 | targetpath = args[1] | ||
264 | |||
265 | if not os.path.exists(pkgdata_dir): | ||
266 | print('ERROR: Unable to find pkgdata directory %s' % pkgdata_dir) | ||
267 | sys.exit(1) | ||
268 | 238 | ||
239 | def find_path(args): | ||
269 | import json | 240 | import json |
270 | import fnmatch | ||
271 | 241 | ||
272 | for root, dirs, files in os.walk(os.path.join(pkgdata_dir, 'runtime')): | 242 | for root, dirs, files in os.walk(os.path.join(args.pkgdata_dir, 'runtime')): |
273 | for fn in files: | 243 | for fn in files: |
274 | with open(os.path.join(root,fn)) as f: | 244 | with open(os.path.join(root,fn)) as f: |
275 | for line in f: | 245 | for line in f: |
@@ -277,55 +247,77 @@ def find_path(args, usage, debug=False): | |||
277 | val = line.split(':', 1)[1].strip() | 247 | val = line.split(':', 1)[1].strip() |
278 | dictval = json.loads(val) | 248 | dictval = json.loads(val) |
279 | for fullpth in dictval.keys(): | 249 | for fullpth in dictval.keys(): |
280 | if fnmatch.fnmatchcase(fullpth, targetpath): | 250 | if fnmatch.fnmatchcase(fullpth, args.targetpath): |
281 | print("%s: %s" % (fn, fullpth)) | 251 | print("%s: %s" % (fn, fullpth)) |
282 | break | 252 | break |
283 | 253 | ||
284 | 254 | ||
285 | def main(): | 255 | def main(): |
286 | parser = optparse.OptionParser( | 256 | parser = argparse.ArgumentParser(description="OpenEmbedded pkgdata tool - queries the pkgdata files written out during do_package", |
287 | usage = '''%prog [options] <command> <arguments> | 257 | epilog="Use %(prog)s <subcommand> --help to get help on a specific command") |
288 | 258 | parser.add_argument('-d', '--debug', help='Enable debug output', action='store_true') | |
289 | Available commands: | 259 | parser.add_argument('-p', '--pkgdata-dir', help='Path to pkgdata directory (determined automatically if not specified)') |
290 | glob <pkgdatadir> <pkglistfile> "<globs>" | 260 | subparsers = parser.add_subparsers(title='subcommands', metavar='<subcommand>') |
291 | expand one or more glob expressions over the packages listed in | 261 | |
292 | pkglistfile (one package per line) | 262 | parser_lookup_pkg = subparsers.add_parser('lookup-pkg', |
293 | lookup-pkg <pkgdatadir> "<recipe-pkgs>" | 263 | help='Translate recipe-space package names to runtime package names', |
294 | look up the specified recipe-space package name(s) to see what the | 264 | description='Looks up the specified recipe-space package name(s) to see what the final runtime package name is (e.g. glibc becomes libc6)') |
295 | final runtime package name is (e.g. eglibc becomes libc6) | 265 | parser_lookup_pkg.add_argument('recipepkg', nargs='+', help='Recipe-space package name to look up') |
296 | lookup-recipe <pkgdatadir> "<pkgs>" | 266 | parser_lookup_pkg.set_defaults(func=lookup_pkg) |
297 | look up the specified package(s) to see which recipe they were | 267 | |
298 | produced by | 268 | parser_lookup_recipe = subparsers.add_parser('lookup-recipe', |
299 | find-path <pkgdatadir> <path> | 269 | help='Find recipe producing one or more packages', |
300 | find the package providing the specified path (wildcards * ? allowed) | 270 | description='Looks up the specified runtime package(s) to see which recipe they were produced by') |
301 | read-value <pkgdatadir> <value-name> "<pkgs>" | 271 | parser_lookup_recipe.add_argument('pkg', nargs='+', help='Runtime package name to look up') |
302 | read the named value from the pkgdata files for the specified | 272 | parser_lookup_recipe.set_defaults(func=lookup_recipe) |
303 | packages''') | 273 | |
304 | 274 | parser_find_path = subparsers.add_parser('find-path', | |
305 | parser.add_option("-d", "--debug", | 275 | help='Find package providing a target path', |
306 | help = "Enable debug output", | 276 | description='Finds the recipe-space package providing the specified target path') |
307 | action="store_true", dest="debug", default=False) | 277 | parser_find_path.add_argument('targetpath', help='Path to find (wildcards * ? allowed, use quotes to avoid shell expansion)') |
308 | 278 | parser_find_path.set_defaults(func=find_path) | |
309 | options, args = parser.parse_args(sys.argv) | 279 | |
310 | args = args[1:] | 280 | parser_read_value = subparsers.add_parser('read-value', |
311 | 281 | help='Read any pkgdata value for one or more packages', | |
312 | if len(args) < 1: | 282 | description='Reads the named value from the pkgdata files for the specified packages') |
313 | parser.print_help() | 283 | parser_read_value.add_argument('valuename', help='Name of the value to look up') |
284 | parser_read_value.add_argument('pkg', nargs='+', help='Runtime package name to look up') | ||
285 | parser_read_value.set_defaults(func=read_value) | ||
286 | |||
287 | parser_glob = subparsers.add_parser('glob', | ||
288 | help='Expand package name glob expression', | ||
289 | description='Expands one or more glob expressions over the packages listed in pkglistfile') | ||
290 | parser_glob.add_argument('pkglistfile', help='File listing packages (one package name per line)') | ||
291 | parser_glob.add_argument('glob', nargs="+", help='Glob expression for package names, e.g. *-dev') | ||
292 | parser_glob.set_defaults(func=glob) | ||
293 | |||
294 | |||
295 | args = parser.parse_args() | ||
296 | |||
297 | if args.debug: | ||
298 | logger.setLevel(logging.DEBUG) | ||
299 | |||
300 | if not args.pkgdata_dir: | ||
301 | import scriptpath | ||
302 | bitbakepath = scriptpath.add_bitbake_lib_path() | ||
303 | if not bitbakepath: | ||
304 | logger.error("Unable to find bitbake by searching parent directory of this script or PATH") | ||
305 | sys.exit(1) | ||
306 | logger.debug('Found bitbake path: %s' % bitbakepath) | ||
307 | tinfoil = tinfoil_init() | ||
308 | args.pkgdata_dir = tinfoil.config_data.getVar('PKGDATA_DIR', True) | ||
309 | logger.debug('Value of PKGDATA_DIR is "%s"' % args.pkgdata_dir) | ||
310 | if not args.pkgdata_dir: | ||
311 | logger.error('Unable to determine pkgdata directory from PKGDATA_DIR') | ||
312 | sys.exit(1) | ||
313 | |||
314 | if not os.path.exists(args.pkgdata_dir): | ||
315 | logger.error('Unable to find pkgdata directory %s' % pkgdata_dir) | ||
314 | sys.exit(1) | 316 | sys.exit(1) |
315 | 317 | ||
316 | if args[0] == "glob": | 318 | ret = args.func(args) |
317 | glob(args[1:], parser.print_help, options.debug) | 319 | |
318 | elif args[0] == "lookup-pkg": | 320 | return ret |
319 | lookup_pkg(args[1:], parser.print_help, options.debug) | ||
320 | elif args[0] == "lookup-recipe": | ||
321 | lookup_recipe(args[1:], parser.print_help, options.debug) | ||
322 | elif args[0] == "find-path": | ||
323 | find_path(args[1:], parser.print_help, options.debug) | ||
324 | elif args[0] == "read-value": | ||
325 | read_value(args[1:], parser.print_help, options.debug) | ||
326 | else: | ||
327 | parser.print_help() | ||
328 | sys.exit(1) | ||
329 | 321 | ||
330 | 322 | ||
331 | if __name__ == "__main__": | 323 | if __name__ == "__main__": |