OCaml package guidelines (Português)

From ArchWiki
Status de tradução: Esse artigo é uma tradução de OCaml package guidelines. Data da última tradução: 2020-02-23. Você pode ajudar a sincronizar a tradução, se houver alterações na versão em inglês.
Diretrizes de pacotes do Arch

32-bitCLRCMakeCrossDKMSEclipseElectronFonteFree PascalGNOMEGoHaskellJavaKDEKernelLispMesonMinGWNode.jsNonfreeOCamlPerlPHPPythonRRubyRustShellVCSWebWine

Escrita de PKGBUILDs para softwares escritos em OCaml.

Nomenclatura de pacote

Para bibliotecas, use ocaml-nomemodulo. Para aplicativos, use o nome do programa. Em ambos casos, o nome deve ser totalmente minúsculo.

Colocação de arquivos

Bibliotecas

As bibliotecas OCaml devem ser instaladas sob /usr/lib/ocaml. A instalação em /usr/lib/ocaml/site-lib está obsoleto.

As bibliotecas OCaml devem ser instaladas usando ocaml-findlib. ocaml-findlib inclui metadados de biblioteca no pacote que facilita a gerência fr bibliotecas. Esse é um padrão de fato e muitos softwares OCaml agora precisam dele.

ocaml-findlib extrai dados necessários de um arquivo chamado META que deve ser incluído no arquivo de origem. Se este arquivo não estiver incluído, um deve ser obtido do pacote Debian, Ubuntu ou Fedora correspondente, ou criado para o pacote pelo mantenedor. Uma solicitação para incluir o arquivo também deve ser feita para os desenvolvedores upstream do pacote.

A variável OCAMLFIND_DESTDIR deve ser usada ao instalar pacotes com ocaml-findlib. Veja o exemplo de PKGBUILD abaixo para detalhes.

OASIS

Os pacotes OCaml que instalam executáveis usando OASIS ignoram DESTDIR. Essa é uma limitação conhecida do OASIS (issue #493). Uma forma de habilitar funcionalidade do DESTDIR é executar o script configure com o argumento --destdir, dessa forma:

build() {
    cd "${srcdir}/${srcname}-${pkgver}"
    ./configure --prefix /usr --destdir "$pkgdir"

    # build commands
}

Níveis e bytecode OCaml

O OCaml pode executar código em múltiplos "níveis", o nível superior interpreta o Código OCaml sem compilar, o nível de bytecode cria bytecode independente de máquina e o nível nativo cria binários de código de máquina (assim como C/C++).

Ao compilar Pacotes OCaml, você precisa estar ciente de que o processo de compilação está compilando código de máquina nativo, bytecode ou, como em muitos casos, ambos. Isso cria várias situações que podem causar problemas com as opções de pacote e as dependências corretas.

Se o bytecode for produzido, o PKGBUILD deverá conter o seguinte para proteger o bytecode:

options=('!strip')

Se o pacote não contiver bytecode e apenas distribuir um binário, então ocaml não é necessário como uma dependência, mas é claro que é necessário como um makedepends desde que o pacote ocaml fornece o OCaml compilador. Se o pacote contiver código nativo e bytecode, ocaml deve ser uma dependência e um makedepends.

O código OCaml é raramente (ou nunca) distribuído apenas como bytecode e quase sempre incluirá código nativo: o único caso em que usar any como o arch é aconselhável é quando apenas código-fonte não compilado é distribuído, geralmente com uma biblioteca, embora muitas bibliotecas ainda distribuam código nativo.

A moral da história aqui é estar ciente do que você está distribuindo, as chances são de que o seu pacote contenha código nativo de máquina e bytecode.

Exemplo de PKGBUILD usando Dune

Dune é um novo sistema de compilação que está se tornando cada vez mais usado por projetos de OCaml.

Uma coisa a estar ciente é que um único projeto pode criar vários "pacotes" no sentido do OPAM/findlib, cada um com seu próprio diretório em /usr/lib/ocaml/. Veja ocaml-cairo para um exemplo. Para compilações de versão, todos os "pacotes" precisam ser listados explicitamente.

# Contributor: Seu nome <seuemail@domínio.com>
pkgname=ocaml-<nome_do_pacote>
pkgver=4.2
pkgrel=1
license=()
arch=('x86_64')
pkgdesc="Um pacote OCaml"
url=""
depends=('ocaml')
makedepends=('dune')
source=()
options=('!strip')
sha256sums=()

build() {
  cd "${srcdir}/${pkgname}-${pkgver}"
  # A flag "-p" é necessária para compilações de lançamento, veja a página man do Dune. Dune vai reclamar se você esquecer alguns pacotes.
  dune build -p pacote1,pacote1-extensão,pacote2
}

package() {
  cd "${srcdir}/${pkgname}-${pkgver}"
  DESTDIR="${pkgdir}" dune install --prefix "/usr" --libdir "lib/ocaml"
  # Dune instala documentação em /usr/doc, corrija isso.
  install -dm755 "${pkgdir}/usr/share/"
  mv "${pkgdir}/usr/doc" "${pkgdir}/usr/share/"
}

Exemplo de PKGBUILD usando findlib simples

# Contributor: Seu Nome <seuemail@dominio.com.br>

pkgname=ocaml-<nome_pacote>
pkgver=4.2
pkgrel=1
license=()
arch=('i686' 'x86_64')
pkgdesc="An OCaml Package"
url=""
depends=('ocaml')
makedepends=('ocaml-findlib')
source=()
options=('!strip')
md5sums=()

OCAMLFIND_DESTDIR="${pkgdir}$(ocamlfind printconf destdir)"

build() {
  cd "${srcdir}/${pkgname}-${pkgver}"
  mkdir -p "$OCAMLFIND_DESTDIR"
  ./configure --prefix=/usr
  make
}

package() {
  cd "${srcdir}/${pkgname}-${pkgver}"
  env DESTDIR="${pkgdir}" \
    OCAMLFIND_DESTDIR="$OCAMLFIND_DESTDIR" \
    make install
}

Tenha em mente que muitos pacotes OCaml frequentemente precisarão de parâmetros extras para o make e make install. Lembre-se também de remover a opção !strip e alterar a arquitetura se o pacote não produzir bytecode.