Python

Aplicativos em Python que usam sistemas de compilação suportados, como Meson, CMake ou Autotools, podem ser criados usando o método padrão. No entanto, muitos aplicativos Python usam scripts de instalação personalizados ou espera-se que sejam instalados através do Setuptools e do pip.

Nesses casos, o flatpak-builder fornece o sistema de compilação simple. Em vez de automatizar o processo de compilação, simple aceita um conjunto de strings build-commands, que são executados em sequência.

Por exemplo, o seguinte YAML simplifica bastante a construção do módulo de solicitações populares:

name: requests
buildsystem: simple
build-commands:
  - pip3 install --prefix=/app --no-deps .
sources:
  - type: archive
    url: https://files.pythonhosted.org/packages/source/r/requests/requests-2.18.4.tar.gz
    sha256: 9c443e7324ba5b85070c4a818ade28bfabedf16ea10206da1132edaa6dda237e

Aqui, build-commands é um vetor que contém os comandos necessários para compilar e instalar o módulo. Como pode-se ver, neste caso, pip é executado para fazer isso. Aqui, a opção --prefix=/app é importante, porque, caso contrário, pip tentaria instalar o módulo em /usr/ o que, por causa do /usr/ estar montado como somente leitura dentro do sandbox, falharia.

Observe que --no-deps é usado apenas para a finalidade do exemplo – como o módulo requisições tem suas próprias dependências, a compilação falhará. Se várias dependências forem necessárias, é melhor instalá-las usando o método na seção seguinte.

Compilando várias dependências Python

Mesmo que o exemplo acima seja instalado, ele não funcionará. Isso ocorre porque o módulo requests possui várias dependências que não foram instaladas:

  • certifi

  • chardet

  • idna

  • urllib3

Quatro dependências não são muitas e podem ser instaladas usando o método simple descrito acima. No entanto, qualquer coisa mais complexa do que isso rapidamente se tornaria tediosa.

Nesses casos, flatpak-pip-generator pode ser usado para gerar o manifesto JSON necessário. Este é um script Python que pega um nome de pacote e usa pip para identificar suas dependências, junto com seus URLs e hashes tarball.

Usar flatpak-pip-generator é tão simples quanto executar:

$ python3 flatpak-pip-generator requests

Ou se você tem um arquivo requirements.txt você pode gerar módulos para cada pacote listado:

$ python3 flatpak-pip-generator --requirements-file=requirements.txt

Isso produzirá um arquivo chamado python3-requests.json, contendo o manifesto JSON necessário, que pode ser incluído no arquivo de manifesto do seu aplicativo. Mesmo que seu manifesto use YAML, você ainda pode incluir JSON assim:

modules:
  - python3-requests.json
  # (other modules go here)