summaryrefslogtreecommitdiffstats
path: root/scripts/lib/devtool
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/lib/devtool')
-rw-r--r--scripts/lib/devtool/build_image.py79
-rw-r--r--scripts/lib/devtool/build_sdk.py65
2 files changed, 122 insertions, 22 deletions
diff --git a/scripts/lib/devtool/build_image.py b/scripts/lib/devtool/build_image.py
index ff764fa833..e51d766474 100644
--- a/scripts/lib/devtool/build_image.py
+++ b/scripts/lib/devtool/build_image.py
@@ -25,6 +25,9 @@ from devtool import exec_build_env_command, setup_tinfoil, parse_recipe, Devtool
25 25
26logger = logging.getLogger('devtool') 26logger = logging.getLogger('devtool')
27 27
28class TargetNotImageError(Exception):
29 pass
30
28def _get_packages(tinfoil, workspace, config): 31def _get_packages(tinfoil, workspace, config):
29 """Get list of packages from recipes in the workspace.""" 32 """Get list of packages from recipes in the workspace."""
30 result = [] 33 result = []
@@ -51,6 +54,24 @@ def build_image(args, config, basepath, workspace):
51 if not image: 54 if not image:
52 raise DevtoolError('Unable to determine image to build, please specify one') 55 raise DevtoolError('Unable to determine image to build, please specify one')
53 56
57 try:
58 if args.add_packages:
59 add_packages = args.add_packages.split(',')
60 else:
61 add_packages = None
62 result, outputdir = build_image_task(config, basepath, workspace, image, add_packages)
63 except TargetNotImageError:
64 if auto_image:
65 raise DevtoolError('Unable to determine image to build, please specify one')
66 else:
67 raise DevtoolError('Specified recipe %s is not an image recipe' % image)
68
69 if result == 0:
70 logger.info('Successfully built %s. You can find output files in %s'
71 % (image, outputdir))
72 return result
73
74def build_image_task(config, basepath, workspace, image, add_packages=None, task=None, extra_append=None):
54 appendfile = os.path.join(config.workspace_path, 'appends', 75 appendfile = os.path.join(config.workspace_path, 'appends',
55 '%s.bbappend' % image) 76 '%s.bbappend' % image)
56 77
@@ -63,46 +84,60 @@ def build_image(args, config, basepath, workspace):
63 rd = parse_recipe(config, tinfoil, image, True) 84 rd = parse_recipe(config, tinfoil, image, True)
64 if not rd: 85 if not rd:
65 # Error already shown 86 # Error already shown
66 return 1 87 return (1, None)
67 if not bb.data.inherits_class('image', rd): 88 if not bb.data.inherits_class('image', rd):
68 if auto_image: 89 raise TargetNotImageError()
69 raise DevtoolError('Unable to determine image to build, please specify one')
70 else:
71 raise DevtoolError('Specified recipe %s is not an image recipe' % image)
72 90
91 outputdir = None
73 try: 92 try:
74 if workspace or args.add_packages: 93 if workspace or add_packages:
75 if args.add_packages: 94 if add_packages:
76 packages = args.add_packages.split(',') 95 packages = add_packages
77 else: 96 else:
78 packages = _get_packages(tinfoil, workspace, config) 97 packages = _get_packages(tinfoil, workspace, config)
79 if packages: 98 else:
80 with open(appendfile, 'w') as afile: 99 packages = None
100 if not task:
101 if not packages and not add_packages and workspace:
102 logger.warning('No recipes in workspace, building image %s unmodified', image)
103 elif not packages:
104 logger.warning('No packages to add, building image %s unmodified', image)
105
106 if packages or extra_append:
107 bb.utils.mkdirhier(os.path.dirname(appendfile))
108 with open(appendfile, 'w') as afile:
109 if packages:
81 # include packages from workspace recipes into the image 110 # include packages from workspace recipes into the image
82 afile.write('IMAGE_INSTALL_append = " %s"\n' % ' '.join(packages)) 111 afile.write('IMAGE_INSTALL_append = " %s"\n' % ' '.join(packages))
83 logger.info('Building image %s with the following ' 112 if not task:
84 'additional packages: %s', image, ' '.join(packages)) 113 logger.info('Building image %s with the following '
85 else: 114 'additional packages: %s', image, ' '.join(packages))
86 logger.warning('No packages to add, building image %s unmodified', image) 115 if extra_append:
116 for line in extra_append:
117 afile.write('%s\n' % line)
118
119 if task in ['populate_sdk', 'populate_sdk_ext']:
120 outputdir = rd.getVar('SDK_DEPLOY', True)
87 else: 121 else:
88 logger.warning('No recipes in workspace, building image %s unmodified', image) 122 outputdir = rd.getVar('DEPLOY_DIR_IMAGE', True)
89
90 deploy_dir_image = tinfoil.config_data.getVar('DEPLOY_DIR_IMAGE', True)
91 123
92 tinfoil.shutdown() 124 tinfoil.shutdown()
93 125
94 # run bitbake to build image 126 options = ''
127 if task:
128 options += '-c %s' % task
129
130 # run bitbake to build image (or specified task)
95 try: 131 try:
96 exec_build_env_command(config.init_path, basepath, 132 exec_build_env_command(config.init_path, basepath,
97 'bitbake %s' % image, watch=True) 133 'bitbake %s %s' % (options, image), watch=True)
98 except ExecutionError as err: 134 except ExecutionError as err:
99 return err.exitcode 135 return (err.exitcode, None)
100 finally: 136 finally:
101 if os.path.isfile(appendfile): 137 if os.path.isfile(appendfile):
102 os.unlink(appendfile) 138 os.unlink(appendfile)
139 return (0, outputdir)
103 140
104 logger.info('Successfully built %s. You can find output files in %s'
105 % (image, deploy_dir_image))
106 141
107def register_commands(subparsers, context): 142def register_commands(subparsers, context):
108 """Register devtool subcommands from the build-image plugin""" 143 """Register devtool subcommands from the build-image plugin"""
diff --git a/scripts/lib/devtool/build_sdk.py b/scripts/lib/devtool/build_sdk.py
new file mode 100644
index 0000000000..b89d65b0cb
--- /dev/null
+++ b/scripts/lib/devtool/build_sdk.py
@@ -0,0 +1,65 @@
1# Development tool - build-sdk command plugin
2#
3# Copyright (C) 2015-2016 Intel Corporation
4#
5# This program is free software; you can redistribute it and/or modify
6# it under the terms of the GNU General Public License version 2 as
7# published by the Free Software Foundation.
8#
9# This program is distributed in the hope that it will be useful,
10# but WITHOUT ANY WARRANTY; without even the implied warranty of
11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12# GNU General Public License for more details.
13#
14# You should have received a copy of the GNU General Public License along
15# with this program; if not, write to the Free Software Foundation, Inc.,
16# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17
18import os
19import subprocess
20import logging
21import glob
22import shutil
23import errno
24import sys
25import tempfile
26from devtool import exec_build_env_command, setup_tinfoil, parse_recipe, DevtoolError
27from devtool import build_image
28
29logger = logging.getLogger('devtool')
30
31
32def build_sdk(args, config, basepath, workspace):
33 """Entry point for the devtool build-sdk command"""
34
35 sdk_targets = config.get('SDK', 'sdk_targets', '').split()
36 if sdk_targets:
37 image = sdk_targets[0]
38 else:
39 raise DevtoolError('Unable to determine image to build SDK for')
40
41 extra_append = ['SDK_DERIVATIVE = "1"']
42 try:
43 result, outputdir = build_image.build_image_task(config,
44 basepath,
45 workspace,
46 image,
47 task='populate_sdk_ext',
48 extra_append=extra_append)
49 except build_image.TargetNotImageError:
50 raise DevtoolError('Unable to determine image to build SDK for')
51
52 if result == 0:
53 logger.info('Successfully built SDK. You can find output files in %s'
54 % outputdir)
55 return result
56
57
58def register_commands(subparsers, context):
59 """Register devtool subcommands"""
60 if context.fixed_setup:
61 parser_build_sdk = subparsers.add_parser('build-sdk',
62 help='Build a derivative SDK of this one',
63 description='Builds an extensible SDK based upon this one and the items in your workspace',
64 group='advanced')
65 parser_build_sdk.set_defaults(func=build_sdk)