OCaml package guidelines (Português)

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-bit
–
CLR
–
CMake
–
Cross
–
DKMS
–
Eclipse
–
Electron
–
Fonte
–
Free Pascal
–
GNOME
–
Go
–
Haskell
–
Java
–
KDE
–
Kernel
–
Lisp
–
Meson
–
MinGW
–
Node.js
–
Nonfree
–
OCaml
–
Perl
–
PHP
–
Python
–
R
–
Ruby
–
Rust
–
Shell
–
VCS
–
Web
–
Wine
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.