populate_sdk_ext.bbclass 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443
  1. # Extensible SDK
  2. inherit populate_sdk_base
  3. # NOTE: normally you cannot use task overrides for this kind of thing - this
  4. # only works because of get_sdk_ext_rdepends()
  5. TOOLCHAIN_HOST_TASK_task-populate-sdk-ext = " \
  6. meta-environment-extsdk-${MACHINE} \
  7. "
  8. TOOLCHAIN_TARGET_TASK_task-populate-sdk-ext = ""
  9. SDK_RDEPENDS_append_task-populate-sdk-ext = " ${SDK_TARGETS}"
  10. SDK_RELOCATE_AFTER_INSTALL_task-populate-sdk-ext = "0"
  11. SDK_EXT = ""
  12. SDK_EXT_task-populate-sdk-ext = "-ext"
  13. # Options are full or minimal
  14. SDK_EXT_TYPE ?= "full"
  15. SDK_RECRDEP_TASKS ?= ""
  16. SDK_LOCAL_CONF_WHITELIST ?= ""
  17. SDK_LOCAL_CONF_BLACKLIST ?= "CONF_VERSION \
  18. BB_NUMBER_THREADS \
  19. PARALLEL_MAKE \
  20. PRSERV_HOST \
  21. SSTATE_MIRRORS \
  22. "
  23. SDK_INHERIT_BLACKLIST ?= "buildhistory icecc"
  24. SDK_UPDATE_URL ?= ""
  25. SDK_TARGETS ?= "${PN}"
  26. def get_sdk_install_targets(d):
  27. sdk_install_targets = ''
  28. if d.getVar('SDK_EXT_TYPE', True) != 'minimal':
  29. sdk_install_targets = d.getVar('SDK_TARGETS', True)
  30. depd = d.getVar('BB_TASKDEPDATA', False)
  31. for v in depd.itervalues():
  32. if v[1] == 'do_image_complete':
  33. if v[0] not in sdk_install_targets:
  34. sdk_install_targets += ' {}'.format(v[0])
  35. if d.getVar('SDK_INCLUDE_PKGDATA', True) == '1':
  36. sdk_install_targets += ' meta-world-pkgdata:do_allpackagedata'
  37. return sdk_install_targets
  38. OE_INIT_ENV_SCRIPT ?= "oe-init-build-env"
  39. # The files from COREBASE that you want preserved in the COREBASE copied
  40. # into the sdk. This allows someone to have their own setup scripts in
  41. # COREBASE be preserved as well as untracked files.
  42. COREBASE_FILES ?= " \
  43. oe-init-build-env \
  44. oe-init-build-env-memres \
  45. scripts \
  46. LICENSE \
  47. .templateconf \
  48. "
  49. SDK_DIR_task-populate-sdk-ext = "${WORKDIR}/sdk-ext"
  50. B_task-populate-sdk-ext = "${SDK_DIR}"
  51. TOOLCHAINEXT_OUTPUTNAME = "${SDK_NAME}-toolchain-ext-${SDK_VERSION}"
  52. TOOLCHAIN_OUTPUTNAME_task-populate-sdk-ext = "${TOOLCHAINEXT_OUTPUTNAME}"
  53. SDK_EXT_TARGET_MANIFEST = "${SDK_DEPLOY}/${TOOLCHAINEXT_OUTPUTNAME}.target.manifest"
  54. SDK_EXT_HOST_MANIFEST = "${SDK_DEPLOY}/${TOOLCHAINEXT_OUTPUTNAME}.host.manifest"
  55. SDK_TITLE_task-populate-sdk-ext = "${@d.getVar('DISTRO_NAME', True) or d.getVar('DISTRO', True)} Extensible SDK"
  56. python copy_buildsystem () {
  57. import re
  58. import shutil
  59. import glob
  60. import oe.copy_buildsystem
  61. oe_init_env_script = d.getVar('OE_INIT_ENV_SCRIPT', True)
  62. conf_bbpath = ''
  63. conf_initpath = ''
  64. core_meta_subdir = ''
  65. # Copy in all metadata layers + bitbake (as repositories)
  66. buildsystem = oe.copy_buildsystem.BuildSystem('extensible SDK', d)
  67. baseoutpath = d.getVar('SDK_OUTPUT', True) + '/' + d.getVar('SDKPATH', True)
  68. # Determine if we're building a derivative extensible SDK (from devtool build-sdk)
  69. derivative = (d.getVar('SDK_DERIVATIVE', True) or '') == '1'
  70. if derivative:
  71. workspace_name = 'orig-workspace'
  72. else:
  73. workspace_name = None
  74. layers_copied = buildsystem.copy_bitbake_and_layers(baseoutpath + '/layers', workspace_name)
  75. sdkbblayers = []
  76. corebase = os.path.basename(d.getVar('COREBASE', True))
  77. for layer in layers_copied:
  78. if corebase == os.path.basename(layer):
  79. conf_bbpath = os.path.join('layers', layer, 'bitbake')
  80. else:
  81. sdkbblayers.append(layer)
  82. for path in os.listdir(baseoutpath + '/layers'):
  83. relpath = os.path.join('layers', path, oe_init_env_script)
  84. if os.path.exists(os.path.join(baseoutpath, relpath)):
  85. conf_initpath = relpath
  86. relpath = os.path.join('layers', path, 'scripts', 'devtool')
  87. if os.path.exists(os.path.join(baseoutpath, relpath)):
  88. scriptrelpath = os.path.dirname(relpath)
  89. relpath = os.path.join('layers', path, 'meta')
  90. if os.path.exists(os.path.join(baseoutpath, relpath, 'lib', 'oe')):
  91. core_meta_subdir = relpath
  92. d.setVar('oe_init_build_env_path', conf_initpath)
  93. d.setVar('scriptrelpath', scriptrelpath)
  94. # Write out config file for devtool
  95. import ConfigParser
  96. config = ConfigParser.SafeConfigParser()
  97. config.add_section('General')
  98. config.set('General', 'bitbake_subdir', conf_bbpath)
  99. config.set('General', 'init_path', conf_initpath)
  100. config.set('General', 'core_meta_subdir', core_meta_subdir)
  101. config.add_section('SDK')
  102. config.set('SDK', 'sdk_targets', d.getVar('SDK_TARGETS', True))
  103. updateurl = d.getVar('SDK_UPDATE_URL', True)
  104. if updateurl:
  105. config.set('SDK', 'updateserver', updateurl)
  106. bb.utils.mkdirhier(os.path.join(baseoutpath, 'conf'))
  107. with open(os.path.join(baseoutpath, 'conf', 'devtool.conf'), 'w') as f:
  108. config.write(f)
  109. # Create a layer for new recipes / appends
  110. bbpath = d.getVar('BBPATH', True)
  111. bb.process.run(['devtool', '--bbpath', bbpath, '--basepath', baseoutpath, 'create-workspace', '--create-only', os.path.join(baseoutpath, 'workspace')])
  112. # Create bblayers.conf
  113. bb.utils.mkdirhier(baseoutpath + '/conf')
  114. with open(baseoutpath + '/conf/bblayers.conf', 'w') as f:
  115. f.write('# WARNING: this configuration has been automatically generated and in\n')
  116. f.write('# most cases should not be edited. If you need more flexibility than\n')
  117. f.write('# this configuration provides, it is strongly suggested that you set\n')
  118. f.write('# up a proper instance of the full build system and use that instead.\n\n')
  119. # LCONF_VERSION may not be set, for example when using meta-poky
  120. # so don't error if it isn't found
  121. lconf_version = d.getVar('LCONF_VERSION', False)
  122. if lconf_version is not None:
  123. f.write('LCONF_VERSION = "%s"\n\n' % lconf_version)
  124. f.write('BBPATH = "$' + '{TOPDIR}"\n')
  125. f.write('SDKBASEMETAPATH = "$' + '{TOPDIR}"\n')
  126. f.write('BBLAYERS := " \\\n')
  127. for layerrelpath in sdkbblayers:
  128. f.write(' $' + '{SDKBASEMETAPATH}/layers/%s \\\n' % layerrelpath)
  129. f.write(' $' + '{SDKBASEMETAPATH}/workspace \\\n')
  130. f.write(' "\n')
  131. # Create local.conf
  132. builddir = d.getVar('TOPDIR', True)
  133. if derivative:
  134. shutil.copyfile(builddir + '/conf/local.conf', baseoutpath + '/conf/local.conf')
  135. else:
  136. local_conf_whitelist = (d.getVar('SDK_LOCAL_CONF_WHITELIST', True) or '').split()
  137. local_conf_blacklist = (d.getVar('SDK_LOCAL_CONF_BLACKLIST', True) or '').split()
  138. def handle_var(varname, origvalue, op, newlines):
  139. if varname in local_conf_blacklist or (origvalue.strip().startswith('/') and not varname in local_conf_whitelist):
  140. newlines.append('# Removed original setting of %s\n' % varname)
  141. return None, op, 0, True
  142. else:
  143. return origvalue, op, 0, True
  144. varlist = ['[^#=+ ]*']
  145. with open(builddir + '/conf/local.conf', 'r') as f:
  146. oldlines = f.readlines()
  147. (updated, newlines) = bb.utils.edit_metadata(oldlines, varlist, handle_var)
  148. with open(baseoutpath + '/conf/local.conf', 'w') as f:
  149. f.write('# WARNING: this configuration has been automatically generated and in\n')
  150. f.write('# most cases should not be edited. If you need more flexibility than\n')
  151. f.write('# this configuration provides, it is strongly suggested that you set\n')
  152. f.write('# up a proper instance of the full build system and use that instead.\n\n')
  153. for line in newlines:
  154. if line.strip() and not line.startswith('#'):
  155. f.write(line)
  156. # Write a newline just in case there's none at the end of the original
  157. f.write('\n')
  158. f.write('INHERIT += "%s"\n\n' % 'uninative')
  159. f.write('CONF_VERSION = "%s"\n\n' % d.getVar('CONF_VERSION', False))
  160. # Some classes are not suitable for SDK, remove them from INHERIT
  161. f.write('INHERIT_remove = "%s"\n' % d.getVar('SDK_INHERIT_BLACKLIST', False))
  162. # Bypass the default connectivity check if any
  163. f.write('CONNECTIVITY_CHECK_URIS = ""\n\n')
  164. # Ensure locked sstate cache objects are re-used without error
  165. f.write('SIGGEN_LOCKEDSIGS_CHECK_LEVEL = "none"\n\n')
  166. # Hide the config information from bitbake output (since it's fixed within the SDK)
  167. f.write('BUILDCFG_HEADER = ""\n')
  168. # Allow additional config through sdk-extra.conf
  169. fn = bb.cookerdata.findConfigFile('sdk-extra.conf', d)
  170. if fn:
  171. with open(fn, 'r') as xf:
  172. for line in xf:
  173. f.write(line)
  174. # If you define a sdk_extraconf() function then it can contain additional config
  175. # (Though this is awkward; sdk-extra.conf should probably be used instead)
  176. extraconf = (d.getVar('sdk_extraconf', True) or '').strip()
  177. if extraconf:
  178. # Strip off any leading / trailing spaces
  179. for line in extraconf.splitlines():
  180. f.write(line.strip() + '\n')
  181. f.write('require conf/locked-sigs.inc\n')
  182. if os.path.exists(builddir + '/conf/auto.conf'):
  183. if derivative:
  184. shutil.copyfile(builddir + '/conf/auto.conf', baseoutpath + '/conf/auto.conf')
  185. else:
  186. with open(builddir + '/conf/auto.conf', 'r') as f:
  187. oldlines = f.readlines()
  188. (updated, newlines) = bb.utils.edit_metadata(oldlines, varlist, handle_var)
  189. with open(baseoutpath + '/conf/auto.conf', 'w') as f:
  190. f.write('# WARNING: this configuration has been automatically generated and in\n')
  191. f.write('# most cases should not be edited. If you need more flexibility than\n')
  192. f.write('# this configuration provides, it is strongly suggested that you set\n')
  193. f.write('# up a proper instance of the full build system and use that instead.\n\n')
  194. for line in newlines:
  195. if line.strip() and not line.startswith('#'):
  196. f.write(line)
  197. # Filter the locked signatures file to just the sstate tasks we are interested in
  198. excluded_targets = d.getVar('SDK_TARGETS', True)
  199. sigfile = d.getVar('WORKDIR', True) + '/locked-sigs.inc'
  200. lockedsigs_pruned = baseoutpath + '/conf/locked-sigs.inc'
  201. oe.copy_buildsystem.prune_lockedsigs([],
  202. excluded_targets.split(),
  203. sigfile,
  204. lockedsigs_pruned)
  205. sstate_out = baseoutpath + '/sstate-cache'
  206. bb.utils.remove(sstate_out, True)
  207. # uninative.bbclass sets NATIVELSBSTRING to 'universal'
  208. fixedlsbstring = 'universal'
  209. # Add packagedata if enabled
  210. if d.getVar('SDK_INCLUDE_PKGDATA', True) == '1':
  211. lockedsigs_base = d.getVar('WORKDIR', True) + '/locked-sigs-base.inc'
  212. lockedsigs_copy = d.getVar('WORKDIR', True) + '/locked-sigs-copy.inc'
  213. shutil.move(lockedsigs_pruned, lockedsigs_base)
  214. oe.copy_buildsystem.merge_lockedsigs(['do_packagedata'],
  215. lockedsigs_base,
  216. d.getVar('STAGING_DIR_HOST', True) + '/world-pkgdata/locked-sigs-pkgdata.inc',
  217. lockedsigs_pruned,
  218. lockedsigs_copy)
  219. if d.getVar('SDK_EXT_TYPE', True) == 'minimal':
  220. if derivative:
  221. # Assume the user is not going to set up an additional sstate
  222. # mirror, thus we need to copy the additional artifacts (from
  223. # workspace recipes) into the derivative SDK
  224. lockedsigs_orig = d.getVar('TOPDIR', True) + '/conf/locked-sigs.inc'
  225. if os.path.exists(lockedsigs_orig):
  226. lockedsigs_extra = d.getVar('WORKDIR', True) + '/locked-sigs-extra.inc'
  227. oe.copy_buildsystem.merge_lockedsigs(None,
  228. lockedsigs_orig,
  229. lockedsigs_pruned,
  230. None,
  231. lockedsigs_extra)
  232. oe.copy_buildsystem.create_locked_sstate_cache(lockedsigs_extra,
  233. d.getVar('SSTATE_DIR', True),
  234. sstate_out, d,
  235. fixedlsbstring)
  236. else:
  237. oe.copy_buildsystem.create_locked_sstate_cache(lockedsigs_pruned,
  238. d.getVar('SSTATE_DIR', True),
  239. sstate_out, d,
  240. fixedlsbstring)
  241. # We don't need sstate do_package files
  242. for root, dirs, files in os.walk(sstate_out):
  243. for name in files:
  244. if name.endswith("_package.tgz"):
  245. f = os.path.join(root, name)
  246. os.remove(f)
  247. # Write manifest file
  248. # Note: at the moment we cannot include the env setup script here to keep
  249. # it updated, since it gets modified during SDK installation (see
  250. # sdk_ext_postinst() below) thus the checksum we take here would always
  251. # be different.
  252. manifest_file_list = ['conf/*']
  253. manifest_file = os.path.join(baseoutpath, 'conf', 'sdk-conf-manifest')
  254. with open(manifest_file, 'w') as f:
  255. for item in manifest_file_list:
  256. for fn in glob.glob(os.path.join(baseoutpath, item)):
  257. if fn == manifest_file:
  258. continue
  259. chksum = bb.utils.sha256_file(fn)
  260. f.write('%s\t%s\n' % (chksum, os.path.relpath(fn, baseoutpath)))
  261. }
  262. def extsdk_get_buildtools_filename(d):
  263. return '*-buildtools-nativesdk-standalone-*.sh'
  264. install_tools() {
  265. install -d ${SDK_OUTPUT}/${SDKPATHNATIVE}${bindir_nativesdk}
  266. lnr ${SDK_OUTPUT}/${SDKPATH}/${scriptrelpath}/devtool ${SDK_OUTPUT}/${SDKPATHNATIVE}${bindir_nativesdk}/devtool
  267. lnr ${SDK_OUTPUT}/${SDKPATH}/${scriptrelpath}/recipetool ${SDK_OUTPUT}/${SDKPATHNATIVE}${bindir_nativesdk}/recipetool
  268. touch ${SDK_OUTPUT}/${SDKPATH}/.devtoolbase
  269. # find latest buildtools-tarball and install it
  270. buildtools_path=`ls -t1 ${SDK_DEPLOY}/${@extsdk_get_buildtools_filename(d)} | head -n1`
  271. install $buildtools_path ${SDK_OUTPUT}/${SDKPATH}
  272. install ${SDK_DEPLOY}/${BUILD_ARCH}-nativesdk-libc.tar.bz2 ${SDK_OUTPUT}/${SDKPATH}
  273. install -m 0644 ${COREBASE}/meta/files/ext-sdk-prepare.py ${SDK_OUTPUT}/${SDKPATH}
  274. }
  275. do_populate_sdk_ext[file-checksums] += "${COREBASE}/meta/files/ext-sdk-prepare.py:True"
  276. # Since bitbake won't run as root it doesn't make sense to try and install
  277. # the extensible sdk as root.
  278. sdk_ext_preinst() {
  279. if [ "`id -u`" = "0" ]; then
  280. echo "ERROR: The extensible sdk cannot be installed as root."
  281. exit 1
  282. fi
  283. SDK_EXTENSIBLE="1"
  284. }
  285. SDK_PRE_INSTALL_COMMAND_task-populate-sdk-ext = "${sdk_ext_preinst}"
  286. # FIXME this preparation should be done as part of the SDK construction
  287. sdk_ext_postinst() {
  288. printf "\nExtracting buildtools...\n"
  289. cd $target_sdk_dir
  290. printf "buildtools\ny" | ./*buildtools-nativesdk-standalone* > /dev/null || ( printf 'ERROR: buildtools installation failed\n' ; exit 1 )
  291. # Delete the buildtools tar file since it won't be used again
  292. rm ./*buildtools-nativesdk-standalone*.sh -f
  293. # Make sure when the user sets up the environment, they also get
  294. # the buildtools-tarball tools in their path.
  295. env_setup_script="$target_sdk_dir/environment-setup-${REAL_MULTIMACH_TARGET_SYS}"
  296. echo ". $target_sdk_dir/buildtools/environment-setup*" >> $env_setup_script
  297. # Allow bitbake environment setup to be ran as part of this sdk.
  298. echo "export OE_SKIP_SDK_CHECK=1" >> $env_setup_script
  299. # A bit of another hack, but we need this in the path only for devtool
  300. # so put it at the end of $PATH.
  301. echo "export PATH=$target_sdk_dir/sysroots/${SDK_SYS}${bindir_nativesdk}:\$PATH" >> $env_setup_script
  302. 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
  303. # Warn if trying to use external bitbake and the ext SDK together
  304. 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
  305. # For now this is where uninative.bbclass expects the tarball
  306. mv *-nativesdk-libc.tar.* $target_sdk_dir/`dirname ${oe_init_build_env_path}`
  307. if [ "$prepare_buildsystem" != "no" -a -n "${@SDK_INSTALL_TARGETS.strip()}" ]; then
  308. printf "Preparing build system...\n"
  309. # dash which is /bin/sh on Ubuntu will not preserve the
  310. # current working directory when first ran, nor will it set $1 when
  311. # sourcing a script. That is why this has to look so ugly.
  312. LOGFILE="$target_sdk_dir/preparing_build_system.log"
  313. 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 '${SDK_INSTALL_TARGETS}' >> $LOGFILE 2>&1" || { echo "ERROR: SDK preparation failed: see $LOGFILE"; echo "printf 'ERROR: this SDK was not fully installed and needs reinstalling\n'" >> $env_setup_script ; exit 1 ; }
  314. rm $target_sdk_dir/ext-sdk-prepare.py
  315. fi
  316. echo done
  317. }
  318. SDK_POST_INSTALL_COMMAND_task-populate-sdk-ext = "${sdk_ext_postinst}"
  319. SDK_POSTPROCESS_COMMAND_prepend_task-populate-sdk-ext = "copy_buildsystem; install_tools; "
  320. SDK_INSTALL_TARGETS = ""
  321. fakeroot python do_populate_sdk_ext() {
  322. # FIXME hopefully we can remove this restriction at some point, but uninative
  323. # currently forces this upon us
  324. if d.getVar('SDK_ARCH', True) != d.getVar('BUILD_ARCH', True):
  325. 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', True), d.getVar('BUILD_ARCH', True)))
  326. d.setVar('SDK_INSTALL_TARGETS', get_sdk_install_targets(d))
  327. bb.build.exec_func("do_populate_sdk", d)
  328. }
  329. def get_ext_sdk_depends(d):
  330. return d.getVarFlag('do_rootfs', 'depends', True) + ' ' + d.getVarFlag('do_build', 'depends', True)
  331. python do_sdk_depends() {
  332. # We have to do this separately in its own task so we avoid recursing into
  333. # dependencies we don't need to (e.g. buildtools-tarball) and bringing those
  334. # into the SDK's sstate-cache
  335. import oe.copy_buildsystem
  336. sigfile = d.getVar('WORKDIR', True) + '/locked-sigs.inc'
  337. oe.copy_buildsystem.generate_locked_sigs(sigfile, d)
  338. }
  339. addtask sdk_depends
  340. do_sdk_depends[dirs] = "${WORKDIR}"
  341. do_sdk_depends[depends] = "${@get_ext_sdk_depends(d)}"
  342. do_sdk_depends[recrdeptask] = "${@d.getVarFlag('do_populate_sdk', 'recrdeptask', False)}"
  343. do_sdk_depends[recrdeptask] += "do_populate_lic do_package_qa do_populate_sysroot do_deploy ${SDK_RECRDEP_TASKS}"
  344. do_sdk_depends[rdepends] = "${@get_sdk_ext_rdepends(d)}"
  345. def get_sdk_ext_rdepends(d):
  346. localdata = d.createCopy()
  347. localdata.appendVar('OVERRIDES', ':task-populate-sdk-ext')
  348. bb.data.update_data(localdata)
  349. return localdata.getVarFlag('do_populate_sdk', 'rdepends', True)
  350. do_populate_sdk_ext[dirs] = "${@d.getVarFlag('do_populate_sdk', 'dirs', False)}"
  351. do_populate_sdk_ext[depends] = "${@d.getVarFlag('do_populate_sdk', 'depends', False)} \
  352. buildtools-tarball:do_populate_sdk uninative-tarball:do_populate_sdk \
  353. ${@'meta-world-pkgdata:do_collect_packagedata' if d.getVar('SDK_INCLUDE_PKGDATA', True) == '1' else ''}"
  354. do_populate_sdk_ext[rdepends] += "${@' '.join([x + ':do_build' for x in d.getVar('SDK_TARGETS', True).split()])}"
  355. # Make sure code changes can result in rebuild
  356. do_populate_sdk_ext[vardeps] += "copy_buildsystem \
  357. sdk_ext_postinst"
  358. do_populate_sdk_ext[file-checksums] += "${COREBASE}/meta/files/toolchain-shar-relocate.sh:True \
  359. ${COREBASE}/meta/files/toolchain-shar-extract.sh:True \
  360. ${COREBASE}/scripts/gen-lockedsig-cache:True"
  361. addtask populate_sdk_ext after do_sdk_depends