示例#1
0
    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])
示例#2
0
    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)
示例#3
0
    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)
                         ])
示例#4
0
    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)
示例#5
0
    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))
示例#6
0
    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)