blob: 800e1175d751a323dfc8d33fafc5f38656f2f797 [file] [log] [blame]
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001# Extensible SDK
2
3inherit populate_sdk_base
4
5# NOTE: normally you cannot use task overrides for this kind of thing - this
6# only works because of get_sdk_ext_rdepends()
7
8TOOLCHAIN_HOST_TASK_task-populate-sdk-ext = " \
9 meta-environment-extsdk-${MACHINE} \
10 "
11
12TOOLCHAIN_TARGET_TASK_task-populate-sdk-ext = ""
13
Patrick Williamsc124f4f2015-09-15 14:41:29 -050014SDK_RELOCATE_AFTER_INSTALL_task-populate-sdk-ext = "0"
15
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050016SDK_EXT = ""
17SDK_EXT_task-populate-sdk-ext = "-ext"
18
19# Options are full or minimal
20SDK_EXT_TYPE ?= "full"
Patrick Williamsc0f7c042017-02-23 20:41:17 -060021SDK_INCLUDE_PKGDATA ?= "0"
Brad Bishop6e60e8b2018-02-01 10:27:11 -050022SDK_INCLUDE_TOOLCHAIN ?= "${@'1' if d.getVar('SDK_EXT_TYPE') == 'full' else '0'}"
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050023
24SDK_RECRDEP_TASKS ?= ""
25
Patrick Williamsc124f4f2015-09-15 14:41:29 -050026SDK_LOCAL_CONF_WHITELIST ?= ""
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050027SDK_LOCAL_CONF_BLACKLIST ?= "CONF_VERSION \
28 BB_NUMBER_THREADS \
Patrick Williamsc0f7c042017-02-23 20:41:17 -060029 BB_NUMBER_PARSE_THREADS \
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050030 PARALLEL_MAKE \
31 PRSERV_HOST \
32 SSTATE_MIRRORS \
Patrick Williamsc0f7c042017-02-23 20:41:17 -060033 DL_DIR \
34 SSTATE_DIR \
35 TMPDIR \
Brad Bishopd7bf8c12018-02-25 22:55:05 -050036 BB_SERVER_TIMEOUT \
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050037 "
Patrick Williamsc124f4f2015-09-15 14:41:29 -050038SDK_INHERIT_BLACKLIST ?= "buildhistory icecc"
39SDK_UPDATE_URL ?= ""
40
41SDK_TARGETS ?= "${PN}"
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050042
Patrick Williamsc0f7c042017-02-23 20:41:17 -060043def get_sdk_install_targets(d, images_only=False):
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050044 sdk_install_targets = ''
Brad Bishop6e60e8b2018-02-01 10:27:11 -050045 if images_only or d.getVar('SDK_EXT_TYPE') != 'minimal':
46 sdk_install_targets = d.getVar('SDK_TARGETS')
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050047
48 depd = d.getVar('BB_TASKDEPDATA', False)
Brad Bishop6e60e8b2018-02-01 10:27:11 -050049 tasklist = bb.build.tasksbetween('do_image_complete', 'do_build', d)
50 tasklist.remove('do_build')
Patrick Williamsc0f7c042017-02-23 20:41:17 -060051 for v in depd.values():
Brad Bishop6e60e8b2018-02-01 10:27:11 -050052 if v[1] in tasklist:
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050053 if v[0] not in sdk_install_targets:
54 sdk_install_targets += ' {}'.format(v[0])
55
Patrick Williamsc0f7c042017-02-23 20:41:17 -060056 if not images_only:
Brad Bishop6e60e8b2018-02-01 10:27:11 -050057 if d.getVar('SDK_INCLUDE_PKGDATA') == '1':
Patrick Williamsc0f7c042017-02-23 20:41:17 -060058 sdk_install_targets += ' meta-world-pkgdata:do_allpackagedata'
Brad Bishop6e60e8b2018-02-01 10:27:11 -050059 if d.getVar('SDK_INCLUDE_TOOLCHAIN') == '1':
Patrick Williamsc0f7c042017-02-23 20:41:17 -060060 sdk_install_targets += ' meta-extsdk-toolchain:do_populate_sysroot'
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050061
62 return sdk_install_targets
63
64get_sdk_install_targets[vardepsexclude] = "BB_TASKDEPDATA"
65
Patrick Williamsc124f4f2015-09-15 14:41:29 -050066OE_INIT_ENV_SCRIPT ?= "oe-init-build-env"
67
68# The files from COREBASE that you want preserved in the COREBASE copied
69# into the sdk. This allows someone to have their own setup scripts in
70# COREBASE be preserved as well as untracked files.
71COREBASE_FILES ?= " \
72 oe-init-build-env \
Patrick Williamsc124f4f2015-09-15 14:41:29 -050073 scripts \
74 LICENSE \
75 .templateconf \
76"
77
78SDK_DIR_task-populate-sdk-ext = "${WORKDIR}/sdk-ext"
79B_task-populate-sdk-ext = "${SDK_DIR}"
Brad Bishop6e60e8b2018-02-01 10:27:11 -050080TOOLCHAINEXT_OUTPUTNAME ?= "${SDK_NAME}-toolchain-ext-${SDK_VERSION}"
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050081TOOLCHAIN_OUTPUTNAME_task-populate-sdk-ext = "${TOOLCHAINEXT_OUTPUTNAME}"
82
83SDK_EXT_TARGET_MANIFEST = "${SDK_DEPLOY}/${TOOLCHAINEXT_OUTPUTNAME}.target.manifest"
84SDK_EXT_HOST_MANIFEST = "${SDK_DEPLOY}/${TOOLCHAINEXT_OUTPUTNAME}.host.manifest"
Patrick Williamsc124f4f2015-09-15 14:41:29 -050085
Brad Bishopd7bf8c12018-02-25 22:55:05 -050086python write_target_sdk_ext_manifest () {
87 from oe.sdk import get_extra_sdkinfo
88 sstate_dir = d.expand('${SDK_OUTPUT}/${SDKPATH}/sstate-cache')
89 extra_info = get_extra_sdkinfo(sstate_dir)
90
91 target = d.getVar('TARGET_SYS')
92 target_multimach = d.getVar('MULTIMACH_TARGET_SYS')
93 real_target_multimach = d.getVar('REAL_MULTIMACH_TARGET_SYS')
94
95 pkgs = {}
96 with open(d.getVar('SDK_EXT_TARGET_MANIFEST'), 'w') as f:
97 for fn in extra_info['filesizes']:
98 info = fn.split(':')
99 if info[2] in (target, target_multimach, real_target_multimach) \
100 or info[5] == 'allarch':
101 if not info[1] in pkgs:
102 f.write("%s %s %s\n" % (info[1], info[2], info[3]))
103 pkgs[info[1]] = {}
104}
105python write_host_sdk_ext_manifest () {
106 from oe.sdk import get_extra_sdkinfo
107 sstate_dir = d.expand('${SDK_OUTPUT}/${SDKPATH}/sstate-cache')
108 extra_info = get_extra_sdkinfo(sstate_dir)
109 host = d.getVar('BUILD_SYS')
110 with open(d.getVar('SDK_EXT_HOST_MANIFEST'), 'w') as f:
111 for fn in extra_info['filesizes']:
112 info = fn.split(':')
113 if info[2] == host:
114 f.write("%s %s %s\n" % (info[1], info[2], info[3]))
115}
116
117SDK_POSTPROCESS_COMMAND_append_task-populate-sdk-ext = "write_target_sdk_ext_manifest; write_host_sdk_ext_manifest; "
118
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500119SDK_TITLE_task-populate-sdk-ext = "${@d.getVar('DISTRO_NAME') or d.getVar('DISTRO')} Extensible SDK"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500120
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600121def clean_esdk_builddir(d, sdkbasepath):
122 """Clean up traces of the fake build for create_filtered_tasklist()"""
123 import shutil
Brad Bishop37a0e4d2017-12-04 01:01:44 -0500124 cleanpaths = 'cache conf/sanity_info tmp'.split()
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600125 for pth in cleanpaths:
126 fullpth = os.path.join(sdkbasepath, pth)
127 if os.path.isdir(fullpth):
128 shutil.rmtree(fullpth)
129 elif os.path.isfile(fullpth):
130 os.remove(fullpth)
131
132def create_filtered_tasklist(d, sdkbasepath, tasklistfile, conf_initpath):
133 """
134 Create a filtered list of tasks. Also double-checks that the build system
135 within the SDK basically works and required sstate artifacts are available.
136 """
137 import tempfile
138 import shutil
139 import oe.copy_buildsystem
140
141 # Create a temporary build directory that we can pass to the env setup script
142 shutil.copyfile(sdkbasepath + '/conf/local.conf', sdkbasepath + '/conf/local.conf.bak')
143 try:
144 with open(sdkbasepath + '/conf/local.conf', 'a') as f:
145 # Force the use of sstate from the build system
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500146 f.write('\nSSTATE_DIR_forcevariable = "%s"\n' % d.getVar('SSTATE_DIR'))
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500147 f.write('SSTATE_MIRRORS_forcevariable = "file://universal/(.*) file://universal-4.9/\\1 file://universal-4.9/(.*) file://universal-4.8/\\1"\n')
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600148 # Ensure TMPDIR is the default so that clean_esdk_builddir() can delete it
149 f.write('TMPDIR_forcevariable = "${TOPDIR}/tmp"\n')
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500150 f.write('TCLIBCAPPEND_forcevariable = ""\n')
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600151 # Drop uninative if the build isn't using it (or else NATIVELSBSTRING will
152 # be different and we won't be able to find our native sstate)
153 if not bb.data.inherits_class('uninative', d):
154 f.write('INHERIT_remove = "uninative"\n')
155
156 # Unfortunately the default SDKPATH (or even a custom value) may contain characters that bitbake
157 # will not allow in its COREBASE path, so we need to rename the directory temporarily
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500158 temp_sdkbasepath = d.getVar('SDK_OUTPUT') + '/tmp-renamed-sdk'
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600159 # Delete any existing temp dir
160 try:
161 shutil.rmtree(temp_sdkbasepath)
162 except FileNotFoundError:
163 pass
164 os.rename(sdkbasepath, temp_sdkbasepath)
Brad Bishop316dfdd2018-06-25 12:45:53 -0400165 cmdprefix = '. %s .; ' % conf_initpath
166 logfile = d.getVar('WORKDIR') + '/tasklist_bb_log.txt'
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600167 try:
Brad Bishop316dfdd2018-06-25 12:45:53 -0400168 oe.copy_buildsystem.check_sstate_task_list(d, get_sdk_install_targets(d), tasklistfile, cmdprefix=cmdprefix, cwd=temp_sdkbasepath, logfile=logfile)
169 except bb.process.ExecutionError as e:
170 msg = 'Failed to generate filtered task list for extensible SDK:\n%s' % e.stdout.rstrip()
171 if 'attempted to execute unexpectedly and should have been setscened' in e.stdout:
172 msg += '\n----------\n\nNOTE: "attempted to execute unexpectedly and should have been setscened" errors indicate this may be caused by missing sstate artifacts that were likely produced in earlier builds, but have been subsequently deleted for some reason.\n'
173 bb.fatal(msg)
174 os.rename(temp_sdkbasepath, sdkbasepath)
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600175 # Clean out residue of running bitbake, which check_sstate_task_list()
176 # will effectively do
177 clean_esdk_builddir(d, sdkbasepath)
178 finally:
179 os.replace(sdkbasepath + '/conf/local.conf.bak', sdkbasepath + '/conf/local.conf')
180
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500181python copy_buildsystem () {
182 import re
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500183 import shutil
184 import glob
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500185 import oe.copy_buildsystem
186
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500187 oe_init_env_script = d.getVar('OE_INIT_ENV_SCRIPT')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500188
189 conf_bbpath = ''
190 conf_initpath = ''
191 core_meta_subdir = ''
192
193 # Copy in all metadata layers + bitbake (as repositories)
Patrick Williamsf1e5d692016-03-30 15:21:19 -0500194 buildsystem = oe.copy_buildsystem.BuildSystem('extensible SDK', d)
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500195 baseoutpath = d.getVar('SDK_OUTPUT') + '/' + d.getVar('SDKPATH')
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500196
197 # Determine if we're building a derivative extensible SDK (from devtool build-sdk)
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500198 derivative = (d.getVar('SDK_DERIVATIVE') or '') == '1'
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500199 if derivative:
200 workspace_name = 'orig-workspace'
201 else:
202 workspace_name = None
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500203
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800204 corebase, sdkbblayers = buildsystem.copy_bitbake_and_layers(baseoutpath + '/layers', workspace_name)
205 conf_bbpath = os.path.join('layers', corebase, 'bitbake')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500206
207 for path in os.listdir(baseoutpath + '/layers'):
208 relpath = os.path.join('layers', path, oe_init_env_script)
209 if os.path.exists(os.path.join(baseoutpath, relpath)):
210 conf_initpath = relpath
211
212 relpath = os.path.join('layers', path, 'scripts', 'devtool')
213 if os.path.exists(os.path.join(baseoutpath, relpath)):
214 scriptrelpath = os.path.dirname(relpath)
215
216 relpath = os.path.join('layers', path, 'meta')
217 if os.path.exists(os.path.join(baseoutpath, relpath, 'lib', 'oe')):
218 core_meta_subdir = relpath
219
220 d.setVar('oe_init_build_env_path', conf_initpath)
221 d.setVar('scriptrelpath', scriptrelpath)
222
223 # Write out config file for devtool
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600224 import configparser
225 config = configparser.SafeConfigParser()
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500226 config.add_section('General')
227 config.set('General', 'bitbake_subdir', conf_bbpath)
228 config.set('General', 'init_path', conf_initpath)
229 config.set('General', 'core_meta_subdir', core_meta_subdir)
230 config.add_section('SDK')
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500231 config.set('SDK', 'sdk_targets', d.getVar('SDK_TARGETS'))
232 updateurl = d.getVar('SDK_UPDATE_URL')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500233 if updateurl:
234 config.set('SDK', 'updateserver', updateurl)
235 bb.utils.mkdirhier(os.path.join(baseoutpath, 'conf'))
236 with open(os.path.join(baseoutpath, 'conf', 'devtool.conf'), 'w') as f:
237 config.write(f)
238
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500239 unlockedsigs = os.path.join(baseoutpath, 'conf', 'unlocked-sigs.inc')
240 with open(unlockedsigs, 'w') as f:
241 pass
242
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500243 # Create a layer for new recipes / appends
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500244 bbpath = d.getVar('BBPATH')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500245 bb.process.run(['devtool', '--bbpath', bbpath, '--basepath', baseoutpath, 'create-workspace', '--create-only', os.path.join(baseoutpath, 'workspace')])
246
247 # Create bblayers.conf
248 bb.utils.mkdirhier(baseoutpath + '/conf')
249 with open(baseoutpath + '/conf/bblayers.conf', 'w') as f:
250 f.write('# WARNING: this configuration has been automatically generated and in\n')
251 f.write('# most cases should not be edited. If you need more flexibility than\n')
252 f.write('# this configuration provides, it is strongly suggested that you set\n')
253 f.write('# up a proper instance of the full build system and use that instead.\n\n')
254
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500255 # LCONF_VERSION may not be set, for example when using meta-poky
256 # so don't error if it isn't found
257 lconf_version = d.getVar('LCONF_VERSION', False)
258 if lconf_version is not None:
259 f.write('LCONF_VERSION = "%s"\n\n' % lconf_version)
260
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500261 f.write('BBPATH = "$' + '{TOPDIR}"\n')
262 f.write('SDKBASEMETAPATH = "$' + '{TOPDIR}"\n')
263 f.write('BBLAYERS := " \\\n')
264 for layerrelpath in sdkbblayers:
265 f.write(' $' + '{SDKBASEMETAPATH}/layers/%s \\\n' % layerrelpath)
266 f.write(' $' + '{SDKBASEMETAPATH}/workspace \\\n')
267 f.write(' "\n')
268
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600269 # Copy uninative tarball
270 # For now this is where uninative.bbclass expects the tarball
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500271 if bb.data.inherits_class('uninative', d):
272 uninative_file = d.expand('${UNINATIVE_DLDIR}/' + d.getVarFlag("UNINATIVE_CHECKSUM", d.getVar("BUILD_ARCH")) + '/${UNINATIVE_TARBALL}')
273 uninative_checksum = bb.utils.sha256_file(uninative_file)
274 uninative_outdir = '%s/downloads/uninative/%s' % (baseoutpath, uninative_checksum)
275 bb.utils.mkdirhier(uninative_outdir)
276 shutil.copy(uninative_file, uninative_outdir)
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600277
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500278 env_whitelist = (d.getVar('BB_ENV_EXTRAWHITE') or '').split()
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500279 env_whitelist_values = {}
280
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500281 # Create local.conf
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500282 builddir = d.getVar('TOPDIR')
Brad Bishopa5c52ff2018-11-23 10:55:50 +1300283 if derivative and os.path.exists(builddir + '/conf/site.conf'):
284 shutil.copyfile(builddir + '/conf/site.conf', baseoutpath + '/conf/site.conf')
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500285 if derivative and os.path.exists(builddir + '/conf/auto.conf'):
286 shutil.copyfile(builddir + '/conf/auto.conf', baseoutpath + '/conf/auto.conf')
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500287 if derivative:
288 shutil.copyfile(builddir + '/conf/local.conf', baseoutpath + '/conf/local.conf')
289 else:
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500290 local_conf_whitelist = (d.getVar('SDK_LOCAL_CONF_WHITELIST') or '').split()
291 local_conf_blacklist = (d.getVar('SDK_LOCAL_CONF_BLACKLIST') or '').split()
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500292 def handle_var(varname, origvalue, op, newlines):
293 if varname in local_conf_blacklist or (origvalue.strip().startswith('/') and not varname in local_conf_whitelist):
294 newlines.append('# Removed original setting of %s\n' % varname)
295 return None, op, 0, True
296 else:
297 if varname in env_whitelist:
298 env_whitelist_values[varname] = origvalue
299 return origvalue, op, 0, True
300 varlist = ['[^#=+ ]*']
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500301 oldlines = []
Brad Bishopa5c52ff2018-11-23 10:55:50 +1300302 if os.path.exists(builddir + '/conf/site.conf'):
303 with open(builddir + '/conf/site.conf', 'r') as f:
304 oldlines += f.readlines()
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500305 if os.path.exists(builddir + '/conf/auto.conf'):
306 with open(builddir + '/conf/auto.conf', 'r') as f:
307 oldlines += f.readlines()
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500308 with open(builddir + '/conf/local.conf', 'r') as f:
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500309 oldlines += f.readlines()
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500310 (updated, newlines) = bb.utils.edit_metadata(oldlines, varlist, handle_var)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500311
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500312 with open(baseoutpath + '/conf/local.conf', 'w') as f:
313 f.write('# WARNING: this configuration has been automatically generated and in\n')
314 f.write('# most cases should not be edited. If you need more flexibility than\n')
315 f.write('# this configuration provides, it is strongly suggested that you set\n')
316 f.write('# up a proper instance of the full build system and use that instead.\n\n')
317 for line in newlines:
318 if line.strip() and not line.startswith('#'):
319 f.write(line)
320 # Write a newline just in case there's none at the end of the original
321 f.write('\n')
322
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500323 f.write('TMPDIR = "${TOPDIR}/tmp"\n')
324 f.write('TCLIBCAPPEND = ""\n')
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600325 f.write('DL_DIR = "${TOPDIR}/downloads"\n')
326
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800327 if bb.data.inherits_class('uninative', d):
328 f.write('INHERIT += "%s"\n' % 'uninative')
329 f.write('UNINATIVE_CHECKSUM[%s] = "%s"\n\n' % (d.getVar('BUILD_ARCH'), uninative_checksum))
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500330 f.write('CONF_VERSION = "%s"\n\n' % d.getVar('CONF_VERSION', False))
331
332 # Some classes are not suitable for SDK, remove them from INHERIT
333 f.write('INHERIT_remove = "%s"\n' % d.getVar('SDK_INHERIT_BLACKLIST', False))
334
335 # Bypass the default connectivity check if any
336 f.write('CONNECTIVITY_CHECK_URIS = ""\n\n')
337
338 # This warning will come out if reverse dependencies for a task
339 # don't have sstate as well as the task itself. We already know
340 # this will be the case for the extensible sdk, so turn off the
341 # warning.
342 f.write('SIGGEN_LOCKEDSIGS_SSTATE_EXISTS_CHECK = "none"\n\n')
343
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600344 # Warn if the sigs in the locked-signature file don't match
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500345 # the sig computed from the metadata.
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600346 f.write('SIGGEN_LOCKEDSIGS_TASKSIG_CHECK = "warn"\n\n')
347
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500348 # We want to be able to set this without a full reparse
349 f.write('BB_HASHCONFIG_WHITELIST_append = " SIGGEN_UNLOCKED_RECIPES"\n\n')
350
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600351 # Set up whitelist for run on install
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500352 f.write('BB_SETSCENE_ENFORCE_WHITELIST = "%:* *:do_shared_workdir *:do_rm_work wic-tools:* *:do_addto_recipe_sysroot"\n\n')
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500353
354 # Hide the config information from bitbake output (since it's fixed within the SDK)
Brad Bishop37a0e4d2017-12-04 01:01:44 -0500355 f.write('BUILDCFG_HEADER = ""\n\n')
356
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500357 f.write('# Provide a flag to indicate we are in the EXT_SDK Context\n')
358 f.write('WITHIN_EXT_SDK = "1"\n\n')
359
Brad Bishop37a0e4d2017-12-04 01:01:44 -0500360 # Map gcc-dependent uninative sstate cache for installer usage
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500361 f.write('SSTATE_MIRRORS += " file://universal/(.*) file://universal-4.9/\\1 file://universal-4.9/(.*) file://universal-4.8/\\1"\n\n')
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500362
363 # Allow additional config through sdk-extra.conf
364 fn = bb.cookerdata.findConfigFile('sdk-extra.conf', d)
365 if fn:
366 with open(fn, 'r') as xf:
367 for line in xf:
368 f.write(line)
369
370 # If you define a sdk_extraconf() function then it can contain additional config
371 # (Though this is awkward; sdk-extra.conf should probably be used instead)
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500372 extraconf = (d.getVar('sdk_extraconf') or '').strip()
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500373 if extraconf:
374 # Strip off any leading / trailing spaces
375 for line in extraconf.splitlines():
376 f.write(line.strip() + '\n')
377
378 f.write('require conf/locked-sigs.inc\n')
379 f.write('require conf/unlocked-sigs.inc\n')
380
Brad Bishop37a0e4d2017-12-04 01:01:44 -0500381 # Write a templateconf.cfg
382 with open(baseoutpath + '/conf/templateconf.cfg', 'w') as f:
383 f.write('meta/conf\n')
384
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500385 # Ensure any variables set from the external environment (by way of
386 # BB_ENV_EXTRAWHITE) are set in the SDK's configuration
387 extralines = []
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600388 for name, value in env_whitelist_values.items():
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500389 actualvalue = d.getVar(name) or ''
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500390 if value != actualvalue:
391 extralines.append('%s = "%s"\n' % (name, actualvalue))
392 if extralines:
393 with open(baseoutpath + '/conf/local.conf', 'a') as f:
394 f.write('\n')
395 f.write('# Extra settings from environment:\n')
396 for line in extralines:
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500397 f.write(line)
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500398 f.write('\n')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500399
400 # Filter the locked signatures file to just the sstate tasks we are interested in
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600401 excluded_targets = get_sdk_install_targets(d, images_only=True)
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500402 sigfile = d.getVar('WORKDIR') + '/locked-sigs.inc'
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500403 lockedsigs_pruned = baseoutpath + '/conf/locked-sigs.inc'
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500404 oe.copy_buildsystem.prune_lockedsigs([],
405 excluded_targets.split(),
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500406 sigfile,
407 lockedsigs_pruned)
408
409 sstate_out = baseoutpath + '/sstate-cache'
410 bb.utils.remove(sstate_out, True)
Brad Bishop37a0e4d2017-12-04 01:01:44 -0500411
412 # uninative.bbclass sets NATIVELSBSTRING to 'universal%s' % oe.utils.host_gcc_version(d)
413 fixedlsbstring = "universal%s" % oe.utils.host_gcc_version(d)
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500414
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500415 sdk_include_toolchain = (d.getVar('SDK_INCLUDE_TOOLCHAIN') == '1')
416 sdk_ext_type = d.getVar('SDK_EXT_TYPE')
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600417 if sdk_ext_type != 'minimal' or sdk_include_toolchain or derivative:
418 # Create the filtered task list used to generate the sstate cache shipped with the SDK
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500419 tasklistfn = d.getVar('WORKDIR') + '/tasklist.txt'
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600420 create_filtered_tasklist(d, baseoutpath, tasklistfn, conf_initpath)
421 else:
422 tasklistfn = None
423
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500424 # Add packagedata if enabled
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500425 if d.getVar('SDK_INCLUDE_PKGDATA') == '1':
426 lockedsigs_base = d.getVar('WORKDIR') + '/locked-sigs-base.inc'
427 lockedsigs_copy = d.getVar('WORKDIR') + '/locked-sigs-copy.inc'
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500428 shutil.move(lockedsigs_pruned, lockedsigs_base)
429 oe.copy_buildsystem.merge_lockedsigs(['do_packagedata'],
430 lockedsigs_base,
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500431 d.getVar('STAGING_DIR_HOST') + '/world-pkgdata/locked-sigs-pkgdata.inc',
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500432 lockedsigs_pruned,
433 lockedsigs_copy)
434
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600435 if sdk_include_toolchain:
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500436 lockedsigs_base = d.getVar('WORKDIR') + '/locked-sigs-base2.inc'
437 lockedsigs_toolchain = d.expand("${STAGING_DIR}/${TUNE_PKGARCH}/meta-extsdk-toolchain/locked-sigs/locked-sigs-extsdk-toolchain.inc")
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600438 shutil.move(lockedsigs_pruned, lockedsigs_base)
439 oe.copy_buildsystem.merge_lockedsigs([],
440 lockedsigs_base,
441 lockedsigs_toolchain,
442 lockedsigs_pruned)
443 oe.copy_buildsystem.create_locked_sstate_cache(lockedsigs_toolchain,
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500444 d.getVar('SSTATE_DIR'),
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600445 sstate_out, d,
446 fixedlsbstring,
447 filterfile=tasklistfn)
448
449 if sdk_ext_type == 'minimal':
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500450 if derivative:
451 # Assume the user is not going to set up an additional sstate
452 # mirror, thus we need to copy the additional artifacts (from
453 # workspace recipes) into the derivative SDK
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500454 lockedsigs_orig = d.getVar('TOPDIR') + '/conf/locked-sigs.inc'
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500455 if os.path.exists(lockedsigs_orig):
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500456 lockedsigs_extra = d.getVar('WORKDIR') + '/locked-sigs-extra.inc'
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500457 oe.copy_buildsystem.merge_lockedsigs(None,
458 lockedsigs_orig,
459 lockedsigs_pruned,
460 None,
461 lockedsigs_extra)
462 oe.copy_buildsystem.create_locked_sstate_cache(lockedsigs_extra,
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500463 d.getVar('SSTATE_DIR'),
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500464 sstate_out, d,
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600465 fixedlsbstring,
466 filterfile=tasklistfn)
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500467 else:
468 oe.copy_buildsystem.create_locked_sstate_cache(lockedsigs_pruned,
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500469 d.getVar('SSTATE_DIR'),
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500470 sstate_out, d,
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600471 fixedlsbstring,
472 filterfile=tasklistfn)
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500473
474 # We don't need sstate do_package files
475 for root, dirs, files in os.walk(sstate_out):
476 for name in files:
477 if name.endswith("_package.tgz"):
478 f = os.path.join(root, name)
479 os.remove(f)
480
481 # Write manifest file
482 # Note: at the moment we cannot include the env setup script here to keep
483 # it updated, since it gets modified during SDK installation (see
484 # sdk_ext_postinst() below) thus the checksum we take here would always
485 # be different.
486 manifest_file_list = ['conf/*']
487 manifest_file = os.path.join(baseoutpath, 'conf', 'sdk-conf-manifest')
488 with open(manifest_file, 'w') as f:
489 for item in manifest_file_list:
490 for fn in glob.glob(os.path.join(baseoutpath, item)):
491 if fn == manifest_file:
492 continue
493 chksum = bb.utils.sha256_file(fn)
494 f.write('%s\t%s\n' % (chksum, os.path.relpath(fn, baseoutpath)))
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500495}
496
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600497def get_current_buildtools(d):
498 """Get the file name of the current buildtools installer"""
499 import glob
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500500 btfiles = glob.glob(os.path.join(d.getVar('SDK_DEPLOY'), '*-buildtools-nativesdk-standalone-*.sh'))
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600501 btfiles.sort(key=os.path.getctime)
502 return os.path.basename(btfiles[-1])
503
504def get_sdk_required_utilities(buildtools_fn, d):
505 """Find required utilities that aren't provided by the buildtools"""
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500506 sanity_required_utilities = (d.getVar('SANITY_REQUIRED_UTILITIES') or '').split()
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600507 sanity_required_utilities.append(d.expand('${BUILD_PREFIX}gcc'))
508 sanity_required_utilities.append(d.expand('${BUILD_PREFIX}g++'))
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500509 buildtools_installer = os.path.join(d.getVar('SDK_DEPLOY'), buildtools_fn)
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600510 filelist, _ = bb.process.run('%s -l' % buildtools_installer)
511 localdata = bb.data.createCopy(d)
512 localdata.setVar('SDKPATH', '.')
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500513 sdkpathnative = localdata.getVar('SDKPATHNATIVE')
514 sdkbindirs = [localdata.getVar('bindir_nativesdk'),
515 localdata.getVar('sbindir_nativesdk'),
516 localdata.getVar('base_bindir_nativesdk'),
517 localdata.getVar('base_sbindir_nativesdk')]
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600518 for line in filelist.splitlines():
519 splitline = line.split()
520 if len(splitline) > 5:
521 fn = splitline[5]
522 if not fn.startswith('./'):
523 fn = './%s' % fn
524 if fn.startswith(sdkpathnative):
525 relpth = '/' + os.path.relpath(fn, sdkpathnative)
526 for bindir in sdkbindirs:
527 if relpth.startswith(bindir):
528 relpth = os.path.relpath(relpth, bindir)
529 if relpth in sanity_required_utilities:
530 sanity_required_utilities.remove(relpth)
531 break
532 return ' '.join(sanity_required_utilities)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500533
534install_tools() {
535 install -d ${SDK_OUTPUT}/${SDKPATHNATIVE}${bindir_nativesdk}
Brad Bishop316dfdd2018-06-25 12:45:53 -0400536 scripts="devtool recipetool oe-find-native-sysroot runqemu* wic"
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600537 for script in $scripts; do
538 for scriptfn in `find ${SDK_OUTPUT}/${SDKPATH}/${scriptrelpath} -maxdepth 1 -executable -name "$script"`; do
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800539 targetscriptfn="${SDK_OUTPUT}/${SDKPATHNATIVE}${bindir_nativesdk}/$(basename $scriptfn)"
540 test -e ${targetscriptfn} || lnr ${scriptfn} ${targetscriptfn}
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600541 done
542 done
543 # We can't use the same method as above because files in the sysroot won't exist at this point
544 # (they get populated from sstate on installation)
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500545 unfsd_path="${SDK_OUTPUT}/${SDKPATHNATIVE}${bindir_nativesdk}/unfsd"
546 if [ "${SDK_INCLUDE_TOOLCHAIN}" = "1" -a ! -e $unfsd_path ] ; then
547 binrelpath=${@os.path.relpath(d.getVar('STAGING_BINDIR_NATIVE'), d.getVar('TMPDIR'))}
548 lnr ${SDK_OUTPUT}/${SDKPATH}/tmp/$binrelpath/unfsd $unfsd_path
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600549 fi
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500550 touch ${SDK_OUTPUT}/${SDKPATH}/.devtoolbase
551
552 # find latest buildtools-tarball and install it
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600553 install ${SDK_DEPLOY}/${SDK_BUILDTOOLS_INSTALLER} ${SDK_OUTPUT}/${SDKPATH}
Patrick Williamsf1e5d692016-03-30 15:21:19 -0500554
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500555 install -m 0644 ${COREBASE}/meta/files/ext-sdk-prepare.py ${SDK_OUTPUT}/${SDKPATH}
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500556}
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500557do_populate_sdk_ext[file-checksums] += "${COREBASE}/meta/files/ext-sdk-prepare.py:True"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500558
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500559sdk_ext_preinst() {
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600560 # Since bitbake won't run as root it doesn't make sense to try and install
561 # the extensible sdk as root.
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500562 if [ "`id -u`" = "0" ]; then
563 echo "ERROR: The extensible sdk cannot be installed as root."
564 exit 1
565 fi
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600566 if ! command -v locale > /dev/null; then
567 echo "ERROR: The installer requires the locale command, please install it first"
568 exit 1
569 fi
570 # Check setting of LC_ALL set above
571 canonicalised_locale=`echo $LC_ALL | sed 's/UTF-8/utf8/'`
572 if ! locale -a | grep -q $canonicalised_locale ; then
573 echo "ERROR: the installer requires the $LC_ALL locale to be installed (but not selected), please install it first"
574 exit 1
575 fi
576 # The relocation script used by buildtools installer requires python
577 if ! command -v python > /dev/null; then
578 echo "ERROR: The installer requires python, please install it first"
579 exit 1
580 fi
581 missing_utils=""
582 for util in ${SDK_REQUIRED_UTILITIES}; do
583 if ! command -v $util > /dev/null; then
584 missing_utils="$missing_utils $util"
585 fi
586 done
587 if [ -n "$missing_utils" ] ; then
588 echo "ERROR: the SDK requires the following missing utilities, please install them: $missing_utils"
589 exit 1
590 fi
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500591 SDK_EXTENSIBLE="1"
Brad Bishop19323692019-04-05 15:28:33 -0400592 if [ "$publish" = "1" ] && [ "${SDK_EXT_TYPE}" = "minimal" ] ; then
593 EXTRA_TAR_OPTIONS="$EXTRA_TAR_OPTIONS --exclude=sstate-cache"
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500594 fi
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500595}
596SDK_PRE_INSTALL_COMMAND_task-populate-sdk-ext = "${sdk_ext_preinst}"
597
598# FIXME this preparation should be done as part of the SDK construction
599sdk_ext_postinst() {
600 printf "\nExtracting buildtools...\n"
601 cd $target_sdk_dir
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600602 env_setup_script="$target_sdk_dir/environment-setup-${REAL_MULTIMACH_TARGET_SYS}"
603 printf "buildtools\ny" | ./${SDK_BUILDTOOLS_INSTALLER} > buildtools.log || { printf 'ERROR: buildtools installation failed:\n' ; cat buildtools.log ; echo "printf 'ERROR: this SDK was not fully installed and needs reinstalling\n'" >> $env_setup_script ; exit 1 ; }
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500604
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500605 # Delete the buildtools tar file since it won't be used again
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600606 rm -f ./${SDK_BUILDTOOLS_INSTALLER}
607 # We don't need the log either since it succeeded
608 rm -f buildtools.log
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500609
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500610 # Make sure when the user sets up the environment, they also get
611 # the buildtools-tarball tools in their path.
Patrick Williamsf1e5d692016-03-30 15:21:19 -0500612 echo ". $target_sdk_dir/buildtools/environment-setup*" >> $env_setup_script
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500613
614 # Allow bitbake environment setup to be ran as part of this sdk.
Patrick Williamsf1e5d692016-03-30 15:21:19 -0500615 echo "export OE_SKIP_SDK_CHECK=1" >> $env_setup_script
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500616 # Work around runqemu not knowing how to get this information within the eSDK
617 echo "export DEPLOY_DIR_IMAGE=$target_sdk_dir/tmp/${@os.path.relpath(d.getVar('DEPLOY_DIR_IMAGE'), d.getVar('TMPDIR'))}" >> $env_setup_script
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500618
619 # A bit of another hack, but we need this in the path only for devtool
620 # so put it at the end of $PATH.
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500621 echo "export PATH=$target_sdk_dir/sysroots/${SDK_SYS}${bindir_nativesdk}:\$PATH" >> $env_setup_script
Patrick Williamsf1e5d692016-03-30 15:21:19 -0500622
623 echo "printf 'SDK environment now set up; additionally you may now run devtool to perform development tasks.\nRun devtool --help for further details.\n'" >> $env_setup_script
624
625 # Warn if trying to use external bitbake and the ext SDK together
626 echo "(which bitbake > /dev/null 2>&1 && echo 'WARNING: attempting to use the extensible SDK in an environment set up to run bitbake - this may lead to unexpected results. Please source this script in a new shell session instead.') || true" >> $env_setup_script
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500627
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500628 if [ "$prepare_buildsystem" != "no" ]; then
Patrick Williamsf1e5d692016-03-30 15:21:19 -0500629 printf "Preparing build system...\n"
630 # dash which is /bin/sh on Ubuntu will not preserve the
631 # current working directory when first ran, nor will it set $1 when
632 # sourcing a script. That is why this has to look so ugly.
633 LOGFILE="$target_sdk_dir/preparing_build_system.log"
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600634 sh -c ". buildtools/environment-setup* > $LOGFILE && cd $target_sdk_dir/`dirname ${oe_init_build_env_path}` && set $target_sdk_dir && . $target_sdk_dir/${oe_init_build_env_path} $target_sdk_dir >> $LOGFILE && python $target_sdk_dir/ext-sdk-prepare.py $LOGFILE '${SDK_INSTALL_TARGETS}'" || { echo "printf 'ERROR: this SDK was not fully installed and needs reinstalling\n'" >> $env_setup_script ; exit 1 ; }
Brad Bishop19323692019-04-05 15:28:33 -0400635 fi
636 if [ -e $target_sdk_dir/ext-sdk-prepare.py ]; then
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500637 rm $target_sdk_dir/ext-sdk-prepare.py
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500638 fi
639 echo done
640}
641
642SDK_POST_INSTALL_COMMAND_task-populate-sdk-ext = "${sdk_ext_postinst}"
643
644SDK_POSTPROCESS_COMMAND_prepend_task-populate-sdk-ext = "copy_buildsystem; install_tools; "
645
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500646SDK_INSTALL_TARGETS = ""
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500647fakeroot python do_populate_sdk_ext() {
Patrick Williamsf1e5d692016-03-30 15:21:19 -0500648 # FIXME hopefully we can remove this restriction at some point, but uninative
649 # currently forces this upon us
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500650 if d.getVar('SDK_ARCH') != d.getVar('BUILD_ARCH'):
651 bb.fatal('The extensible SDK can currently only be built for the same architecture as the machine being built on - SDK_ARCH is set to %s (likely via setting SDKMACHINE) which is different from the architecture of the build machine (%s). Unable to continue.' % (d.getVar('SDK_ARCH'), d.getVar('BUILD_ARCH')))
Patrick Williamsf1e5d692016-03-30 15:21:19 -0500652
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500653 d.setVar('SDK_INSTALL_TARGETS', get_sdk_install_targets(d))
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600654 buildtools_fn = get_current_buildtools(d)
655 d.setVar('SDK_REQUIRED_UTILITIES', get_sdk_required_utilities(buildtools_fn, d))
656 d.setVar('SDK_BUILDTOOLS_INSTALLER', buildtools_fn)
657 d.setVar('SDKDEPLOYDIR', '${SDKEXTDEPLOYDIR}')
Brad Bishop00111322018-04-01 22:23:53 -0400658 # ESDKs have a libc from the buildtools so ensure we don't ship linguas twice
659 d.delVar('SDKIMAGE_LINGUAS')
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600660 populate_sdk_common(d)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500661}
662
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500663def get_ext_sdk_depends(d):
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600664 # Note: the deps varflag is a list not a string, so we need to specify expand=False
665 deps = d.getVarFlag('do_image_complete', 'deps', False)
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500666 pn = d.getVar('PN')
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600667 deplist = ['%s:%s' % (pn, dep) for dep in deps]
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500668 tasklist = bb.build.tasksbetween('do_image_complete', 'do_build', d)
669 tasklist.append('do_rootfs')
670 for task in tasklist:
671 deplist.extend((d.getVarFlag(task, 'depends') or '').split())
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600672 return ' '.join(deplist)
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500673
674python do_sdk_depends() {
675 # We have to do this separately in its own task so we avoid recursing into
676 # dependencies we don't need to (e.g. buildtools-tarball) and bringing those
677 # into the SDK's sstate-cache
678 import oe.copy_buildsystem
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500679 sigfile = d.getVar('WORKDIR') + '/locked-sigs.inc'
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500680 oe.copy_buildsystem.generate_locked_sigs(sigfile, d)
681}
682addtask sdk_depends
683
684do_sdk_depends[dirs] = "${WORKDIR}"
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500685do_sdk_depends[depends] = "${@get_ext_sdk_depends(d)} meta-extsdk-toolchain:do_populate_sysroot"
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500686do_sdk_depends[recrdeptask] = "${@d.getVarFlag('do_populate_sdk', 'recrdeptask', False)}"
687do_sdk_depends[recrdeptask] += "do_populate_lic do_package_qa do_populate_sysroot do_deploy ${SDK_RECRDEP_TASKS}"
688do_sdk_depends[rdepends] = "${@get_sdk_ext_rdepends(d)}"
689
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500690def get_sdk_ext_rdepends(d):
691 localdata = d.createCopy()
692 localdata.appendVar('OVERRIDES', ':task-populate-sdk-ext')
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500693 return localdata.getVarFlag('do_populate_sdk', 'rdepends')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500694
695do_populate_sdk_ext[dirs] = "${@d.getVarFlag('do_populate_sdk', 'dirs', False)}"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500696
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500697do_populate_sdk_ext[depends] = "${@d.getVarFlag('do_populate_sdk', 'depends', False)} \
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500698 buildtools-tarball:do_populate_sdk \
699 ${@'meta-world-pkgdata:do_collect_packagedata' if d.getVar('SDK_INCLUDE_PKGDATA') == '1' else ''} \
700 ${@'meta-extsdk-toolchain:do_locked_sigs' if d.getVar('SDK_INCLUDE_TOOLCHAIN') == '1' else ''}"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500701
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500702# We must avoid depending on do_build here if rm_work.bbclass is active,
703# because otherwise do_rm_work may run before do_populate_sdk_ext itself.
704# We can't mark do_populate_sdk_ext and do_sdk_depends as having to
705# run before do_rm_work, because then they would also run as part
706# of normal builds.
707do_populate_sdk_ext[rdepends] += "${@' '.join([x + ':' + (d.getVar('RM_WORK_BUILD_WITHOUT') or 'do_build') for x in d.getVar('SDK_TARGETS').split()])}"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500708
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500709# Make sure code changes can result in rebuild
710do_populate_sdk_ext[vardeps] += "copy_buildsystem \
711 sdk_ext_postinst"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500712
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500713# Since any change in the metadata of any layer should cause a rebuild of the
714# sdk(since the layers are put in the sdk) set the task to nostamp so it
715# always runs.
716do_populate_sdk_ext[nostamp] = "1"
717
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600718SDKEXTDEPLOYDIR = "${WORKDIR}/deploy-${PN}-populate-sdk-ext"
719
720SSTATETASKS += "do_populate_sdk_ext"
721SSTATE_SKIP_CREATION_task-populate-sdk-ext = '1'
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500722do_populate_sdk_ext[cleandirs] = "${SDKEXTDEPLOYDIR}"
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600723do_populate_sdk_ext[sstate-inputdirs] = "${SDKEXTDEPLOYDIR}"
724do_populate_sdk_ext[sstate-outputdirs] = "${SDK_DEPLOY}"
Brad Bishop316dfdd2018-06-25 12:45:53 -0400725do_populate_sdk_ext[stamp-extra-info] = "${MACHINE_ARCH}"
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600726
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500727addtask populate_sdk_ext after do_sdk_depends