OCaml package guidelines (Português)
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.