blob: 4aabafa079b6e8997b085182664f2ee70901af79 [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'}"
Brad Bishopa34c0302019-09-23 22:34:48 -040023SDK_INCLUDE_NATIVESDK ?= "0"
Brad Bishop1d80a2e2019-11-15 16:35:03 -050024SDK_INCLUDE_BUILDTOOLS ?= '1'
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050025
26SDK_RECRDEP_TASKS ?= ""
Andrew Geissler09209ee2020-12-13 08:44:15 -060027SDK_CUSTOM_TEMPLATECONF ?= "0"
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050028
Patrick Williamsc124f4f2015-09-15 14:41:29 -050029SDK_LOCAL_CONF_WHITELIST ?= ""
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050030SDK_LOCAL_CONF_BLACKLIST ?= "CONF_VERSION \
31 BB_NUMBER_THREADS \
Patrick Williamsc0f7c042017-02-23 20:41:17 -060032 BB_NUMBER_PARSE_THREADS \
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050033 PARALLEL_MAKE \
34 PRSERV_HOST \
35 SSTATE_MIRRORS \
Patrick Williamsc0f7c042017-02-23 20:41:17 -060036 DL_DIR \
37 SSTATE_DIR \
38 TMPDIR \
Brad Bishopd7bf8c12018-02-25 22:55:05 -050039 BB_SERVER_TIMEOUT \
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050040 "
Patrick Williamsc124f4f2015-09-15 14:41:29 -050041SDK_INHERIT_BLACKLIST ?= "buildhistory icecc"
42SDK_UPDATE_URL ?= ""
43
44SDK_TARGETS ?= "${PN}"
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050045
Patrick Williamsc0f7c042017-02-23 20:41:17 -060046def get_sdk_install_targets(d, images_only=False):
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050047 sdk_install_targets = ''
Brad Bishop6e60e8b2018-02-01 10:27:11 -050048 if images_only or d.getVar('SDK_EXT_TYPE') != 'minimal':
49 sdk_install_targets = d.getVar('SDK_TARGETS')
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050050
51 depd = d.getVar('BB_TASKDEPDATA', False)
Brad Bishop6e60e8b2018-02-01 10:27:11 -050052 tasklist = bb.build.tasksbetween('do_image_complete', 'do_build', d)
53 tasklist.remove('do_build')
Patrick Williamsc0f7c042017-02-23 20:41:17 -060054 for v in depd.values():
Brad Bishop6e60e8b2018-02-01 10:27:11 -050055 if v[1] in tasklist:
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050056 if v[0] not in sdk_install_targets:
57 sdk_install_targets += ' {}'.format(v[0])
58
Patrick Williamsc0f7c042017-02-23 20:41:17 -060059 if not images_only:
Brad Bishop6e60e8b2018-02-01 10:27:11 -050060 if d.getVar('SDK_INCLUDE_PKGDATA') == '1':
Patrick Williamsc0f7c042017-02-23 20:41:17 -060061 sdk_install_targets += ' meta-world-pkgdata:do_allpackagedata'
Brad Bishop6e60e8b2018-02-01 10:27:11 -050062 if d.getVar('SDK_INCLUDE_TOOLCHAIN') == '1':
Patrick Williamsc0f7c042017-02-23 20:41:17 -060063 sdk_install_targets += ' meta-extsdk-toolchain:do_populate_sysroot'
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050064
65 return sdk_install_targets
66
67get_sdk_install_targets[vardepsexclude] = "BB_TASKDEPDATA"
68
Patrick Williamsc124f4f2015-09-15 14:41:29 -050069OE_INIT_ENV_SCRIPT ?= "oe-init-build-env"
70
71# The files from COREBASE that you want preserved in the COREBASE copied
72# into the sdk. This allows someone to have their own setup scripts in
73# COREBASE be preserved as well as untracked files.
74COREBASE_FILES ?= " \
75 oe-init-build-env \
Patrick Williamsc124f4f2015-09-15 14:41:29 -050076 scripts \
77 LICENSE \
78 .templateconf \
79"
80
81SDK_DIR_task-populate-sdk-ext = "${WORKDIR}/sdk-ext"
82B_task-populate-sdk-ext = "${SDK_DIR}"
Brad Bishop6e60e8b2018-02-01 10:27:11 -050083TOOLCHAINEXT_OUTPUTNAME ?= "${SDK_NAME}-toolchain-ext-${SDK_VERSION}"
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050084TOOLCHAIN_OUTPUTNAME_task-populate-sdk-ext = "${TOOLCHAINEXT_OUTPUTNAME}"
85
86SDK_EXT_TARGET_MANIFEST = "${SDK_DEPLOY}/${TOOLCHAINEXT_OUTPUTNAME}.target.manifest"
87SDK_EXT_HOST_MANIFEST = "${SDK_DEPLOY}/${TOOLCHAINEXT_OUTPUTNAME}.host.manifest"
Patrick Williamsc124f4f2015-09-15 14:41:29 -050088
Brad Bishopd7bf8c12018-02-25 22:55:05 -050089python write_target_sdk_ext_manifest () {
90 from oe.sdk import get_extra_sdkinfo
91 sstate_dir = d.expand('${SDK_OUTPUT}/${SDKPATH}/sstate-cache')
92 extra_info = get_extra_sdkinfo(sstate_dir)
93
94 target = d.getVar('TARGET_SYS')
95 target_multimach = d.getVar('MULTIMACH_TARGET_SYS')
96 real_target_multimach = d.getVar('REAL_MULTIMACH_TARGET_SYS')
97
98 pkgs = {}
Brad Bishop1d80a2e2019-11-15 16:35:03 -050099 os.makedirs(os.path.dirname(d.getVar('SDK_EXT_TARGET_MANIFEST')), exist_ok=True)
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500100 with open(d.getVar('SDK_EXT_TARGET_MANIFEST'), 'w') as f:
101 for fn in extra_info['filesizes']:
102 info = fn.split(':')
103 if info[2] in (target, target_multimach, real_target_multimach) \
104 or info[5] == 'allarch':
105 if not info[1] in pkgs:
106 f.write("%s %s %s\n" % (info[1], info[2], info[3]))
107 pkgs[info[1]] = {}
108}
109python write_host_sdk_ext_manifest () {
110 from oe.sdk import get_extra_sdkinfo
111 sstate_dir = d.expand('${SDK_OUTPUT}/${SDKPATH}/sstate-cache')
112 extra_info = get_extra_sdkinfo(sstate_dir)
113 host = d.getVar('BUILD_SYS')
114 with open(d.getVar('SDK_EXT_HOST_MANIFEST'), 'w') as f:
115 for fn in extra_info['filesizes']:
116 info = fn.split(':')
117 if info[2] == host:
118 f.write("%s %s %s\n" % (info[1], info[2], info[3]))
119}
120
121SDK_POSTPROCESS_COMMAND_append_task-populate-sdk-ext = "write_target_sdk_ext_manifest; write_host_sdk_ext_manifest; "
122
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500123SDK_TITLE_task-populate-sdk-ext = "${@d.getVar('DISTRO_NAME') or d.getVar('DISTRO')} Extensible SDK"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500124
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600125def clean_esdk_builddir(d, sdkbasepath):
126 """Clean up traces of the fake build for create_filtered_tasklist()"""
127 import shutil
Andrew Geissler82c905d2020-04-13 13:39:40 -0500128 cleanpaths = ['cache', 'tmp']
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600129 for pth in cleanpaths:
130 fullpth = os.path.join(sdkbasepath, pth)
131 if os.path.isdir(fullpth):
132 shutil.rmtree(fullpth)
133 elif os.path.isfile(fullpth):
134 os.remove(fullpth)
135
136def create_filtered_tasklist(d, sdkbasepath, tasklistfile, conf_initpath):
137 """
138 Create a filtered list of tasks. Also double-checks that the build system
139 within the SDK basically works and required sstate artifacts are available.
140 """
141 import tempfile
142 import shutil
143 import oe.copy_buildsystem
144
145 # Create a temporary build directory that we can pass to the env setup script
146 shutil.copyfile(sdkbasepath + '/conf/local.conf', sdkbasepath + '/conf/local.conf.bak')
147 try:
148 with open(sdkbasepath + '/conf/local.conf', 'a') as f:
149 # Force the use of sstate from the build system
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500150 f.write('\nSSTATE_DIR_forcevariable = "%s"\n' % d.getVar('SSTATE_DIR'))
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500151 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 -0600152 # Ensure TMPDIR is the default so that clean_esdk_builddir() can delete it
153 f.write('TMPDIR_forcevariable = "${TOPDIR}/tmp"\n')
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500154 f.write('TCLIBCAPPEND_forcevariable = ""\n')
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600155 # Drop uninative if the build isn't using it (or else NATIVELSBSTRING will
156 # be different and we won't be able to find our native sstate)
157 if not bb.data.inherits_class('uninative', d):
158 f.write('INHERIT_remove = "uninative"\n')
159
160 # Unfortunately the default SDKPATH (or even a custom value) may contain characters that bitbake
161 # will not allow in its COREBASE path, so we need to rename the directory temporarily
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500162 temp_sdkbasepath = d.getVar('SDK_OUTPUT') + '/tmp-renamed-sdk'
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600163 # Delete any existing temp dir
164 try:
165 shutil.rmtree(temp_sdkbasepath)
166 except FileNotFoundError:
167 pass
Andrew Geisslerc926e172021-05-07 16:11:35 -0500168 bb.utils.rename(sdkbasepath, temp_sdkbasepath)
Brad Bishop316dfdd2018-06-25 12:45:53 -0400169 cmdprefix = '. %s .; ' % conf_initpath
170 logfile = d.getVar('WORKDIR') + '/tasklist_bb_log.txt'
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600171 try:
Brad Bishop316dfdd2018-06-25 12:45:53 -0400172 oe.copy_buildsystem.check_sstate_task_list(d, get_sdk_install_targets(d), tasklistfile, cmdprefix=cmdprefix, cwd=temp_sdkbasepath, logfile=logfile)
173 except bb.process.ExecutionError as e:
174 msg = 'Failed to generate filtered task list for extensible SDK:\n%s' % e.stdout.rstrip()
175 if 'attempted to execute unexpectedly and should have been setscened' in e.stdout:
176 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'
177 bb.fatal(msg)
Andrew Geisslerc926e172021-05-07 16:11:35 -0500178 bb.utils.rename(temp_sdkbasepath, sdkbasepath)
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600179 # Clean out residue of running bitbake, which check_sstate_task_list()
180 # will effectively do
181 clean_esdk_builddir(d, sdkbasepath)
182 finally:
Andrew Geissler82c905d2020-04-13 13:39:40 -0500183 localconf = sdkbasepath + '/conf/local.conf'
184 if os.path.exists(localconf + '.bak'):
185 os.replace(localconf + '.bak', localconf)
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600186
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500187python copy_buildsystem () {
188 import re
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500189 import shutil
190 import glob
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500191 import oe.copy_buildsystem
192
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500193 oe_init_env_script = d.getVar('OE_INIT_ENV_SCRIPT')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500194
195 conf_bbpath = ''
196 conf_initpath = ''
197 core_meta_subdir = ''
198
199 # Copy in all metadata layers + bitbake (as repositories)
Patrick Williamsf1e5d692016-03-30 15:21:19 -0500200 buildsystem = oe.copy_buildsystem.BuildSystem('extensible SDK', d)
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500201 baseoutpath = d.getVar('SDK_OUTPUT') + '/' + d.getVar('SDKPATH')
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500202
Andrew Geissler09209ee2020-12-13 08:44:15 -0600203 #check if custome templateconf path is set
204 use_custom_templateconf = d.getVar('SDK_CUSTOM_TEMPLATECONF')
205
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500206 # Determine if we're building a derivative extensible SDK (from devtool build-sdk)
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500207 derivative = (d.getVar('SDK_DERIVATIVE') or '') == '1'
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500208 if derivative:
209 workspace_name = 'orig-workspace'
210 else:
211 workspace_name = None
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500212
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800213 corebase, sdkbblayers = buildsystem.copy_bitbake_and_layers(baseoutpath + '/layers', workspace_name)
214 conf_bbpath = os.path.join('layers', corebase, 'bitbake')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500215
216 for path in os.listdir(baseoutpath + '/layers'):
217 relpath = os.path.join('layers', path, oe_init_env_script)
218 if os.path.exists(os.path.join(baseoutpath, relpath)):
219 conf_initpath = relpath
220
221 relpath = os.path.join('layers', path, 'scripts', 'devtool')
222 if os.path.exists(os.path.join(baseoutpath, relpath)):
223 scriptrelpath = os.path.dirname(relpath)
224
225 relpath = os.path.join('layers', path, 'meta')
226 if os.path.exists(os.path.join(baseoutpath, relpath, 'lib', 'oe')):
227 core_meta_subdir = relpath
228
229 d.setVar('oe_init_build_env_path', conf_initpath)
230 d.setVar('scriptrelpath', scriptrelpath)
231
232 # Write out config file for devtool
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600233 import configparser
234 config = configparser.SafeConfigParser()
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500235 config.add_section('General')
236 config.set('General', 'bitbake_subdir', conf_bbpath)
237 config.set('General', 'init_path', conf_initpath)
238 config.set('General', 'core_meta_subdir', core_meta_subdir)
239 config.add_section('SDK')
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500240 config.set('SDK', 'sdk_targets', d.getVar('SDK_TARGETS'))
241 updateurl = d.getVar('SDK_UPDATE_URL')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500242 if updateurl:
243 config.set('SDK', 'updateserver', updateurl)
244 bb.utils.mkdirhier(os.path.join(baseoutpath, 'conf'))
245 with open(os.path.join(baseoutpath, 'conf', 'devtool.conf'), 'w') as f:
246 config.write(f)
247
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500248 unlockedsigs = os.path.join(baseoutpath, 'conf', 'unlocked-sigs.inc')
249 with open(unlockedsigs, 'w') as f:
250 pass
251
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500252 # Create a layer for new recipes / appends
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500253 bbpath = d.getVar('BBPATH')
Andrew Geissler95ac1b82021-03-31 14:34:31 -0500254 env = os.environ.copy()
255 env['PYTHONDONTWRITEBYTECODE'] = '1'
256 bb.process.run(['devtool', '--bbpath', bbpath, '--basepath', baseoutpath, 'create-workspace', '--create-only', os.path.join(baseoutpath, 'workspace')], env=env)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500257
258 # Create bblayers.conf
259 bb.utils.mkdirhier(baseoutpath + '/conf')
260 with open(baseoutpath + '/conf/bblayers.conf', 'w') as f:
261 f.write('# WARNING: this configuration has been automatically generated and in\n')
262 f.write('# most cases should not be edited. If you need more flexibility than\n')
263 f.write('# this configuration provides, it is strongly suggested that you set\n')
264 f.write('# up a proper instance of the full build system and use that instead.\n\n')
265
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500266 # LCONF_VERSION may not be set, for example when using meta-poky
267 # so don't error if it isn't found
268 lconf_version = d.getVar('LCONF_VERSION', False)
269 if lconf_version is not None:
270 f.write('LCONF_VERSION = "%s"\n\n' % lconf_version)
271
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500272 f.write('BBPATH = "$' + '{TOPDIR}"\n')
273 f.write('SDKBASEMETAPATH = "$' + '{TOPDIR}"\n')
274 f.write('BBLAYERS := " \\\n')
275 for layerrelpath in sdkbblayers:
276 f.write(' $' + '{SDKBASEMETAPATH}/layers/%s \\\n' % layerrelpath)
277 f.write(' $' + '{SDKBASEMETAPATH}/workspace \\\n')
278 f.write(' "\n')
279
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600280 # Copy uninative tarball
281 # For now this is where uninative.bbclass expects the tarball
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500282 if bb.data.inherits_class('uninative', d):
283 uninative_file = d.expand('${UNINATIVE_DLDIR}/' + d.getVarFlag("UNINATIVE_CHECKSUM", d.getVar("BUILD_ARCH")) + '/${UNINATIVE_TARBALL}')
284 uninative_checksum = bb.utils.sha256_file(uninative_file)
285 uninative_outdir = '%s/downloads/uninative/%s' % (baseoutpath, uninative_checksum)
286 bb.utils.mkdirhier(uninative_outdir)
287 shutil.copy(uninative_file, uninative_outdir)
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600288
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500289 env_whitelist = (d.getVar('BB_ENV_EXTRAWHITE') or '').split()
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500290 env_whitelist_values = {}
291
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500292 # Create local.conf
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500293 builddir = d.getVar('TOPDIR')
Brad Bishopa5c52ff2018-11-23 10:55:50 +1300294 if derivative and os.path.exists(builddir + '/conf/site.conf'):
295 shutil.copyfile(builddir + '/conf/site.conf', baseoutpath + '/conf/site.conf')
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500296 if derivative and os.path.exists(builddir + '/conf/auto.conf'):
297 shutil.copyfile(builddir + '/conf/auto.conf', baseoutpath + '/conf/auto.conf')
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500298 if derivative:
299 shutil.copyfile(builddir + '/conf/local.conf', baseoutpath + '/conf/local.conf')
300 else:
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500301 local_conf_whitelist = (d.getVar('SDK_LOCAL_CONF_WHITELIST') or '').split()
302 local_conf_blacklist = (d.getVar('SDK_LOCAL_CONF_BLACKLIST') or '').split()
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500303 def handle_var(varname, origvalue, op, newlines):
304 if varname in local_conf_blacklist or (origvalue.strip().startswith('/') and not varname in local_conf_whitelist):
305 newlines.append('# Removed original setting of %s\n' % varname)
306 return None, op, 0, True
307 else:
308 if varname in env_whitelist:
309 env_whitelist_values[varname] = origvalue
310 return origvalue, op, 0, True
311 varlist = ['[^#=+ ]*']
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500312 oldlines = []
Brad Bishopa5c52ff2018-11-23 10:55:50 +1300313 if os.path.exists(builddir + '/conf/site.conf'):
314 with open(builddir + '/conf/site.conf', 'r') as f:
315 oldlines += f.readlines()
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500316 if os.path.exists(builddir + '/conf/auto.conf'):
317 with open(builddir + '/conf/auto.conf', 'r') as f:
318 oldlines += f.readlines()
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500319 if os.path.exists(builddir + '/conf/local.conf'):
320 with open(builddir + '/conf/local.conf', 'r') as f:
321 oldlines += f.readlines()
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500322 (updated, newlines) = bb.utils.edit_metadata(oldlines, varlist, handle_var)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500323
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500324 with open(baseoutpath + '/conf/local.conf', 'w') as f:
325 f.write('# WARNING: this configuration has been automatically generated and in\n')
326 f.write('# most cases should not be edited. If you need more flexibility than\n')
327 f.write('# this configuration provides, it is strongly suggested that you set\n')
328 f.write('# up a proper instance of the full build system and use that instead.\n\n')
329 for line in newlines:
330 if line.strip() and not line.startswith('#'):
331 f.write(line)
332 # Write a newline just in case there's none at the end of the original
333 f.write('\n')
334
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500335 f.write('TMPDIR = "${TOPDIR}/tmp"\n')
336 f.write('TCLIBCAPPEND = ""\n')
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600337 f.write('DL_DIR = "${TOPDIR}/downloads"\n')
338
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800339 if bb.data.inherits_class('uninative', d):
340 f.write('INHERIT += "%s"\n' % 'uninative')
341 f.write('UNINATIVE_CHECKSUM[%s] = "%s"\n\n' % (d.getVar('BUILD_ARCH'), uninative_checksum))
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500342 f.write('CONF_VERSION = "%s"\n\n' % d.getVar('CONF_VERSION', False))
343
344 # Some classes are not suitable for SDK, remove them from INHERIT
345 f.write('INHERIT_remove = "%s"\n' % d.getVar('SDK_INHERIT_BLACKLIST', False))
346
347 # Bypass the default connectivity check if any
348 f.write('CONNECTIVITY_CHECK_URIS = ""\n\n')
349
350 # This warning will come out if reverse dependencies for a task
351 # don't have sstate as well as the task itself. We already know
352 # this will be the case for the extensible sdk, so turn off the
353 # warning.
354 f.write('SIGGEN_LOCKEDSIGS_SSTATE_EXISTS_CHECK = "none"\n\n')
355
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600356 # Warn if the sigs in the locked-signature file don't match
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500357 # the sig computed from the metadata.
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600358 f.write('SIGGEN_LOCKEDSIGS_TASKSIG_CHECK = "warn"\n\n')
359
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500360 # We want to be able to set this without a full reparse
361 f.write('BB_HASHCONFIG_WHITELIST_append = " SIGGEN_UNLOCKED_RECIPES"\n\n')
362
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600363 # Set up whitelist for run on install
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500364 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 -0500365
366 # Hide the config information from bitbake output (since it's fixed within the SDK)
Brad Bishop37a0e4d2017-12-04 01:01:44 -0500367 f.write('BUILDCFG_HEADER = ""\n\n')
368
Andrew Geissler95ac1b82021-03-31 14:34:31 -0500369 # Write METADATA_REVISION
370 f.write('METADATA_REVISION = "%s"\n\n' % d.getVar('METADATA_REVISION'))
371
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500372 f.write('# Provide a flag to indicate we are in the EXT_SDK Context\n')
373 f.write('WITHIN_EXT_SDK = "1"\n\n')
374
Brad Bishop37a0e4d2017-12-04 01:01:44 -0500375 # Map gcc-dependent uninative sstate cache for installer usage
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500376 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 -0500377
Andrew Geissler95ac1b82021-03-31 14:34:31 -0500378 if d.getVar("PRSERV_HOST"):
379 # Override this, we now include PR data, so it should only point ot the local database
380 f.write('PRSERV_HOST = "localhost:0"\n\n')
381
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500382 # Allow additional config through sdk-extra.conf
383 fn = bb.cookerdata.findConfigFile('sdk-extra.conf', d)
384 if fn:
385 with open(fn, 'r') as xf:
386 for line in xf:
387 f.write(line)
388
389 # If you define a sdk_extraconf() function then it can contain additional config
390 # (Though this is awkward; sdk-extra.conf should probably be used instead)
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500391 extraconf = (d.getVar('sdk_extraconf') or '').strip()
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500392 if extraconf:
393 # Strip off any leading / trailing spaces
394 for line in extraconf.splitlines():
395 f.write(line.strip() + '\n')
396
397 f.write('require conf/locked-sigs.inc\n')
398 f.write('require conf/unlocked-sigs.inc\n')
399
Andrew Geissler09036742021-06-25 14:25:14 -0500400 # Copy multiple configurations if they exist in the users config directory
401 if d.getVar('BBMULTICONFIG') is not None:
402 bb.utils.mkdirhier(os.path.join(baseoutpath, 'conf', 'multiconfig'))
403 for mc in d.getVar('BBMULTICONFIG').split():
404 dest_stub = "/conf/multiconfig/%s.conf" % (mc,)
405 if os.path.exists(builddir + dest_stub):
406 shutil.copyfile(builddir + dest_stub, baseoutpath + dest_stub)
407
Brad Bishop00e122a2019-10-05 11:10:57 -0400408 if os.path.exists(builddir + '/cache/bb_unihashes.dat'):
409 bb.parse.siggen.save_unitaskhashes()
410 bb.utils.mkdirhier(os.path.join(baseoutpath, 'cache'))
411 shutil.copyfile(builddir + '/cache/bb_unihashes.dat', baseoutpath + '/cache/bb_unihashes.dat')
412
Andrew Geissler95ac1b82021-03-31 14:34:31 -0500413 # If PR Service is in use, we need to export this as well
414 bb.note('Do we have a pr database?')
415 if d.getVar("PRSERV_HOST"):
416 bb.note('Writing PR database...')
417 # Based on the code in classes/prexport.bbclass
418 import oe.prservice
419 #dump meta info of tables
420 localdata = d.createCopy()
421 localdata.setVar('PRSERV_DUMPOPT_COL', "1")
422 localdata.setVar('PRSERV_DUMPDIR', os.path.join(baseoutpath, 'conf'))
423 localdata.setVar('PRSERV_DUMPFILE', '${PRSERV_DUMPDIR}/prserv.inc')
424
425 bb.note('PR Database write to %s' % (localdata.getVar('PRSERV_DUMPFILE')))
426
427 retval = oe.prservice.prserv_dump_db(localdata)
428 if not retval:
429 bb.error("prexport_handler: export failed!")
430 return
431 (metainfo, datainfo) = retval
432 oe.prservice.prserv_export_tofile(localdata, metainfo, datainfo, True)
433
Andrew Geissler82c905d2020-04-13 13:39:40 -0500434 # Use templateconf.cfg file from builddir if exists
Andrew Geissler09209ee2020-12-13 08:44:15 -0600435 if os.path.exists(builddir + '/conf/templateconf.cfg') and use_custom_templateconf == '1':
Andrew Geissler82c905d2020-04-13 13:39:40 -0500436 shutil.copyfile(builddir + '/conf/templateconf.cfg', baseoutpath + '/conf/templateconf.cfg')
437 else:
438 # Write a templateconf.cfg
439 with open(baseoutpath + '/conf/templateconf.cfg', 'w') as f:
440 f.write('meta/conf\n')
Brad Bishop37a0e4d2017-12-04 01:01:44 -0500441
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500442 # Ensure any variables set from the external environment (by way of
443 # BB_ENV_EXTRAWHITE) are set in the SDK's configuration
444 extralines = []
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600445 for name, value in env_whitelist_values.items():
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500446 actualvalue = d.getVar(name) or ''
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500447 if value != actualvalue:
448 extralines.append('%s = "%s"\n' % (name, actualvalue))
449 if extralines:
450 with open(baseoutpath + '/conf/local.conf', 'a') as f:
451 f.write('\n')
452 f.write('# Extra settings from environment:\n')
453 for line in extralines:
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500454 f.write(line)
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500455 f.write('\n')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500456
457 # Filter the locked signatures file to just the sstate tasks we are interested in
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600458 excluded_targets = get_sdk_install_targets(d, images_only=True)
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500459 sigfile = d.getVar('WORKDIR') + '/locked-sigs.inc'
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500460 lockedsigs_pruned = baseoutpath + '/conf/locked-sigs.inc'
Brad Bishopa34c0302019-09-23 22:34:48 -0400461 #nativesdk-only sigfile to merge into locked-sigs.inc
462 sdk_include_nativesdk = (d.getVar("SDK_INCLUDE_NATIVESDK") == '1')
463 nativesigfile = d.getVar('WORKDIR') + '/locked-sigs_nativesdk.inc'
464 nativesigfile_pruned = d.getVar('WORKDIR') + '/locked-sigs_nativesdk_pruned.inc'
465
466 if sdk_include_nativesdk:
467 oe.copy_buildsystem.prune_lockedsigs([],
468 excluded_targets.split(),
469 nativesigfile,
470 True,
471 nativesigfile_pruned)
472
473 oe.copy_buildsystem.merge_lockedsigs([],
474 sigfile,
475 nativesigfile_pruned,
476 sigfile)
477
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500478 oe.copy_buildsystem.prune_lockedsigs([],
479 excluded_targets.split(),
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500480 sigfile,
Brad Bishopa34c0302019-09-23 22:34:48 -0400481 False,
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500482 lockedsigs_pruned)
483
484 sstate_out = baseoutpath + '/sstate-cache'
485 bb.utils.remove(sstate_out, True)
Brad Bishop37a0e4d2017-12-04 01:01:44 -0500486
487 # uninative.bbclass sets NATIVELSBSTRING to 'universal%s' % oe.utils.host_gcc_version(d)
488 fixedlsbstring = "universal%s" % oe.utils.host_gcc_version(d)
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500489
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500490 sdk_include_toolchain = (d.getVar('SDK_INCLUDE_TOOLCHAIN') == '1')
491 sdk_ext_type = d.getVar('SDK_EXT_TYPE')
Brad Bishopa34c0302019-09-23 22:34:48 -0400492 if (sdk_ext_type != 'minimal' or sdk_include_toolchain or derivative) and not sdk_include_nativesdk:
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600493 # Create the filtered task list used to generate the sstate cache shipped with the SDK
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500494 tasklistfn = d.getVar('WORKDIR') + '/tasklist.txt'
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600495 create_filtered_tasklist(d, baseoutpath, tasklistfn, conf_initpath)
496 else:
497 tasklistfn = None
498
Brad Bishop00e122a2019-10-05 11:10:57 -0400499 if os.path.exists(builddir + '/cache/bb_unihashes.dat'):
500 bb.parse.siggen.save_unitaskhashes()
501 bb.utils.mkdirhier(os.path.join(baseoutpath, 'cache'))
502 shutil.copyfile(builddir + '/cache/bb_unihashes.dat', baseoutpath + '/cache/bb_unihashes.dat')
503
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500504 # Add packagedata if enabled
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500505 if d.getVar('SDK_INCLUDE_PKGDATA') == '1':
506 lockedsigs_base = d.getVar('WORKDIR') + '/locked-sigs-base.inc'
507 lockedsigs_copy = d.getVar('WORKDIR') + '/locked-sigs-copy.inc'
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500508 shutil.move(lockedsigs_pruned, lockedsigs_base)
509 oe.copy_buildsystem.merge_lockedsigs(['do_packagedata'],
510 lockedsigs_base,
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500511 d.getVar('STAGING_DIR_HOST') + '/world-pkgdata/locked-sigs-pkgdata.inc',
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500512 lockedsigs_pruned,
513 lockedsigs_copy)
514
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600515 if sdk_include_toolchain:
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500516 lockedsigs_base = d.getVar('WORKDIR') + '/locked-sigs-base2.inc'
517 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 -0600518 shutil.move(lockedsigs_pruned, lockedsigs_base)
519 oe.copy_buildsystem.merge_lockedsigs([],
520 lockedsigs_base,
521 lockedsigs_toolchain,
522 lockedsigs_pruned)
523 oe.copy_buildsystem.create_locked_sstate_cache(lockedsigs_toolchain,
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500524 d.getVar('SSTATE_DIR'),
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600525 sstate_out, d,
526 fixedlsbstring,
527 filterfile=tasklistfn)
528
529 if sdk_ext_type == 'minimal':
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500530 if derivative:
531 # Assume the user is not going to set up an additional sstate
532 # mirror, thus we need to copy the additional artifacts (from
533 # workspace recipes) into the derivative SDK
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500534 lockedsigs_orig = d.getVar('TOPDIR') + '/conf/locked-sigs.inc'
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500535 if os.path.exists(lockedsigs_orig):
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500536 lockedsigs_extra = d.getVar('WORKDIR') + '/locked-sigs-extra.inc'
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500537 oe.copy_buildsystem.merge_lockedsigs(None,
538 lockedsigs_orig,
539 lockedsigs_pruned,
540 None,
541 lockedsigs_extra)
542 oe.copy_buildsystem.create_locked_sstate_cache(lockedsigs_extra,
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500543 d.getVar('SSTATE_DIR'),
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500544 sstate_out, d,
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600545 fixedlsbstring,
546 filterfile=tasklistfn)
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500547 else:
548 oe.copy_buildsystem.create_locked_sstate_cache(lockedsigs_pruned,
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500549 d.getVar('SSTATE_DIR'),
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500550 sstate_out, d,
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600551 fixedlsbstring,
552 filterfile=tasklistfn)
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500553
554 # We don't need sstate do_package files
555 for root, dirs, files in os.walk(sstate_out):
556 for name in files:
557 if name.endswith("_package.tgz"):
558 f = os.path.join(root, name)
559 os.remove(f)
560
561 # Write manifest file
562 # Note: at the moment we cannot include the env setup script here to keep
563 # it updated, since it gets modified during SDK installation (see
564 # sdk_ext_postinst() below) thus the checksum we take here would always
565 # be different.
566 manifest_file_list = ['conf/*']
Andrew Geissler09036742021-06-25 14:25:14 -0500567 if d.getVar('BBMULTICONFIG') is not None:
568 manifest_file_list.append('conf/multiconfig/*')
569
Andrew Geisslerc3d88e42020-10-02 09:45:00 -0500570 esdk_manifest_excludes = (d.getVar('ESDK_MANIFEST_EXCLUDES') or '').split()
571 esdk_manifest_excludes_list = []
572 for exclude_item in esdk_manifest_excludes:
573 esdk_manifest_excludes_list += glob.glob(os.path.join(baseoutpath, exclude_item))
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500574 manifest_file = os.path.join(baseoutpath, 'conf', 'sdk-conf-manifest')
575 with open(manifest_file, 'w') as f:
576 for item in manifest_file_list:
577 for fn in glob.glob(os.path.join(baseoutpath, item)):
Andrew Geissler09036742021-06-25 14:25:14 -0500578 if fn == manifest_file or os.path.isdir(fn):
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500579 continue
Andrew Geisslerc3d88e42020-10-02 09:45:00 -0500580 if fn in esdk_manifest_excludes_list:
581 continue
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500582 chksum = bb.utils.sha256_file(fn)
583 f.write('%s\t%s\n' % (chksum, os.path.relpath(fn, baseoutpath)))
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500584}
585
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600586def get_current_buildtools(d):
587 """Get the file name of the current buildtools installer"""
588 import glob
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500589 btfiles = glob.glob(os.path.join(d.getVar('SDK_DEPLOY'), '*-buildtools-nativesdk-standalone-*.sh'))
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600590 btfiles.sort(key=os.path.getctime)
591 return os.path.basename(btfiles[-1])
592
593def get_sdk_required_utilities(buildtools_fn, d):
594 """Find required utilities that aren't provided by the buildtools"""
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500595 sanity_required_utilities = (d.getVar('SANITY_REQUIRED_UTILITIES') or '').split()
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600596 sanity_required_utilities.append(d.expand('${BUILD_PREFIX}gcc'))
597 sanity_required_utilities.append(d.expand('${BUILD_PREFIX}g++'))
Brad Bishop1d80a2e2019-11-15 16:35:03 -0500598 if buildtools_fn:
599 buildtools_installer = os.path.join(d.getVar('SDK_DEPLOY'), buildtools_fn)
600 filelist, _ = bb.process.run('%s -l' % buildtools_installer)
601 else:
602 buildtools_installer = None
603 filelist = ""
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600604 localdata = bb.data.createCopy(d)
605 localdata.setVar('SDKPATH', '.')
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500606 sdkpathnative = localdata.getVar('SDKPATHNATIVE')
607 sdkbindirs = [localdata.getVar('bindir_nativesdk'),
608 localdata.getVar('sbindir_nativesdk'),
609 localdata.getVar('base_bindir_nativesdk'),
610 localdata.getVar('base_sbindir_nativesdk')]
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600611 for line in filelist.splitlines():
612 splitline = line.split()
613 if len(splitline) > 5:
614 fn = splitline[5]
615 if not fn.startswith('./'):
616 fn = './%s' % fn
617 if fn.startswith(sdkpathnative):
618 relpth = '/' + os.path.relpath(fn, sdkpathnative)
619 for bindir in sdkbindirs:
620 if relpth.startswith(bindir):
621 relpth = os.path.relpath(relpth, bindir)
622 if relpth in sanity_required_utilities:
623 sanity_required_utilities.remove(relpth)
624 break
625 return ' '.join(sanity_required_utilities)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500626
627install_tools() {
628 install -d ${SDK_OUTPUT}/${SDKPATHNATIVE}${bindir_nativesdk}
Brad Bishop316dfdd2018-06-25 12:45:53 -0400629 scripts="devtool recipetool oe-find-native-sysroot runqemu* wic"
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600630 for script in $scripts; do
631 for scriptfn in `find ${SDK_OUTPUT}/${SDKPATH}/${scriptrelpath} -maxdepth 1 -executable -name "$script"`; do
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800632 targetscriptfn="${SDK_OUTPUT}/${SDKPATHNATIVE}${bindir_nativesdk}/$(basename $scriptfn)"
633 test -e ${targetscriptfn} || lnr ${scriptfn} ${targetscriptfn}
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600634 done
635 done
636 # We can't use the same method as above because files in the sysroot won't exist at this point
637 # (they get populated from sstate on installation)
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500638 unfsd_path="${SDK_OUTPUT}/${SDKPATHNATIVE}${bindir_nativesdk}/unfsd"
639 if [ "${SDK_INCLUDE_TOOLCHAIN}" = "1" -a ! -e $unfsd_path ] ; then
640 binrelpath=${@os.path.relpath(d.getVar('STAGING_BINDIR_NATIVE'), d.getVar('TMPDIR'))}
641 lnr ${SDK_OUTPUT}/${SDKPATH}/tmp/$binrelpath/unfsd $unfsd_path
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600642 fi
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500643 touch ${SDK_OUTPUT}/${SDKPATH}/.devtoolbase
644
645 # find latest buildtools-tarball and install it
Brad Bishop1d80a2e2019-11-15 16:35:03 -0500646 if [ -n "${SDK_BUILDTOOLS_INSTALLER}" ]; then
647 install ${SDK_DEPLOY}/${SDK_BUILDTOOLS_INSTALLER} ${SDK_OUTPUT}/${SDKPATH}
648 fi
Patrick Williamsf1e5d692016-03-30 15:21:19 -0500649
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500650 install -m 0644 ${COREBASE}/meta/files/ext-sdk-prepare.py ${SDK_OUTPUT}/${SDKPATH}
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500651}
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500652do_populate_sdk_ext[file-checksums] += "${COREBASE}/meta/files/ext-sdk-prepare.py:True"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500653
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500654sdk_ext_preinst() {
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600655 # Since bitbake won't run as root it doesn't make sense to try and install
656 # the extensible sdk as root.
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500657 if [ "`id -u`" = "0" ]; then
658 echo "ERROR: The extensible sdk cannot be installed as root."
659 exit 1
660 fi
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600661 if ! command -v locale > /dev/null; then
662 echo "ERROR: The installer requires the locale command, please install it first"
663 exit 1
664 fi
665 # Check setting of LC_ALL set above
666 canonicalised_locale=`echo $LC_ALL | sed 's/UTF-8/utf8/'`
667 if ! locale -a | grep -q $canonicalised_locale ; then
668 echo "ERROR: the installer requires the $LC_ALL locale to be installed (but not selected), please install it first"
669 exit 1
670 fi
671 # The relocation script used by buildtools installer requires python
Andrew Geissler82c905d2020-04-13 13:39:40 -0500672 if ! command -v python3 > /dev/null; then
673 echo "ERROR: The installer requires python3, please install it first"
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600674 exit 1
675 fi
676 missing_utils=""
677 for util in ${SDK_REQUIRED_UTILITIES}; do
678 if ! command -v $util > /dev/null; then
679 missing_utils="$missing_utils $util"
680 fi
681 done
682 if [ -n "$missing_utils" ] ; then
683 echo "ERROR: the SDK requires the following missing utilities, please install them: $missing_utils"
684 exit 1
685 fi
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500686 SDK_EXTENSIBLE="1"
Brad Bishop19323692019-04-05 15:28:33 -0400687 if [ "$publish" = "1" ] && [ "${SDK_EXT_TYPE}" = "minimal" ] ; then
688 EXTRA_TAR_OPTIONS="$EXTRA_TAR_OPTIONS --exclude=sstate-cache"
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500689 fi
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500690}
691SDK_PRE_INSTALL_COMMAND_task-populate-sdk-ext = "${sdk_ext_preinst}"
692
693# FIXME this preparation should be done as part of the SDK construction
694sdk_ext_postinst() {
695 printf "\nExtracting buildtools...\n"
696 cd $target_sdk_dir
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600697 env_setup_script="$target_sdk_dir/environment-setup-${REAL_MULTIMACH_TARGET_SYS}"
Brad Bishop1d80a2e2019-11-15 16:35:03 -0500698 if [ -n "${SDK_BUILDTOOLS_INSTALLER}" ]; then
699 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 -0500700
Brad Bishop1d80a2e2019-11-15 16:35:03 -0500701 # Delete the buildtools tar file since it won't be used again
702 rm -f ./${SDK_BUILDTOOLS_INSTALLER}
703 # We don't need the log either since it succeeded
704 rm -f buildtools.log
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500705
Brad Bishop1d80a2e2019-11-15 16:35:03 -0500706 # Make sure when the user sets up the environment, they also get
707 # the buildtools-tarball tools in their path.
Andrew Geissler635e0e42020-08-21 15:58:33 -0500708 echo "# Save and reset OECORE_NATIVE_SYSROOT as buildtools may change it" >> $env_setup_script
709 echo "SAVED=\"\$OECORE_NATIVE_SYSROOT\"" >> $env_setup_script
Brad Bishop1d80a2e2019-11-15 16:35:03 -0500710 echo ". $target_sdk_dir/buildtools/environment-setup*" >> $env_setup_script
Andrew Geissler635e0e42020-08-21 15:58:33 -0500711 echo "OECORE_NATIVE_SYSROOT=\"\$SAVED\"" >> $env_setup_script
Brad Bishop1d80a2e2019-11-15 16:35:03 -0500712 fi
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500713
714 # Allow bitbake environment setup to be ran as part of this sdk.
Patrick Williamsf1e5d692016-03-30 15:21:19 -0500715 echo "export OE_SKIP_SDK_CHECK=1" >> $env_setup_script
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500716 # Work around runqemu not knowing how to get this information within the eSDK
717 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 -0500718
719 # A bit of another hack, but we need this in the path only for devtool
720 # so put it at the end of $PATH.
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500721 echo "export PATH=$target_sdk_dir/sysroots/${SDK_SYS}${bindir_nativesdk}:\$PATH" >> $env_setup_script
Patrick Williamsf1e5d692016-03-30 15:21:19 -0500722
723 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
724
725 # Warn if trying to use external bitbake and the ext SDK together
726 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 -0500727
Brad Bishop1d80a2e2019-11-15 16:35:03 -0500728 if [ "$prepare_buildsystem" != "no" -a -n "${SDK_BUILDTOOLS_INSTALLER}" ]; then
Patrick Williamsf1e5d692016-03-30 15:21:19 -0500729 printf "Preparing build system...\n"
730 # dash which is /bin/sh on Ubuntu will not preserve the
731 # current working directory when first ran, nor will it set $1 when
732 # sourcing a script. That is why this has to look so ugly.
733 LOGFILE="$target_sdk_dir/preparing_build_system.log"
Andrew Geissler475cb722020-07-10 16:00:51 -0500734 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 && python3 $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 -0400735 fi
736 if [ -e $target_sdk_dir/ext-sdk-prepare.py ]; then
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500737 rm $target_sdk_dir/ext-sdk-prepare.py
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500738 fi
739 echo done
740}
741
742SDK_POST_INSTALL_COMMAND_task-populate-sdk-ext = "${sdk_ext_postinst}"
743
744SDK_POSTPROCESS_COMMAND_prepend_task-populate-sdk-ext = "copy_buildsystem; install_tools; "
745
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500746SDK_INSTALL_TARGETS = ""
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500747fakeroot python do_populate_sdk_ext() {
Patrick Williamsf1e5d692016-03-30 15:21:19 -0500748 # FIXME hopefully we can remove this restriction at some point, but uninative
749 # currently forces this upon us
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500750 if d.getVar('SDK_ARCH') != d.getVar('BUILD_ARCH'):
751 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 -0500752
Andrew Geissler5f350902021-07-23 13:09:54 -0400753 # FIXME hopefully we can remove this restriction at some point, but the eSDK
754 # can only be built for the primary (default) multiconfig
755 if d.getVar('BB_CURRENT_MC') != 'default':
756 bb.fatal('The extensible SDK can currently only be built for the default multiconfig. Currently trying to build for %s.' % d.getVar('BB_CURRENT_MC'))
757
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500758 d.setVar('SDK_INSTALL_TARGETS', get_sdk_install_targets(d))
Brad Bishop1d80a2e2019-11-15 16:35:03 -0500759 if d.getVar('SDK_INCLUDE_BUILDTOOLS') == '1':
760 buildtools_fn = get_current_buildtools(d)
761 else:
762 buildtools_fn = None
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600763 d.setVar('SDK_REQUIRED_UTILITIES', get_sdk_required_utilities(buildtools_fn, d))
764 d.setVar('SDK_BUILDTOOLS_INSTALLER', buildtools_fn)
765 d.setVar('SDKDEPLOYDIR', '${SDKEXTDEPLOYDIR}')
Brad Bishop00111322018-04-01 22:23:53 -0400766 # ESDKs have a libc from the buildtools so ensure we don't ship linguas twice
767 d.delVar('SDKIMAGE_LINGUAS')
Brad Bishopa34c0302019-09-23 22:34:48 -0400768 if d.getVar("SDK_INCLUDE_NATIVESDK") == '1':
769 generate_nativesdk_lockedsigs(d)
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600770 populate_sdk_common(d)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500771}
772
Brad Bishopa34c0302019-09-23 22:34:48 -0400773def generate_nativesdk_lockedsigs(d):
774 import oe.copy_buildsystem
775 sigfile = d.getVar('WORKDIR') + '/locked-sigs_nativesdk.inc'
776 oe.copy_buildsystem.generate_locked_sigs(sigfile, d)
777
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500778def get_ext_sdk_depends(d):
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600779 # Note: the deps varflag is a list not a string, so we need to specify expand=False
780 deps = d.getVarFlag('do_image_complete', 'deps', False)
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500781 pn = d.getVar('PN')
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600782 deplist = ['%s:%s' % (pn, dep) for dep in deps]
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500783 tasklist = bb.build.tasksbetween('do_image_complete', 'do_build', d)
784 tasklist.append('do_rootfs')
785 for task in tasklist:
786 deplist.extend((d.getVarFlag(task, 'depends') or '').split())
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600787 return ' '.join(deplist)
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500788
789python do_sdk_depends() {
790 # We have to do this separately in its own task so we avoid recursing into
791 # dependencies we don't need to (e.g. buildtools-tarball) and bringing those
792 # into the SDK's sstate-cache
793 import oe.copy_buildsystem
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500794 sigfile = d.getVar('WORKDIR') + '/locked-sigs.inc'
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500795 oe.copy_buildsystem.generate_locked_sigs(sigfile, d)
796}
797addtask sdk_depends
798
799do_sdk_depends[dirs] = "${WORKDIR}"
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500800do_sdk_depends[depends] = "${@get_ext_sdk_depends(d)} meta-extsdk-toolchain:do_populate_sysroot"
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500801do_sdk_depends[recrdeptask] = "${@d.getVarFlag('do_populate_sdk', 'recrdeptask', False)}"
802do_sdk_depends[recrdeptask] += "do_populate_lic do_package_qa do_populate_sysroot do_deploy ${SDK_RECRDEP_TASKS}"
803do_sdk_depends[rdepends] = "${@get_sdk_ext_rdepends(d)}"
804
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500805def get_sdk_ext_rdepends(d):
806 localdata = d.createCopy()
807 localdata.appendVar('OVERRIDES', ':task-populate-sdk-ext')
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500808 return localdata.getVarFlag('do_populate_sdk', 'rdepends')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500809
810do_populate_sdk_ext[dirs] = "${@d.getVarFlag('do_populate_sdk', 'dirs', False)}"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500811
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500812do_populate_sdk_ext[depends] = "${@d.getVarFlag('do_populate_sdk', 'depends', False)} \
Brad Bishop1d80a2e2019-11-15 16:35:03 -0500813 ${@'buildtools-tarball:do_populate_sdk' if d.getVar('SDK_INCLUDE_BUILDTOOLS') == '1' else ''} \
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500814 ${@'meta-world-pkgdata:do_collect_packagedata' if d.getVar('SDK_INCLUDE_PKGDATA') == '1' else ''} \
815 ${@'meta-extsdk-toolchain:do_locked_sigs' if d.getVar('SDK_INCLUDE_TOOLCHAIN') == '1' else ''}"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500816
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500817# We must avoid depending on do_build here if rm_work.bbclass is active,
818# because otherwise do_rm_work may run before do_populate_sdk_ext itself.
819# We can't mark do_populate_sdk_ext and do_sdk_depends as having to
820# run before do_rm_work, because then they would also run as part
821# of normal builds.
822do_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 -0500823
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500824# Make sure code changes can result in rebuild
825do_populate_sdk_ext[vardeps] += "copy_buildsystem \
826 sdk_ext_postinst"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500827
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500828# Since any change in the metadata of any layer should cause a rebuild of the
829# sdk(since the layers are put in the sdk) set the task to nostamp so it
830# always runs.
831do_populate_sdk_ext[nostamp] = "1"
832
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600833SDKEXTDEPLOYDIR = "${WORKDIR}/deploy-${PN}-populate-sdk-ext"
834
835SSTATETASKS += "do_populate_sdk_ext"
836SSTATE_SKIP_CREATION_task-populate-sdk-ext = '1'
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500837do_populate_sdk_ext[cleandirs] = "${SDKEXTDEPLOYDIR}"
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600838do_populate_sdk_ext[sstate-inputdirs] = "${SDKEXTDEPLOYDIR}"
839do_populate_sdk_ext[sstate-outputdirs] = "${SDK_DEPLOY}"
Brad Bishop316dfdd2018-06-25 12:45:53 -0400840do_populate_sdk_ext[stamp-extra-info] = "${MACHINE_ARCH}"
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600841
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500842addtask populate_sdk_ext after do_sdk_depends