Упакуйте снапкрафт пользовательскими файлами .deb

Я пытаюсь упаковать оснастку для программного обеспечения под названием igotu2gpx. Это программное обеспечение qt4 и использует libmarble . Я проверил репозитории (и попробовал использовать виртуальные машины) - Ubuntu 14.04 была последней версией, которая предоставляла libmarble для qt4. После этого пакеты исчезли или были заменены одноименными версиями qt5 (!).

Теперь, чтобы собрать снап (для Ubuntu 18.04), я скачал все необходимое.debs вручную и хочу ссылаться на них прямо из моей оснастки.

Сначала я начал с настраиваемого плагина в дополнительной части. Это работает, но только на этапе сборки. На этапе подготовки я должен ссылаться на эти .debs непосредственно внутри части, которая содержит и создает исходные коды, но для определения дополнительных подходящих источников мне нужно определить плагин, и пространство плагина уже занято qmake плагин. Кроме того, мне понадобится закрепление или аналогичный механизм, потому что при определении PLUGIN_STAGE_SOURCES я должен явно ссылаться на старые пакеты. и build-packages / stage-packages не позволяют явно определять номер версии.

Итак, как я могу сделать что-нибудь простое, например, добавить собственные файлы .deb?

snapcraft.yaml:

name: igotu
base: core18 # the base snap is the execution environment for this snap
version: bzr-227
title: GUI for i-gotU USB GPS travel logger
summary: MobileAction i-gotU USB GPS travel logger
description: |
    MobileAction i-gotU USB GPS travel logger
license: unknown

grade: devel
#confinement: strict
confinement: devmode

apps:
  igotugui:
    command: usr/local/bin/igotugui
    plugs:
    - hardware-observe
    - raw-usb
    - x11
    environment:
      LD_LIBRARY_PATH: $LD_LIBRARY_PATH:$SNAP/usr/local/lib
  igotu2gpx:
    command: usr/local/bin/igotu2gpx
    plugs:
    - hardware-observe
    - raw-usb
    environment:
      LD_LIBRARY_PATH: $LD_LIBRARY_PATH:$SNAP/usr/local/lib

parts:
  app:
    source-type: bzr
    source: lp:igotu2gpx
    # expect to pull a 0.4 version rev. 227
    plugin: qmake
    qt-version: qt4

    build-packages:
      - libqtgui4
      - pkg-config
      - ctags
      - gdb
      - chrpath
      - libboost-all-dev
      - libboost-program-options-dev
      - libusb-dev

    stage-packages:
      # to be cleaned up and marble to be added
      - libqt4-declarative
      - libqt4-opengl
      - libqt4-svg
      - libqt4-xml
      - libqt4-xmlpatterns
      - libqtcore4
      - libqtdbus4
      - libqtgui4
      - libqtwebkit4
      - libxt6
      # [...]
      # the following declarations must point to the .deb files
      - libastro1=4:4.13.0-0ubuntu1
      - libmarblewidget18=4:4.13.0-0ubuntu1
      - marble-data=4:4.13.0-0ubuntu1
      - marble-plugins=4:4.13.0-0ubuntu1

  extradebs:
    plugin: extradebs

    extra-debs:
      - 3rdParty/deb/other/libgps20_3.9-3_amd64.deb
      - 3rdParty/deb/other/libqextserialport1_1.2.0~rc1+git7-g3be3fbf-1_amd64.deb
      - 3rdParty/deb/other/libqtlocation1_1.2.0-3ubuntu5_amd64.deb
      - 3rdParty/deb/other/libquazip0_0.6.2-0ubuntu1_amd64.deb
      - 3rdParty/deb/other/libshp1_1.2.10-7_amd64.deb

      - 3rdParty/deb/marble/libastro1_4:4.13.0-0ubuntu1_amd64.deb
      - 3rdParty/deb/marble/libastro-dev_4:4.13.0-0ubuntu1_amd64.deb
      - 3rdParty/deb/marble/libmarble-dev_4:4.13.0-0ubuntu1_amd64.deb
      - 3rdParty/deb/marble/libmarblewidget18_4:4.13.0-0ubuntu1_amd64.deb
      - 3rdParty/deb/marble/marble-data_4:4.13.0-0ubuntu1_all.deb
      - 3rdParty/deb/marble/marble-plugins_4:4.13.0-0ubuntu1_amd64.deb

    build-packages:
      #- libmarble-dev=4:4.13.0-0ubuntu1 depends on
      - libqtcore4
      - libqtgui4
      - libqt4-dev

      #- libmarblewidget18=4:4.13.0-0ubuntu1 depends on
      - libphonon4
      - libqt4-dbus
      - libqt4-declarative
      - libqt4-network
      - libqt4-script
      - libqt4-svg
      - libqt4-xml
      #- libqtcore4
      #- libqtgui4
      - libqtwebkit4
      - phonon

      #- marble-plugins=4:4.13.0-0ubuntu1 depends on
      #- libphonon4
      #- libqextserialport1
      #- libqt4-declarative
      #- libqt4-network
      #- libqt4-script
      - libqt4-sql
      #- libqt4-svg
      #- libqt4-xml
      #- libqtcore4
      #- libqtgui4
      #- libqtwebkit4
      #- phonon
      - libwlocate0

      #- libgps20 depends on
      - libbluetooth3
      - libusb-1.0-0

plugins / extradebs.py:

import snapcraft
import os
import subprocess
from typing import List
import collections
import logging
from snapcraft.internal import errors

logger = logging.getLogger(__name__)

class ExtraDebs(snapcraft.BasePlugin):

    @classmethod
    def schema(cls):
        schema = super().schema()

        # Add a new property called "my-property"
        schema['properties']['extra-debs'] = {
            "type": "array",
            "uniqueItems": True,
            "items": {"type": "string"},
        }

        # The "my-option" property is now required
        #schema['required'].append('extra-debs')

        return schema

    def pull(self):
        super().pull()

        print ('Start pulling extra debs')
        deb_files = ["%s/../../project/snap/%s" % (self.partdir, file) for file in self.options.extra_debs]
        self._install_extra_debs(deb_files)

    #def build(self):
    #    super().build()
    #    print('Look ma, I built!')

    @classmethod
    def _install_extra_debs(cls, deb_files: List[str]) -> None:
        deb_files.sort()
        logger.info("Installing extra deb files: %s", " ".join(deb_files))
        env = os.environ.copy()
        env.update(
            {
                "DEBIAN_FRONTEND": "noninteractive",
                "DEBCONF_NONINTERACTIVE_SEEN": "true",
                "DEBIAN_PRIORITY": "critical",
            }
        )

        dpkg_command = [
            "sudo",
            "--preserve-env",
            "dpkg",
            "-i",
        ]

        try:
            subprocess.check_call(dpkg_command + deb_files, env=env)
        except subprocess.CalledProcessError:
            raise errors.BuildPackagesNotInstalledError(packages=deb_files)

        package_names = [deb.split("/")[-1].split('_')[0] for deb in deb_files]
        try:
            subprocess.check_call(["sudo", "apt-mark", "auto"] + package_names, env=env)
        except subprocess.CalledProcessError as e:
            logger.warning(
                "Impossible to mark packages as auto-installed: {}".format(e)
            )
0
задан 1 February 2020 в 20:06

1 ответ

Проще всего использовать плагин make и настроить его шаги:

...
parts:
  app:
    after: [extradebs]
    ...
  ...
  extradebs:
    ...
    plugin: make
    override-pull: |
      ...
    override-stage: |
      ...
    override-build: | 
      ...
    override-install: |
      ...
    ...
  ...
...

Ссылка:

0
ответ дан 22 April 2020 в 14:05

Другие вопросы по тегам:

Похожие вопросы: