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 # 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 = [] makeflags['DO_HEADERS_ALL'] = False 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, {}) else: makeflags['DO_LIBC'] = False if not self.config.merge('packages').get('tools', True): makeflags['DO_TOOLS'] = False merge_packages(packages, packages_headers_arch, 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) # For stage1 build profile makefile.add('binary-libc-dev_%s' % arch, ['source_none_real'], ["$(MAKE) -f debian/rules.real install-libc-dev_%s %s" % (arch, makeflags)]) makefile.add('binary-tools_%s' % arch, ['source_none_real'], ["$(MAKE) -f debian/rules.real install-perf %s" % (makeflags,), "$(MAKE) -f debian/rules.real install-cpupower %s" % (makeflags,) ])
def do_featureset_packages(self, packages, makefile, arch, featureset, vars, makeflags, extra): headers_featureset = self.templates["control.headers.featureset"] package_headers = self.process_package(headers_featureset[0], vars) merge_packages(packages, (package_headers, ), arch) cmds_binary_arch = [ "$(MAKE) -f debian/rules.real binary-arch-featureset %s" % makeflags ] makefile.add('binary-arch_%s_%s_real' % (arch, featureset), cmds=cmds_binary_arch)
def do_arch_packages(self, packages, makefile, arch, vars, makeflags, extra): if os.getenv('DEBIAN_KERNEL_DISABLE_INSTALLER'): if self.changelog[0].distribution == 'UNRELEASED': import warnings warnings.warn( 'Disable installer modules on request (DEBIAN_KERNEL_DISABLE_INSTALLER set)' ) else: raise RuntimeError( 'Unable to disable installer modules in release build (DEBIAN_KERNEL_DISABLE_INSTALLER set)' ) elif (self.config.merge('packages').get('installer', True) and self.config.merge('build', arch).get('signed-code', False)): # Add udebs using kernel-wedge installer_def_dir = 'debian/installer' installer_arch_dir = os.path.join(installer_def_dir, arch) if os.path.isdir(installer_arch_dir): kw_env = os.environ.copy() kw_env['KW_DEFCONFIG_DIR'] = installer_def_dir kw_env['KW_CONFIG_DIR'] = installer_arch_dir kw_proc = subprocess.Popen( ['kernel-wedge', 'gen-control', vars['abiname']], stdout=subprocess.PIPE, env=kw_env) if not isinstance(kw_proc.stdout, io.IOBase): udeb_packages = read_control( io.open(kw_proc.stdout.fileno(), closefd=False)) else: udeb_packages = read_control( io.TextIOWrapper(kw_proc.stdout)) kw_proc.wait() if kw_proc.returncode != 0: raise RuntimeError('kernel-wedge exited with code %d' % kw_proc.returncode) 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. if udeb_packages: makefile.add( 'binary-arch_%s' % arch, cmds=[ "$(MAKE) -f debian/rules.real install-udeb_%s %s " "PACKAGE_NAMES='%s'" % (arch, makeflags, ' '.join(p['Package'] for p in udeb_packages)) ])
def do_arch_packages(self, packages, makefile, arch, vars, makeflags, extra): 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. if udeb_packages: makefile.add( 'binary-arch_%s' % arch, cmds=["$(MAKE) -f debian/rules.real install-udeb_%s %s " "PACKAGE_NAMES='%s'" % (arch, makeflags, ' '.join(p['Package'] for p in udeb_packages))])
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') relations_compiler_headers = PackageRelation( config_entry_relations.get('headers%' + compiler) or config_entry_relations.get(compiler)) relations_compiler_build_dep = PackageRelation( config_entry_relations[compiler]) for group in relations_compiler_build_dep: for item in group: item.arches = [arch] packages['source']['Build-Depends'].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'] l = PackageRelationGroup() for i in generators: i = config_entry_relations.get(i, i) l.append(i) a = PackageRelationEntry(i) if a.operator is not None: a.operator = -a.operator image_fields['Breaks'].append(PackageRelationGroup([a])) for item in l: item.arches = [arch] image_fields['Depends'].append(l) bootloaders = config_entry_image.get('bootloaders') if bootloaders: l = PackageRelationGroup() for i in bootloaders: i = config_entry_relations.get(i, i) l.append(i) a = PackageRelationEntry(i) if a.operator is not None: a.operator = -a.operator image_fields['Breaks'].append(PackageRelationGroup([a])) for item in l: item.arches = [arch] image_fields['Suggests'].append(l) 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 = [] image = self.templates["control.image"] vars.setdefault('desc', None) image_main = self.process_real_image(image[0], image_fields, vars) packages_own.append(image_main) 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) """ extra['headers_arch_depends'].append('%s (= ${binary:Version})' % packages_own[-1]['Package']) """ 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.main'][0], vars) tests_control['Depends'].append( PackageRelationGroup(image_main['Package'], override_arches=(arch,))) if self.tests_control: self.tests_control['Depends'].extend(tests_control['Depends']) else: self.tests_control = 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) if build_debug: makeflags['KCONFIG_OPTIONS'] = '-o DEBUG_INFO=y' 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/linux-image-%s%s.%s' % (vars['abiname'], vars['localversion'], name)) if build_debug: self._substitute_file( 'image-dbg.lintian-override', vars, 'debian/linux-image-%s%s-dbgsym.lintian-overrides' % (vars['abiname'], vars['localversion']))
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'] 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_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 # 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 = [] makeflags['DO_HEADERS_ALL'] = False 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, {}) else: makeflags['DO_LIBC'] = False if not self.config.merge('packages').get('tools', True): makeflags['DO_TOOLS'] = False merge_packages(packages, packages_headers_arch, 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) # For stage1 build profile makefile.add('binary-libc-dev_%s' % arch, ['source_none_real'], [ "$(MAKE) -f debian/rules.real install-libc-dev_%s %s" % (arch, makeflags) ]) if os.getenv('DEBIAN_KERNEL_DISABLE_INSTALLER'): if self.changelog[0].distribution == 'UNRELEASED': import warnings warnings.warn( 'Disable installer modules on request (DEBIAN_KERNEL_DISABLE_INSTALLER set)' ) else: raise RuntimeError( 'Unable to disable installer modules in release build (DEBIAN_KERNEL_DISABLE_INSTALLER set)' ) elif self.config.merge('packages').get('installer', True): # Add udebs using kernel-wedge installer_def_dir = 'debian/installer' installer_arch_dir = os.path.join(installer_def_dir, arch) if os.path.isdir(installer_arch_dir): # If we're going to build signed udebs later, don't actually # generate udebs. Just test that we *can* build, so we find # configuration errors before building linux-signed. test_build = self.config.merge('build', arch).get( 'signed-modules', False) kw_env = os.environ.copy() kw_env['KW_DEFCONFIG_DIR'] = installer_def_dir kw_env['KW_CONFIG_DIR'] = installer_arch_dir kw_proc = subprocess.Popen( ['kernel-wedge', 'gen-control', vars['abiname']], stdout=subprocess.PIPE, env=kw_env) if not isinstance(kw_proc.stdout, io.IOBase): udeb_packages = read_control( io.open(kw_proc.stdout.fileno(), closefd=False)) else: udeb_packages = read_control( io.TextIOWrapper(kw_proc.stdout)) kw_proc.wait() if kw_proc.returncode != 0: raise RuntimeError('kernel-wedge exited with code %d' % kw_proc.returncode) # kernel-wedge currently chokes on Build-Profiles so add it now for package in udeb_packages: package['Build-Profiles'] = '<!stage1>' if not test_build: 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. if udeb_packages: 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), test_build) ])
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'].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'] l = PackageRelationGroup() for i in generators: i = config_entry_relations.get(i, i) l.append(i) a = PackageRelationEntry(i) if a.operator is not None: a.operator = -a.operator image_fields['Breaks'].append(PackageRelationGroup([a])) for item in l: item.arches = [arch] image_fields['Depends'].append(l) bootloaders = config_entry_image.get('bootloaders') if bootloaders: l = PackageRelationGroup() for i in bootloaders: i = config_entry_relations.get(i, i) l.append(i) a = PackageRelationEntry(i) if a.operator is not None: a.operator = -a.operator image_fields['Breaks'].append(PackageRelationGroup([a])) for item in l: item.arches = [arch] image_fields['Suggests'].append(l) 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-modules') 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 merge_packages(packages, packages_own + packages_dummy, arch) tests_control = self.process_package( self.templates['tests-control.main'][0], vars) tests_control['Depends'].append( PackageRelationGroup(image_main['Package'], override_arches=(arch,))) if self.tests_control: self.tests_control['Depends'].extend(tests_control['Depends']) else: self.tests_control = 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' 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: self._substitute_file('image-dbg.lintian-override', vars, 'debian/linux-image-%s%s-dbgsym.lintian-overrides' % (vars['abiname'], vars['localversion']))
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_signed = self.process_packages( self.templates['control.image'], vars) merge_packages(packages, packages_signed, arch) cmds_binary_arch = [] for i in packages_signed: cmds_binary_arch += ["$(MAKE) -f debian/rules.real install-signed " "PACKAGE_NAME='%s' %s" % (i['Package'], makeflags)] makefile.add('binary-arch_%s_%s_%s_real' % (arch, featureset, flavour), cmds=cmds_binary_arch) os.makedirs(self.package_dir + '/usr/share/lintian/overrides', 0o755, exist_ok=True) with open(self.package_dir + '/usr/share/lintian/overrides/%(template)s' % self.vars, 'a') as lintian_overrides: for script_base in ['postinst', 'postrm', 'preinst', 'prerm']: script_name = (self.template_debian_dir + '/linux-image-%s%s.%s' % (vars['abiname'], vars['localversion'], script_base)) self._substitute_file('image.%s' % script_base, vars, script_name) lintian_overrides.write('%s: script-not-executable %s\n' % (self.vars['template'], os.path.relpath(script_name, self.package_dir)))
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): 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 = [] build_signed = config_entry_build.get('signed-code') 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'] # The image meta-packages will depend on signed linux-image # packages where applicable, so should be built from the # signed source packages if do_meta and not build_signed: packages_own.extend( self.process_packages(self.templates["control.image.meta"], vars)) self.substitute_debhelper_config( "image.meta", vars, "linux-image%(localversion)s" % 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']) # The header meta-packages will 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_own.extend( self.process_packages(self.templates["control.headers.meta"], vars)) self.substitute_debhelper_config( 'headers.meta', vars, 'linux-headers%(localversion)s' % vars) 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)) 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)
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) if self.config.merge('packages').get('libc-dev', True): libc_dev = self.templates["control.libc-dev"] merge_packages(packages, self.process_packages(libc_dev, {}), 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_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 = [] makeflags['DO_HEADERS_ALL'] = False 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, {}) else: makeflags['DO_LIBC'] = False 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) else: makeflags['DO_CONFIG'] = False 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]) # For stage1 build profile makefile.add('binary-libc-dev_%s' % arch, ['source_none_real'], ["$(MAKE) -f debian/rules.real install-libc-dev_%s %s" % (arch, makeflags)]) 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)])