diff options
| author | Paul Eggleton <paul.eggleton@linux.intel.com> | 2016-01-23 00:59:52 +1300 |
|---|---|---|
| committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2016-01-24 09:40:32 +0000 |
| commit | b435225e8af9481ab72b0a6b02b4c6835271152e (patch) | |
| tree | c342b5abe42b9b3b5bffccb39c351c3ed2189088 /scripts/lib/devtool/sdk.py | |
| parent | 44d1a2a45c4d92f331aef1a95adb6b12743d24cd (diff) | |
| download | poky-b435225e8af9481ab72b0a6b02b4c6835271152e.tar.gz | |
devtool: add sdk-install subcommand
Add the ability to install additional pre-built items (from shared
state) into the extensible SDK. This can already be done implicitly by
adding something to DEPENDS within a recipe you're working on and then
running "devtool build", but it's useful to be able to explicitly
install things particularly if you're using the extensible SDK as a
traditional toolchain.
Note that for this command to be useful you need to have SSTATE_MIRRORS
set in your SDK configuration, and that mirror needs to be populated
with sstate artifacts for recipes you wish to be able to install.
(From OE-Core rev: 3474a42954908d1688fd3a6cb600eed315b27833)
Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'scripts/lib/devtool/sdk.py')
| -rw-r--r-- | scripts/lib/devtool/sdk.py | 63 |
1 files changed, 62 insertions, 1 deletions
diff --git a/scripts/lib/devtool/sdk.py b/scripts/lib/devtool/sdk.py index 80ea8711cc..12de9423e7 100644 --- a/scripts/lib/devtool/sdk.py +++ b/scripts/lib/devtool/sdk.py | |||
| @@ -8,7 +8,7 @@ import shutil | |||
| 8 | import errno | 8 | import errno |
| 9 | import sys | 9 | import sys |
| 10 | import tempfile | 10 | import tempfile |
| 11 | from devtool import exec_build_env_command, setup_tinfoil, DevtoolError | 11 | from devtool import exec_build_env_command, setup_tinfoil, parse_recipe, DevtoolError |
| 12 | 12 | ||
| 13 | logger = logging.getLogger('devtool') | 13 | logger = logging.getLogger('devtool') |
| 14 | 14 | ||
| @@ -235,6 +235,64 @@ def sdk_update(args, config, basepath, workspace): | |||
| 235 | return -1 | 235 | return -1 |
| 236 | return 0 | 236 | return 0 |
| 237 | 237 | ||
| 238 | def sdk_install(args, config, basepath, workspace): | ||
| 239 | """Entry point for the devtool sdk-install command""" | ||
| 240 | |||
| 241 | import oe.recipeutils | ||
| 242 | import bb.process | ||
| 243 | |||
| 244 | for recipe in args.recipename: | ||
| 245 | if recipe in workspace: | ||
| 246 | raise DevtoolError('recipe %s is a recipe in your workspace' % recipe) | ||
| 247 | |||
| 248 | tasks = ['do_populate_sysroot', 'do_packagedata'] | ||
| 249 | stampprefixes = {} | ||
| 250 | def checkstamp(recipe): | ||
| 251 | stampprefix = stampprefixes[recipe] | ||
| 252 | stamps = glob.glob(stampprefix + '*') | ||
| 253 | for stamp in stamps: | ||
| 254 | if '.sigdata.' not in stamp and stamp.startswith((stampprefix + '.', stampprefix + '_setscene.')): | ||
| 255 | return True | ||
| 256 | else: | ||
| 257 | return False | ||
| 258 | |||
| 259 | install_recipes = [] | ||
| 260 | tinfoil = setup_tinfoil(config_only=False, basepath=basepath) | ||
| 261 | try: | ||
| 262 | for recipe in args.recipename: | ||
| 263 | rd = parse_recipe(config, tinfoil, recipe, True) | ||
| 264 | if not rd: | ||
| 265 | return 1 | ||
| 266 | stampprefixes[recipe] = '%s.%s' % (rd.getVar('STAMP', True), tasks[0]) | ||
| 267 | if checkstamp(recipe): | ||
| 268 | logger.info('%s is already installed' % recipe) | ||
| 269 | else: | ||
| 270 | install_recipes.append(recipe) | ||
| 271 | finally: | ||
| 272 | tinfoil.shutdown() | ||
| 273 | |||
| 274 | if install_recipes: | ||
| 275 | logger.info('Installing %s...' % ', '.join(install_recipes)) | ||
| 276 | install_tasks = [] | ||
| 277 | for recipe in install_recipes: | ||
| 278 | for task in tasks: | ||
| 279 | if recipe.endswith('-native') and 'package' in task: | ||
| 280 | continue | ||
| 281 | install_tasks.append('%s:%s' % (recipe, task)) | ||
| 282 | try: | ||
| 283 | exec_build_env_command(config.init_path, basepath, 'bitbake --setscene-only %s' % ' '.join(install_tasks)) | ||
| 284 | except bb.process.ExecutionError as e: | ||
| 285 | raise DevtoolError('Failed to install %s:\n%s' % (recipe, str(e))) | ||
| 286 | failed = False | ||
| 287 | for recipe in install_recipes: | ||
| 288 | if checkstamp(recipe): | ||
| 289 | logger.info('Successfully installed %s' % recipe) | ||
| 290 | else: | ||
| 291 | raise DevtoolError('Failed to install %s - unavailable' % recipe) | ||
| 292 | failed = True | ||
| 293 | if failed: | ||
| 294 | return 2 | ||
| 295 | |||
| 238 | def register_commands(subparsers, context): | 296 | def register_commands(subparsers, context): |
| 239 | """Register devtool subcommands from the sdk plugin""" | 297 | """Register devtool subcommands from the sdk plugin""" |
| 240 | if context.fixed_setup: | 298 | if context.fixed_setup: |
| @@ -242,3 +300,6 @@ def register_commands(subparsers, context): | |||
| 242 | parser_sdk.add_argument('updateserver', help='The update server to fetch latest SDK components from', nargs='?') | 300 | parser_sdk.add_argument('updateserver', help='The update server to fetch latest SDK components from', nargs='?') |
| 243 | parser_sdk.add_argument('--skip-prepare', action="store_true", help='Skip re-preparing the build system after updating (for debugging only)') | 301 | parser_sdk.add_argument('--skip-prepare', action="store_true", help='Skip re-preparing the build system after updating (for debugging only)') |
| 244 | parser_sdk.set_defaults(func=sdk_update) | 302 | parser_sdk.set_defaults(func=sdk_update) |
| 303 | parser_sdk_install = subparsers.add_parser('sdk-install', help='Install additional SDK components', description='Installs additional recipe development files into the SDK. (You can use "devtool search" to find available recipes.)') | ||
| 304 | parser_sdk_install.add_argument('recipename', help='Name of the recipe to install the development artifacts for', nargs='+') | ||
| 305 | parser_sdk_install.set_defaults(func=sdk_install) | ||
