def do_package(self, packages, makefile, package, vars, makeflags): config_entry = self.config['base', package] vars.update(config_entry) vars['package'] = package makeflags['PACKAGE'] = package binary = self.templates["control.binary"] copyright = self.templates["copyright.binary"] if os.path.exists('%s/copyright' % package): f = open('%s/copyright' % package) open("debian/firmware-%s.copyright" % package, 'w').write(f.read()) else: vars['license'] = codecs.open("%s/LICENSE" % package, 'r', 'utf-8').read() codecs.open("debian/firmware-%s.copyright" % package, 'w', 'utf-8').write(self.substitute(copyright, vars)) try: os.unlink('debian/firmware-%s.bug-presubj' % package) except OSError: pass os.symlink('bug-presubj', 'debian/firmware-%s.bug-presubj' % package) files_orig = config_entry['files'] files_real = {} files_unused = [] links = {} links_rev = {} for root, dirs, files in os.walk(package): try: dirs.remove('.svn') except ValueError: pass for f in files: cur_path = root + '/' + f if root != package: f = root[len(package) + 1:] + '/' + f if os.path.islink(cur_path): if f in files_orig: links[f] = os.readlink(cur_path) links_rev.setdefault(links[f], []).append(f) continue f1 = f.rsplit('-', 1) if f in files_orig: files_real[f] = f, f, None continue if len(f1) > 1: f_base, f_version = f1 if f_base in files_orig: if f_base in files_real: raise RuntimeError("Multiple files for %s" % f_base) files_real[f_base] = f_base, f, f_version continue # Whitelist files not expected to be installed as firmware if f in [ 'copyright', 'defines', 'LICENSE', 'LICENSE.install', 'update.py', 'update.sh' ]: continue files_unused.append(f) if files_unused: print >>sys.stderr, 'W: %s: unused files:' % package, \ ' '.join(files_unused) makeflags['FILES'] = ' '.join( ["%s:%s" % (i[1], i[0]) for i in files_real.itervalues()]) vars['files_real'] = ' '.join( ["/lib/firmware/%s" % i for i in config_entry['files']]) makeflags['LINKS'] = ' '.join( ["%s:%s" % (link, target) for link, target in links.iteritems()]) files_desc = [u"Contents:"] for f in config_entry['files']: if f in links: continue f, f_real, version = files_real[f] c = self.config.get(('base', package, f), {}) desc = c.get('desc') if version is None: version = c.get('version') try: f = f + u', ' + u', '.join(links_rev[f]) except KeyError: pass if desc and version: files_desc.append(u" * %s, version %s (%s)" % (desc, version, f)) elif desc: files_desc.append(u" * %s (%s)" % (desc, f)) else: files_desc.append(u" * %s" % f) packages_binary = self.process_packages(binary, vars) packages_binary[0]['Description'].append_pre(files_desc) if 'initramfs-tools' in config_entry.get('support', []): postinst = self.templates['postinst.initramfs-tools'] codecs.open("debian/firmware-%s.postinst" % package, 'w', 'utf-8').write(self.substitute(postinst, vars)) if 'license-accept' in config_entry: license = codecs.open("%s/LICENSE.install" % package, 'r', 'utf-8').read() preinst = self.templates['preinst.license'] preinst_filename = "debian/firmware-%s.preinst" % package codecs.open(preinst_filename, 'w', 'utf-8').write(self.substitute(preinst, vars)) templates = self.process_templates( self.templates['templates.license'], vars) license_split = re.split(ur'\n\s*\n', license) templates[0]['Description'].extend(license_split) templates_filename = "debian/firmware-%s.templates" % package self.write_rfc822(codecs.open(templates_filename, 'w', 'utf-8'), templates) desc = packages_binary[0]['Description'] desc.append(u"""This firmware is covered by the %s. You must agree to the terms of this license before it is installed.""" % vars['license-title']) packages_binary[0]['Pre-Depends'] = PackageRelation( 'debconf | debconf-2.0') packages.extend(packages_binary) makefile.add( 'binary-indep', cmds=["$(MAKE) -f debian/rules.real binary-indep %s" % makeflags])
def do_flavour_packages(self, packages, makefile, arch, featureset, flavour, vars, makeflags, extra): headers = self.templates["control.headers"] config_entry_base = self.config.merge('base', arch, featureset, flavour) config_entry_build = self.config.merge('build', arch, featureset, flavour) config_entry_description = self.config.merge('description', arch, featureset, flavour) config_entry_image = self.config.merge('image', arch, featureset, flavour) config_entry_relations = self.config.merge('relations', arch, featureset, flavour) compiler = config_entry_base.get('compiler', 'gcc') # Work out dependency from linux-headers to compiler. Drop # dependencies for cross-builds. Strip any remaining # restrictions, as they don't apply to binary Depends. relations_compiler_headers = PackageRelation( self.substitute( config_entry_relations.get('headers%' + compiler) or config_entry_relations.get(compiler), vars)) relations_compiler_headers = PackageRelation( PackageRelationGroup(entry for entry in group if 'cross' not in entry.restrictions) for group in relations_compiler_headers) for group in relations_compiler_headers: for entry in group: entry.restrictions = [] relations_compiler_build_dep = PackageRelation( self.substitute(config_entry_relations[compiler], vars)) for group in relations_compiler_build_dep: for item in group: item.arches = [arch] packages['source']['Build-Depends-Arch'].extend( relations_compiler_build_dep) image_fields = {'Description': PackageDescription()} for field in ('Depends', 'Provides', 'Suggests', 'Recommends', 'Conflicts', 'Breaks'): image_fields[field] = PackageRelation(config_entry_image.get( field.lower(), None), override_arches=(arch, )) generators = config_entry_image['initramfs-generators'] group = PackageRelationGroup() for i in generators: i = config_entry_relations.get(i, i) group.append(i) a = PackageRelationEntry(i) if a.operator is not None: a.operator = -a.operator image_fields['Breaks'].append(PackageRelationGroup([a])) for item in group: item.arches = [arch] image_fields['Depends'].append(group) bootloaders = config_entry_image.get('bootloaders') if bootloaders: group = PackageRelationGroup() for i in bootloaders: i = config_entry_relations.get(i, i) group.append(i) a = PackageRelationEntry(i) if a.operator is not None: a.operator = -a.operator image_fields['Breaks'].append(PackageRelationGroup([a])) for item in group: item.arches = [arch] image_fields['Suggests'].append(group) desc_parts = self.config.get_merge('description', arch, featureset, flavour, 'parts') if desc_parts: # XXX: Workaround, we need to support multiple entries of the same # name parts = list(set(desc_parts)) parts.sort() desc = image_fields['Description'] for part in parts: desc.append(config_entry_description['part-long-' + part]) desc.append_short( config_entry_description.get('part-short-' + part, '')) packages_dummy = [] packages_own = [] build_signed = config_entry_build.get('signed-code') image = self.templates[build_signed and "control.image-unsigned" or "control.image"] vars.setdefault('desc', None) image_main = self.process_real_image(image[0], image_fields, vars) packages_own.append(image_main) makeflags['IMAGE_PACKAGE_NAME'] = image_main['Package'] packages_own.extend(self.process_packages(image[1:], vars)) package_headers = self.process_package(headers[0], vars) package_headers['Depends'].extend(relations_compiler_headers) packages_own.append(package_headers) if extra.get('headers_arch_depends'): extra['headers_arch_depends'].append('%s (= ${binary:Version})' % packages_own[-1]['Package']) if config_entry_build.get('vdso', False): makeflags['VDSO'] = True build_debug = config_entry_build.get('debug-info') if os.getenv('DEBIAN_KERNEL_DISABLE_DEBUG'): if self.changelog[0].distribution == 'UNRELEASED': import warnings warnings.warn('Disable debug infos on request ' '(DEBIAN_KERNEL_DISABLE_DEBUG set)') build_debug = False else: raise RuntimeError( 'Unable to disable debug infos in release build ' '(DEBIAN_KERNEL_DISABLE_DEBUG set)') if build_debug: makeflags['DEBUG'] = True packages_own.extend( self.process_packages(self.templates['control.image-dbg'], vars)) merge_packages(packages, packages_own + packages_dummy, arch) tests_control = self.process_package( self.templates['tests-control.image'][0], vars) tests_control['Depends'].append( PackageRelationGroup(image_main['Package'], override_arches=(arch, ))) if self.tests_control_image: self.tests_control_image['Depends'].extend( tests_control['Depends']) else: self.tests_control_image = tests_control self.tests_control.append(tests_control) def get_config(*entry_name): entry_real = ('image', ) + entry_name entry = self.config.get(entry_real, None) if entry is None: return None return entry.get('configs', None) def check_config_default(fail, f): for d in self.config_dirs[::-1]: f1 = d + '/' + f if os.path.exists(f1): return [f1] if fail: raise RuntimeError("%s unavailable" % f) return [] def check_config_files(files): ret = [] for f in files: for d in self.config_dirs[::-1]: f1 = d + '/' + f if os.path.exists(f1): ret.append(f1) break else: raise RuntimeError("%s unavailable" % f) return ret def check_config(default, fail, *entry_name): configs = get_config(*entry_name) if configs is None: return check_config_default(fail, default) return check_config_files(configs) kconfig = check_config('config', True) kconfig.extend( check_config( "kernelarch-%s/config" % config_entry_base['kernel-arch'], False)) kconfig.extend(check_config("%s/config" % arch, True, arch)) kconfig.extend( check_config("%s/config.%s" % (arch, flavour), False, arch, None, flavour)) kconfig.extend( check_config("featureset-%s/config" % featureset, False, None, featureset)) kconfig.extend( check_config("%s/%s/config" % (arch, featureset), False, arch, featureset)) kconfig.extend( check_config("%s/%s/config.%s" % (arch, featureset, flavour), False, arch, featureset, flavour)) makeflags['KCONFIG'] = ' '.join(kconfig) makeflags['KCONFIG_OPTIONS'] = '' if build_debug: makeflags['KCONFIG_OPTIONS'] += ' -o DEBUG_INFO=y' if build_signed: makeflags['KCONFIG_OPTIONS'] += ' -o MODULE_SIG=y' # Add "salt" to fix #872263 makeflags['KCONFIG_OPTIONS'] += ( ' -o "BUILD_SALT=\\"%s%s\\""' % (vars['abiname'], vars['localversion'])) cmds_binary_arch = [ "$(MAKE) -f debian/rules.real binary-arch-flavour " "%s" % makeflags ] if packages_dummy: cmds_binary_arch.append( "$(MAKE) -f debian/rules.real install-dummy DH_OPTIONS='%s' %s" % (' '.join("-p%s" % i['Package'] for i in packages_dummy), makeflags)) cmds_build = [ "$(MAKE) -f debian/rules.real build-arch-flavour %s" % makeflags ] cmds_setup = [ "$(MAKE) -f debian/rules.real setup-arch-flavour %s" % makeflags ] makefile.add('binary-arch_%s_%s_%s_real' % (arch, featureset, flavour), cmds=cmds_binary_arch) makefile.add('build-arch_%s_%s_%s_real' % (arch, featureset, flavour), cmds=cmds_build) makefile.add('setup_%s_%s_%s_real' % (arch, featureset, flavour), cmds=cmds_setup) # Substitute kernel version etc. into maintainer scripts, # translations and lintian overrides self._substitute_file( 'headers.postinst', vars, 'debian/linux-headers-%s%s.postinst' % (vars['abiname'], vars['localversion'])) for name in ['postinst', 'postrm', 'preinst', 'prerm']: self._substitute_file( 'image.%s' % name, vars, 'debian/%s.%s' % (image_main['Package'], name)) if build_debug: debug_lintian_over = ( 'debian/linux-image-%s%s-dbg.lintian-overrides' % (vars['abiname'], vars['localversion'])) self._substitute_file('image-dbg.lintian-overrides', vars, debug_lintian_over) os.chmod(debug_lintian_over, 0o755)
def do_arch_packages(self, packages, makefile, arch, vars, makeflags, extra): if self.version.linux_modifier is None: try: abiname_part = '-%s' % self.config['abi', arch]['abiname'] except KeyError: abiname_part = self.abiname_part makeflags['ABINAME'] = vars['abiname'] = \ self.abiname_version + abiname_part build_signed = self.config.merge('build', arch) \ .get('signed-code', False) # Some userland architectures require kernels from another # (Debian) architecture, e.g. x32/amd64. # And some derivatives don't need the headers-all packages # for other reasons. if self.config['base', arch].get('featuresets') and \ self.config.merge('packages').get('headers-all', True): headers_arch = self.templates["control.headers.arch"] packages_headers_arch = self.process_packages(headers_arch, vars) packages_headers_arch[-1]['Depends'].extend(PackageRelation()) extra['headers_arch_depends'] = ( packages_headers_arch[-1]['Depends']) else: packages_headers_arch = [] if self.config.merge('packages').get('libc-dev', True): libc_dev = self.templates["control.libc-dev"] packages_headers_arch[0:0] = self.process_packages(libc_dev, {}) merge_packages(packages, packages_headers_arch, arch) if self.config['base', arch].get('featuresets') and \ self.config.merge('packages').get('source', True): merge_packages( packages, self.process_packages(self.templates["control.config"], vars), arch) cmds_build_arch = [ "$(MAKE) -f debian/rules.real build-arch-arch %s" % makeflags ] makefile.add('build-arch_%s_real' % arch, cmds=cmds_build_arch) cmds_binary_arch = [ "$(MAKE) -f debian/rules.real binary-arch-arch %s" % makeflags ] makefile.add('binary-arch_%s_real' % arch, cmds=cmds_binary_arch, deps=['setup_%s' % arch]) udeb_packages = self.installer_packages.get(arch, []) if udeb_packages: merge_packages(packages, udeb_packages, arch) # These packages must be built after the per-flavour/ # per-featureset packages. Also, this won't work # correctly with an empty package list. makefile.add('binary-arch_%s' % arch, cmds=[ "$(MAKE) -f debian/rules.real install-udeb_%s %s " "PACKAGE_NAMES='%s' UDEB_UNSIGNED_TEST_BUILD=%s" % (arch, makeflags, ' '.join( p['Package'] for p in udeb_packages), build_signed) ]) # This also needs to be built after the per-flavour/per-featureset # packages. if build_signed: merge_packages( packages, self.process_packages( self.templates['control.signed-template'], vars), arch) makefile.add('binary-arch_%s' % arch, cmds=[ "$(MAKE) -f debian/rules.real " "install-signed-template_%s %s" % (arch, makeflags) ])
def do_flavour_packages(self, packages, makefile, arch, featureset, flavour, vars, makeflags, extra): if not (self.config.merge('build', arch, featureset, flavour).get( 'signed-code', False)): return image_suffix = '%(abiname)s%(localversion)s' % vars image_package_name = 'linux-image-%s-unsigned' % image_suffix # Verify that this flavour is configured to support Secure Boot, # and get the trusted certificates filename. with open('debian/%s/boot/config-%s' % (image_package_name, image_suffix)) as f: kconfig = f.readlines() assert 'CONFIG_EFI_STUB=y\n' in kconfig assert 'CONFIG_LOCK_DOWN_IN_EFI_SECURE_BOOT=y\n' in kconfig cert_re = re.compile(r'CONFIG_SYSTEM_TRUSTED_KEYS="(.*)"$') cert_file_name = None for line in kconfig: match = cert_re.match(line) if match: cert_file_name = match.group(1) break assert cert_file_name if featureset != "none": cert_file_name = os.path.join( 'debian/build/source_%s' % featureset, cert_file_name) self.image_packages.append( (image_suffix, image_package_name, cert_file_name)) packages['source']['Build-Depends'].append( image_package_name + ' (= %(imagebinaryversion)s) [%(arch)s]' % vars) packages_own = self.process_packages(self.templates['control.image'], vars) assert len(packages_own) == 1 cmds_binary_arch = [ "$(MAKE) -f debian/rules.real install-signed " "PACKAGE_NAME='%s' %s" % (packages_own[0]['Package'], makeflags) ] if self.config.merge('packages').get('meta', True): packages_meta = self.process_packages( self.templates['control.image.meta'], vars) assert len(packages_meta) == 1 packages_meta += self.process_packages( self.templates['control.headers.meta'], vars) assert len(packages_meta) == 2 # Don't pretend to support build-profiles for package in packages_meta: del package['Build-Profiles'] if flavour == self.default_flavour \ and not self.vars['source_suffix']: packages_meta[0].setdefault('Provides', PackageRelation()) \ .append('linux-image-generic') packages_meta[1].setdefault('Provides', PackageRelation()) \ .append('linux-headers-generic') packages_own.extend(packages_meta) cmds_binary_arch += [ "$(MAKE) -f debian/rules.real install-meta " "PACKAGE_NAME='%s' LINK_DOC_PACKAGE_NAME='%s' %s" % (package['Package'], package['Depends'][0][0].name, makeflags) for package in packages_meta ] self.substitute_debhelper_config( 'image.meta', vars, 'linux-image%(localversion)s' % vars, output_dir=self.template_debian_dir) self.substitute_debhelper_config( 'headers.meta', vars, 'linux-headers%(localversion)s' % vars, output_dir=self.template_debian_dir) merge_packages(packages, packages_own, arch) makefile.add('binary-arch_%s_%s_%s_real' % (arch, featureset, flavour), cmds=cmds_binary_arch) self.substitute_debhelper_config( 'image', vars, 'linux-image-%(abiname)s%(localversion)s' % vars, output_dir=self.template_debian_dir)
def do_package(self, packages, makefile, package, vars, makeflags): config_entry = self.config['base', package] vars.update(config_entry) vars['package'] = package makeflags['PACKAGE'] = package binary = self.templates["control.binary"] copyright = self.templates["copyright.binary"] package_dir = "debian/config/%s" % package if os.path.exists('%s/copyright' % package_dir): f = open('%s/copyright' % package_dir) open("debian/firmware-%s.copyright" % package, 'w').write(f.read()) else: vars['license'] = codecs.open("%s/LICENSE" % package_dir, 'r', 'utf-8').read() codecs.open("debian/firmware-%s.copyright" % package, 'w', 'utf-8').write(self.substitute(copyright, vars)) try: os.unlink('debian/firmware-%s.bug-presubj' % package) except OSError: pass os.symlink('bug-presubj', 'debian/firmware-%s.bug-presubj' % package) files_orig = config_entry['files'] files_real = {} files_unused = [] links = {} links_rev = {} # Look for additional and replacement files in binary package config for root, dirs, files in os.walk(package_dir): try: dirs.remove('.svn') except ValueError: pass for f in files: cur_path = root + '/' + f if root != package_dir: f = root[len(package_dir) + 1 : ] + '/' + f if os.path.islink(cur_path): if f in files_orig: links[f] = os.readlink(cur_path) continue f1 = f.rsplit('-', 1) if f in files_orig: files_real[f] = f, cur_path, None continue if len(f1) > 1: f_base, f_version = f1 if f_base in files_orig: if f_base in files_real: raise RuntimeError("Multiple files for %s" % f_base) files_real[f_base] = f_base, package_dir + '/' + f, \ f_version continue # Whitelist files not expected to be installed as firmware if f in ['copyright', 'defines', 'LICENSE', 'LICENSE.install', 'update.py', 'update.sh']: continue files_unused.append(f) # Take all the other files from upstream for f in files_orig: if f not in files_real and f not in links: if os.path.islink(f) and \ not self.config.get(('base', package, f), {}).get('copy'): links[f] = os.readlink(f) elif os.path.isfile(f): files_real[f] = f, f, None for f in links: link_target = os.path.normpath(os.path.join(f, '..', links[f])) links_rev.setdefault(link_target, []).append(f) if files_unused: print('W: %s: unused files:' % package, ' '.join(files_unused), file=sys.stderr) makeflags['FILES'] = ' '.join(["%s:%s" % (i[1], i[0]) for i in files_real.values()]) vars['files_real'] = ' '.join(["/lib/firmware/%s" % i for i in config_entry['files']]) makeflags['LINKS'] = ' '.join(["%s:%s" % (link, target) for link, target in links.items()]) files_desc = ["Contents:"] firmware_meta_temp = self.templates["metainfo.xml.firmware"] firmware_meta_list = [] wrap = TextWrapper(width = 71, fix_sentence_endings = True, initial_indent = ' * ', subsequent_indent = ' ').wrap for f in config_entry['files']: firmware_meta_list.append(self.substitute(firmware_meta_temp, {'filename': f})) if f in links: continue f, f_real, version = files_real[f] c = self.config.get(('base', package, f), {}) desc = c.get('desc') if version is None: version = c.get('version') try: f = f + ', ' + ', '.join(links_rev[f]) except KeyError: pass if desc and version: desc = "%s, version %s (%s)" % (desc, version, f) elif desc: desc = "%s (%s)" % (desc, f) else: desc = "%s" % f files_desc.extend(wrap(desc)) packages_binary = self.process_packages(binary, vars) packages_binary[0]['Description'].append_pre(files_desc) if 'initramfs-tools' in config_entry.get('support', []): postinst = self.templates['postinst.initramfs-tools'] codecs.open("debian/firmware-%s.postinst" % package, 'w', 'utf-8').write(self.substitute(postinst, vars)) if 'license-accept' in config_entry: license = codecs.open("%s/LICENSE.install" % package_dir, 'r', 'utf-8').read() preinst = self.templates['preinst.license'] preinst_filename = "debian/firmware-%s.preinst" % package codecs.open(preinst_filename, 'w', 'utf-8').write(self.substitute(preinst, vars)) templates = self.process_templates(self.templates['templates.license'], vars) license_split = re.split(r'\n\s*\n', license) templates[0]['Description'].extend(license_split) templates_filename = "debian/firmware-%s.templates" % package self.write_rfc822(codecs.open(templates_filename, 'w', 'utf-8'), templates) desc = packages_binary[0]['Description'] desc.append( """This firmware is covered by the %s. You must agree to the terms of this license before it is installed.""" % vars['license-title']) packages_binary[0]['Pre-Depends'] = PackageRelation('debconf | debconf-2.0') packages.extend(packages_binary) makefile.add('binary-indep', cmds = ["$(MAKE) -f debian/rules.real binary-indep %s" % makeflags]) vars['firmware-list'] = ''.join(firmware_meta_list) package_meta_temp = self.templates["metainfo.xml"] # XXX Might need to escape some characters codecs.open("debian/firmware-%s.metainfo.xml" % package, 'w', 'utf-8').write(self.substitute(package_meta_temp, vars))
def do_flavour_packages(self, packages, makefile, arch, featureset, flavour, vars, makeflags, extra): headers = self.templates["control.headers"] assert len(headers) == 1 do_meta = self.config.merge('packages').get('meta', True) config_entry_base = self.config.merge('base', arch, featureset, flavour) config_entry_build = self.config.merge('build', arch, featureset, flavour) config_entry_description = self.config.merge('description', arch, featureset, flavour) config_entry_relations = self.config.merge('relations', arch, featureset, flavour) def config_entry_image(key, *args, **kwargs): return self.config.get_merge('image', arch, featureset, flavour, key, *args, **kwargs) compiler = config_entry_base.get('compiler', 'gcc') # Work out dependency from linux-headers to compiler. Drop # dependencies for cross-builds. Strip any remaining # restrictions, as they don't apply to binary Depends. relations_compiler_headers = PackageRelation( self.substitute( config_entry_relations.get('headers%' + compiler) or config_entry_relations.get(compiler), vars)) relations_compiler_headers = PackageRelation( PackageRelationGroup(entry for entry in group if 'cross' not in entry.restrictions) for group in relations_compiler_headers) for group in relations_compiler_headers: for entry in group: entry.restrictions = [] relations_compiler_build_dep = PackageRelation( self.substitute(config_entry_relations[compiler], vars)) for group in relations_compiler_build_dep: for item in group: item.arches = [arch] packages['source']['Build-Depends-Arch'].extend( relations_compiler_build_dep) image_fields = {'Description': PackageDescription()} for field in ('Depends', 'Provides', 'Suggests', 'Recommends', 'Conflicts', 'Breaks'): image_fields[field] = PackageRelation(config_entry_image( field.lower(), None), override_arches=(arch, )) generators = config_entry_image('initramfs-generators') group = PackageRelationGroup() for i in generators: i = config_entry_relations.get(i, i) group.append(i) a = PackageRelationEntry(i) if a.operator is not None: a.operator = -a.operator image_fields['Breaks'].append(PackageRelationGroup([a])) for item in group: item.arches = [arch] image_fields['Depends'].append(group) bootloaders = config_entry_image('bootloaders', None) if bootloaders: group = PackageRelationGroup() for i in bootloaders: i = config_entry_relations.get(i, i) group.append(i) a = PackageRelationEntry(i) if a.operator is not None: a.operator = -a.operator image_fields['Breaks'].append(PackageRelationGroup([a])) for item in group: item.arches = [arch] image_fields['Suggests'].append(group) desc_parts = self.config.get_merge('description', arch, featureset, flavour, 'parts') if desc_parts: # XXX: Workaround, we need to support multiple entries of the same # name parts = list(set(desc_parts)) parts.sort() desc = image_fields['Description'] for part in parts: desc.append(config_entry_description['part-long-' + part]) desc.append_short( config_entry_description.get('part-short-' + part, '')) packages_own = [] if not self.disable_signed: build_signed = config_entry_build.get('signed-code') else: build_signed = False image = self.templates[build_signed and "control.image-unsigned" or "control.image"] assert len(image) == 1 vars.setdefault('desc', None) image_main = self.process_real_image(image[0], image_fields, vars) packages_own.append(image_main) makeflags['IMAGE_PACKAGE_NAME'] = image_main['Package'] package_headers = self.process_package(headers[0], vars) package_headers['Depends'].extend(relations_compiler_headers) packages_own.append(package_headers) if extra.get('headers_arch_depends'): extra['headers_arch_depends'].append('%s (= ${binary:Version})' % packages_own[-1]['Package']) # The image meta-packages will depend on signed linux-image # packages where applicable, so should be built from the # signed source packages The header meta-packages will also be # built along with the signed packages, to create a dependency # relationship that ensures src:linux and src:linux-signed-* # transition to testing together. if do_meta and not build_signed: packages_meta = self.process_packages( self.templates['control.image.meta'], vars) assert len(packages_meta) == 1 packages_meta += self.process_packages( self.templates['control.headers.meta'], vars) assert len(packages_meta) == 2 if flavour == self.default_flavour \ and not self.vars['source_suffix']: packages_meta[0].setdefault('Provides', PackageRelation()) \ .append('linux-image-generic') packages_meta[1].setdefault('Provides', PackageRelation()) \ .append('linux-headers-generic') packages_own.extend(packages_meta) self.substitute_debhelper_config( "image.meta", vars, "linux-image%(localversion)s" % vars) self.substitute_debhelper_config( 'headers.meta', vars, 'linux-headers%(localversion)s' % vars) if config_entry_build.get('vdso', False): makeflags['VDSO'] = True if not self.disable_debug: build_debug = config_entry_build.get('debug-info') else: build_debug = False if build_debug: makeflags['DEBUG'] = True packages_own.extend( self.process_packages(self.templates['control.image-dbg'], vars)) if do_meta: packages_own.extend( self.process_packages( self.templates["control.image-dbg.meta"], vars)) self.substitute_debhelper_config( 'image-dbg.meta', vars, 'linux-image%(localversion)s-dbg' % vars) merge_packages(packages, packages_own, arch) tests_control = self.process_package( self.templates['tests-control.image'][0], vars) tests_control['Depends'].append( PackageRelationGroup(image_main['Package'], override_arches=(arch, ))) if self.tests_control_image: self.tests_control_image['Depends'].extend( tests_control['Depends']) else: self.tests_control_image = tests_control self.tests_control.append(tests_control) def get_config(*entry_name): entry_real = ('image', ) + entry_name entry = self.config.get(entry_real, None) if entry is None: return None return entry.get('configs', None) def check_config_default(fail, f): for d in self.config_dirs[::-1]: f1 = d + '/' + f if os.path.exists(f1): return [f1] if fail: raise RuntimeError("%s unavailable" % f) return [] def check_config_files(files): ret = [] for f in files: for d in self.config_dirs[::-1]: f1 = d + '/' + f if os.path.exists(f1): ret.append(f1) break else: raise RuntimeError("%s unavailable" % f) return ret def check_config(default, fail, *entry_name): configs = get_config(*entry_name) if configs is None: return check_config_default(fail, default) return check_config_files(configs) kconfig = check_config('config', True) kconfig.extend( check_config( "kernelarch-%s/config" % config_entry_base['kernel-arch'], False)) kconfig.extend(check_config("%s/config" % arch, True, arch)) kconfig.extend( check_config("%s/config.%s" % (arch, flavour), False, arch, None, flavour)) kconfig.extend( check_config("featureset-%s/config" % featureset, False, None, featureset)) kconfig.extend( check_config("%s/%s/config" % (arch, featureset), False, arch, featureset)) kconfig.extend( check_config("%s/%s/config.%s" % (arch, featureset, flavour), False, arch, featureset, flavour)) makeflags['KCONFIG'] = ' '.join(kconfig) makeflags['KCONFIG_OPTIONS'] = '' if build_debug: makeflags['KCONFIG_OPTIONS'] += ' -o DEBUG_INFO=y' if build_signed: makeflags['KCONFIG_OPTIONS'] += ' -o MODULE_SIG=y' # Add "salt" to fix #872263 makeflags['KCONFIG_OPTIONS'] += \ ' -o "BUILD_SALT=\\"%(abiname)s%(localversion)s\\""' % vars cmds_binary_arch = [ "$(MAKE) -f debian/rules.real binary-arch-flavour " "%s" % makeflags ] cmds_build = [ "$(MAKE) -f debian/rules.real build-arch-flavour %s" % makeflags ] cmds_setup = [ "$(MAKE) -f debian/rules.real setup-arch-flavour %s" % makeflags ] makefile.add('binary-arch_%s_%s_%s_real' % (arch, featureset, flavour), cmds=cmds_binary_arch) makefile.add('build-arch_%s_%s_%s_real' % (arch, featureset, flavour), cmds=cmds_build) makefile.add('setup_%s_%s_%s_real' % (arch, featureset, flavour), cmds=cmds_setup) merged_config = ('debian/build/config.%s_%s_%s' % (arch, featureset, flavour)) makefile.add(merged_config, cmds=[ "$(MAKE) -f debian/rules.real %s %s" % (merged_config, makeflags) ]) self.substitute_debhelper_config( 'headers', vars, 'linux-headers-%(abiname)s%(localversion)s' % vars) self.substitute_debhelper_config('image', vars, image_main['Package']) if build_debug: self.substitute_debhelper_config( 'image-dbg', vars, 'linux-image-%(abiname)s%(localversion)s-dbg' % vars)